1

現在、Text.Parsec.Exprモジュールを使用して、スクリプト言語のサブセットを解析しています。

基本的に、この言語には2種類のコマンドがあります。フォームの割り当てとフォーム$var = exprのコマンド$var = $array[$index]です。もちろん他のコマンドもありますが、これで問題を説明できます。

これを表すタイプCommandを、対応するパーサーとともに作成しました。ここexprで、割り当てはParsecのによって処理されbuildExpressionParserます。

さて、問題。最初に解析コード:

main = case parse p "" "$c = $a[$b]" of
          Left err -> putStrLn . show $ err
          Right r  -> putStrLn . show $ r
    where p = (try assignment <|> command) <* eof -- (1)

コード全体(50行)がここに貼り付けられます:リンク(parsecがインストールされている場合はコンパイルする必要があります)

assignment問題は、以前にあったとしても、正常に解析されないため、解析が失敗することtryです。解析順序(try command <|> assignment)を逆にすると問題は解決しますが、私の場合は不可能です。

もちろん、私は問題をさらに突き止めようとしましたが、問題は式パーサー(build by buildExpressionParser)であるように見えます。これは、と言うと解析が成功するためexpr = fail ""です。ただし、Parsecのソースには、この動作を説明するものは何も見つかりません。

4

1 に答える 1

3

実際にここで消費することに成功するassigment ため、パーサーは失敗します$c = $a(プレーンで試してくださいwhere p = assignment)。次に、(またはfromeofの残りの部分)があるはずなので、エラーが発生します。'assignment''引数が(のように)である場合、'command'の開始は'assignment'と同じように見えます。なぜ元に戻せないのかわかりませんが、この特定の例を機能させる別の方法は次のとおりです。exprassigmentvar$c = $acommandassignment

main = case parse p "" "$c = $a[$b]" of
      Left err -> putStrLn . show $ err
      Right r  -> putStrLn . show $ r
   where p = try (assignment <* eof) <|> (command <* eof)
于 2011-09-09T04:19:22.820 に答える