编程语言语法

时间:2017-04-11 16:24:08

标签: parsing grammar abstract-syntax-tree

假设我有以下语法

program = mul
mul = add {"*" add}
add = NUM {"+" NUM}

和以下输入

1 + 2 * 3

现在通常我会假设输入会给出7,因为BIDMAS(首先进行乘法,然后是加法),但是在读取递归下降解析器之后我很困惑这是否会输出

一个。

(1 + 2) * 3 = 9

或B.

1 + (2 * 3) = 7

我希望解析器能够执行B,因为这通常是数学的完成方式,所以我创建的语法是否正确?

2 个答案:

答案 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}

这样它总是会将乘法加在一起,而不是乘法加法。