我正在为一种简单的编程语言编写解析器。它到了那里但是我无法解析布尔逻辑语句,例如“i == 0 AND j == 0”。我所得到的只是“非详尽的模式”
当我自己解析一个布尔表达式时,它工作得很好,例如“我== 0”。注意“i == 0 a”也会返回一个布尔语句,但“i == 0 AND”不会返回任何内容。
有人可以帮忙吗?
虽然上述方法适用于输入,例如run parseBoolean“i == 0”
答案 0 :(得分:2)
正如@hammar指出的那样,你应该使用Text.Parsec.Expr
来做这种事情。但是,既然这是作业,也许你必须这么做!
问题出在parseArithmetic
,您允许anyChar
成为运算符,但在case语句中,您只允许+
,-
,{{ 1}},*
,/
和%
。当^
尝试解析parseArithmetic
时,它会使用第一个i == 0
作为运算符,但无法从第二个=
解析intExp2
,并且失败在进入案例陈述之前,在monad和回溯中。但是,当您尝试解析=
时,它会获得i == 0 AND j == 0
部分,但之后它会认为存在i ==
的算术表达式,其中0 A ND
是运算符,并且A
是某个变量的名称,因此它适用于案例,繁荣。
顺便说一句,不是使用解析器匹配字符串,然后使用case语句再次匹配它,您可以让解析器返回函数而不是字符串,然后直接应用函数:
ND