0

現在、単純なプログラミング言語のパーサーを作成しています。そこに到達していますが、「i == 0 AND j == 0」などのブール論理ステートメントを解析できません。私が返すのは「場合に備えて網羅的でないパターン」だけです

ブール式を単独で解析すると、「i == 0」のようにうまく動作します。「i == 0 a」もブール文を返しますが、「i == 0 AND」は何も返さないことに注意してください。

誰でも助けてもらえますか?

上記は run parseBoolean "i == 0" などの入力に対して正しく機能しますが、

4

1 に答える 1

2

@hammar が指摘してText.Parsec.Exprいるように、この種のものには使用する必要があります。しかし、これは宿題なので、一生懸命やる必要があるかもしれません。

問題は にparseArithmeticあります。演算子になることを許可しますが、anyCharcase ステートメントでは、、、、、、および のみを許可します。がを解析しようとすると、最初の を演算子として使用しますが、2 番目の から を解析できず、モナドで失敗し、case ステートメントに到達する前にバックトラックします。ただし、 を解析しようとすると、その部分が取得されますが、は演算子であり、は変数の名前であるという算術式があると見なされるため、大文字と小文字が区別され、ブームになります。+-*/%^parseArithmetici == 0=intExp2=i == 0 AND j == 0i ==0 A NDAND

ちなみに、パーサーを使用して文字列を照合し、次に case ステートメントを使用してもう一度照合する代わりに、パーサーに文字列の代わりに関数を返させ、関数を直接適用することができます。

 parseOp :: String -> a -> Parser a
 parseOp op a = string op >> spaces >> return a

 parseLogic :: Parser BoolExp 
 parseLogic = do 
    boolExp1 <- parseBoolExp 
    spaces 
    operator <- choice [ try $ parseOp "AND" And
                       , parseOp "OR" Or
                       , parseOp "XOR" XOr
                       ]
    boolExp2 <- parseBoolExp
    return $ operator boolExp1 boolExp2


parseBoolean :: Parser BoolExp 
parseBoolean = do       
   intExp1 <- parseIntExp 
   spaces 
   operator <- choice [ try $ parseOp "==" Main.EQ
                      , parseOp "=>" GTorEQ
                      , parseOp "<=" LTorEQ 
                      ]
   intExp2 <- parseIntExp
   return $ operator intExp1 intExp2
于 2012-05-30T16:28:29.690 に答える