这是我的语言的算术表达式: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
在我的语言中,我无法编写算术运算的语法。上面的语法需要修改吗?或者我需要写一个全新的语法?
答案 0 :(得分:-1)
我设法通过分析代码中每个产品的执行来解决这个问题。令我惊讶的是,我忘了在<expr>
中添加<factor>
作品。稍微改变我的代码移动某些条件,我能够解析上面的示例表达式。这是我语言中算术表达式的语法:
<expr> := ((ADD|SUB) <term> <term>)* | <term>
<term> := ((MUL|DIV|MOD) <factor> <factor>)* | <factor>
<factor> := INTEGER | <expr>
<expr>
中的<factor>
作品可以进行多项操作,因为它会回到开始时解析下一个操作。