私は小さな正規表現パーサーを実装してParsecを学習しようとしています。 >スター - - > exprのParsecを使って正規表現を解析する
expr = try star
<|> try litE
<|> lit
litE = do c <- noneOf "*"
rest <- expr
return (c : rest)
lit = do c <- noneOf "*"
return [c]
star = do content <- expr
char '*'
return (content ++ "*")
いくつかの無限ループがここにありますが(例えば式expr:私のようにHaskellでこれを実装しようとした
EXP : EXP *
| LIT EXP
| LIT
:BNFでは、私の文法は何かのように見えますトークンを消費することなく)、パーサーループを永久にループさせます。 star
の本質は、最後に必須のトークンを消費するためです。
どのような考えですか?
うわー。それはとても簡単です、それはほとんど浮気のように感じます。 – Xodarap
'[Term] - > Term'の代わりに' Sequence、Choice :: Term - > Term-> Term'を使ったほうがずっと簡単でしたが、正確には一致しないASTを扱う方法を示していると思います解析ツリー... – pat