Parsec:预测解析

312*_*k1t 3 haskell parsec ll-grammar

我只有一些与haskell的技能,我需要帮助如何使用parsec实现预测解析(LL*).

我有无上下文语法:

<a> ::= identifier | identifier '(' <args> ')'
Run Code Online (Sandbox Code Playgroud)

基于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)
    }
Run Code Online (Sandbox Code Playgroud)

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

只在标识符"a"上调用它会抛出:

parse error at (line 1, column 2):
unexpected end of input
expecting letter or digit or "("
Run Code Online (Sandbox Code Playgroud)

Cap*_*liC 6

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

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