現在、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のソースには、この動作を説明するものは何も見つかりません。