2011-09-08 8 views
1

現在、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を消費し、ここで成功しないので

答えて

3

あなたパーサは失敗します。次に、eof(またはexprの残りの部分はassigment)のエラーが発生します。あなたの 'コマンド'の先頭は、 'assignment'の引数がちょうどvar$c = $aのようなもの)の場合のあなたの '割り当て'と同じであるようです。 はわからないなぜあなたはcommandassignmentが、この特定の例の作品のようになりますようにする別の方法を元に戻すことはできません。

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) 
+0

おかげで、それはそれです。 – bzn

関連する問題