3

私は 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 "("
4

1 に答える 1

6

すべての代替部分はtryの下にある必要があると思います:

term =  try( do{ x <- m_identifier
    ; char '('
    ; b <- argsparser
    ; char ')'
    ; return (FncCall x b)
    } )
<|> do { x <- m_identifier
    ; return (VarId x)
    }
于 2012-03-08T10:02:40.080 に答える