現在、Text.Parsec.Exprモジュールを使用してスクリプト言語のサブセットを解析しています。Parsecエラー - tryが機能しないようです。
基本的に、この言語には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行)がここに貼り付けられます:Link(あなたはパーセクインストールした場合はコンパイルする必要があります)
assignment
「はdoesnのため、問題は、その構文解析に失敗した、あります前にtry
があるにもかかわらず、正常に解析されません。解析の順序を逆にすると(try command <|> assignment
)、問題は解決しますが、私の場合は不可能です。
もちろん私は問題をさらに見つけようとしましたが、問題は表現式パーサー(buildExpressionParser
でビルド)です。なぜなら、私がexpr = fail ""
と言うと解析が成功するからです。しかし、私はこの動作を説明するParsecソースで何も見つけることができません。実際にassigment
はが(プレーンwhere p = assignment
でそれを試してみてください)$c = $a
を消費し、ここで成功しないので
おかげで、それはそれです。 – bzn