我只有一些 Haskell 技能,我需要帮助如何使用 parsec 实现预测性解析 (LL*)。

我有上下文无关语法:

<a> ::= identifier | identifier '(' <args> ')'

基于 http://research.microsoft.com/en-us/um/people/daan/download/parsec/parsec.pdf(章节预测解析器),我编写了以下代码:
term =  do{ x <- m_identifier
    ; try( char '(' )
    ; b <- argsparser
    ; char ')'
    ; return (FncCall x b)
    }
<|> do { x <- m_identifier
    ; return (VarId x)
    }

我希望这段代码尝试匹配 '(' ,如果不是,解析器将继续并仅匹配标识符。此代码仅适用于匹配标识符 '(' args ')'。

仅在标识符“a”上调用它会抛出:
parse error at (line 1, column 2):
unexpected end of input
expecting letter or digit or "("

最佳答案

所有替代部分都应该在 下尝试 ,我认为:

term =  try( do{ x <- m_identifier
    ; char '('
    ; b <- argsparser
    ; char ')'
    ; return (FncCall x b)
    } )
<|> do { x <- m_identifier
    ; return (VarId x)
    }

关于haskell - Parsec:预测解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9615493/

10-13 09:11