让我说我有以下语法
program = mul
mul = add {"*" add}
add = NUM {"+" NUM}和下面的输入
1 + 2 * 3通常情况下,我会假设输入将得到7,因为BIDMAS (先做乘法,然后再加法),但是在阅读递归下降解析器之后,我就不知道它是否会输出。
一个。
(1 + 2) * 3 = 9或B.
1 + (2 * 3) = 7我希望解析器做B,因为这是数学通常是如何完成的,所以我创建的语法正确吗?
发布于 2017-04-11 16:35:41
好吧,解析器不会自己做任何事情,它只会产生一个抽象语法树(AST)。我相信要完全实现运算的数学顺序,你需要稍微扩展语法。在这个简短的例子中,我希望它(除非我误解了这个特定的语法)抛出一个错误,因为您定义了两个二进制操作并传递了三个数字。1 + 2 * 3 + 4似乎是更明智的测试输入,是的,它将完全错误地工作(它会告诉您有一个由两个加法组成的表达式):mul(add(1,2),add(3,4))
倒排的例子可能会奏效:
program = add
mul = NUM {"*" NUM}
add = mul {"+" mul}我希望它能将1 * 2 + 3 * 4解析为add(mul(1,2),mul(3,4))。但是,正如您所看到的,我不得不更改输入,再次声明:您期望输入是非常严格的。
尝试使用一些抽象语法--创造"p“和"q”(或任何其他字符)的特定模式,以便更好地适应与解析器/词汇者合作时所需的相当落后的思维方式。
发布于 2017-04-11 16:32:39
我现在发现不,这不是正确的语法。语法应该是
program = add
add = mul {"+" mul}
mul = NUM {"*" NUM}这样,它总是把乘数相加在一起,而不是相乘。
https://stackoverflow.com/questions/43351411
复制相似问题