假设我有以下语法
program = mul
mul = add {"*" add}
add = NUM {"+" NUM}
和以下输入
1 + 2 * 3
现在通常我会假设输入会给出7,因为BIDMAS(首先进行乘法,然后是加法),但是在读取递归下降解析器之后我很困惑这是否会输出
一个。
(1 + 2) * 3 = 9
或B.
1 + (2 * 3) = 7
我希望解析器能够执行B,因为这通常是数学的完成方式,所以我创建的语法是否正确?
答案 0 :(得分:2)
好吧,解析器不会自己做任何事情,它只会生成一个抽象语法树(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" (或任何其他字符),以便在使用解析器/词法分析器时更习惯于非常落后的思维方式。
答案 1 :(得分:1)
我现在发现不,这不是正确的语法。语法应该是
program = add
add = mul {"+" mul}
mul = NUM {"*" NUM}
这样它总是会将乘法加在一起,而不是乘法加法。