FParsec kullanarak standart basit türleri (lambda hesabı için) ayrıştırmaya çalışıyorum, ancak Lex/Yacc stilinden FParsec'te kullanılanlara, özellikle de özyinel tanımlara. Ben ayrıştırmak çalışıyorum türlerindenFParsec'te basit türleri ayrıştırma
örnekleri şunlardır:
- o o -> o
- (o -> o -> o) -> o
Ve işte benim girişimim:
type SType =
| Atom
| Arrow of SType * SType
let ws = spaces
let stype, styperef = createParserForwardedToRef()
let atom = pchar 'o' .>> ws |>> (fun _ -> Atom)
let arrow = pipe2 (stype .>> (pstring "->" .>> ws))
stype
(fun t1 t2 -> Arrow (t1,t2))
let arr = parse {
let! t1 = stype
do! ws
let! _ = pstring "->"
let! t2 = stype
do! ws
return Arrow (t1,t2)
}
styperef := choice [ pchar '(' >>. stype .>> pchar ')';
arr;
atom ]
let _ = run stype "o -> o"`
Bunu etkileşime yüklediğimde ve son satır bir yığın taşmasına neden olur (bu günlerde arama yapmak ironik olarak oldukça zordur). Yinelemeli referanslar olduğu düşünüldüğünde nedenini hayal edebiliyorum, fakat stype
numaralı telefondaki ilk (parantezli) seçimi takiben bir simge belirtisinin önleneceğini düşünürdüm. Bu nedenle, stype
'u seçen arr
'u seçmem gerektiğini düşünüyorum. Ama bu döngü nasıl önlenir?
Kütüphanenin deyimsel kullanımıyla ilgili yorumların yanı sıra denenen çözümüme yönelik düzeltmelerle ilgileniyorum.
istediğiniz istiyorum:: Senin durumunda örneğin
sepBy1
bağdaştırıcının kullanabilirsiniz http://stackoverflow.com/questions/6186230/recursive-grammars-in-fparsec –sayesinde okudum Bu soru/cevap, ama sorunun cevabını nasıl yerine getireceğimi pek göremiyorum. Yine de başka bir bakışım olacak. – rneatherway