我正在尝试通过实现一个小的正则表达式解析器来学习Parsec.在BNF中,我的语法看起来像:
EXP : EXP *
| LIT EXP
| LIT
Run Code Online (Sandbox Code Playgroud)
我试图在Haskell中实现这个:
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 ++ "*")
Run Code Online (Sandbox Code Playgroud)
这里有一些无限循环(例如expr - > star - > expr,不消耗任何标记),这使得解析器永远循环.我不确定如何修复它,因为它的本质star是它最终会消耗它的强制令牌.
有什么想法吗?