你如何为这个算术表达式编写语法?

时间:2016-10-30 09:36:39

标签: parsing syntax grammar interpreter

这是我的语言的算术表达式:ADD 100 MUL 5 DIV 10 SUB 7 MOD 10 4

ADD =加法,SUB =减法,MUL =乘法,DIV =除法,MOD =模数。

上面的表达式也可以重新标记为标准100 + (5 * (10 / (7 - (10 % 4)))),括号中包含用于标记操作顺序的括号。

这与标准完全不同,因为评估从最正确的操作开始,即MOD 10 4,然后其结果用于评估下一个操作,即SUB 7 2,其中2是模运算的结果。该语法不需要括号。

我已经掌握了来自https://ruslanspivak.com/lsbasi-part6/的标准符号的语法,这里是:

 <expr> := <term> ((ADD|SUB) <term>)*
 <term> := <factor> ((MUL|DIV|MOD) <factor>)*
 <factor> := integer

在我的语言中,我无法编写算术运算的语法。上面的语法需要修改吗?或者我需要写一个全新的语法?

1 个答案:

答案 0 :(得分:-1)

我设法通过分析代码中每个产品的执行来解决这个问题。令我惊讶的是,我忘了在<expr>中添加<factor>作品。稍微改变我的代码移动某些条件,我能够解析上面的示例表达式。这是我语言中算术表达式的语法:

<expr> := ((ADD|SUB) <term> <term>)* | <term>
<term> := ((MUL|DIV|MOD) <factor> <factor>)* | <factor>
<factor> := INTEGER | <expr>

<expr>中的<factor>作品可以进行多项操作,因为它会回到开始时解析下一个操作。