我必须为我正在创建的某些编译器执行语法:
二元运算符&&
和||
以及一元运算符#
和*
以这样的方式:
I)||
优先于&&
II)&&
与左边相关联:a&& b&& c表示((a&& b)&& c)
III)||
与右侧相关联
IV)一元运算符具有相同的优先级,而不仅仅是二元运算符
我在想这样的事情:
E -> E || T | E && T | T
T -> T # F | T * F
F -> (E) | Numbers
Numbers -> 0 | 1 | 2 | 3 | ... | 9
会不会错? 有什么想法吗?
答案 0 :(得分:2)
对于像这样的简单表达式,您总是可以从最小优先级开始。
所以你想拥有一堆&&
ed表达式,每个表达式都是||
ed同义词前导一元运算符的表达式。
在写下来之前,请看看这两条规则:
E -> E + T
和
E -> T + E
第一条规则使+
左关联,而第二条规则使其正确关联(想一想)。因此,您希望&&
保持关联状态,||
为正确关联:
E -> E '&&' T | T # left associative &&
T -> F '||' T | F # right associative ||
一元运算符的规则相当简单:
F -> '#' F | '*' F | N # apply unary operators without precedence from right to left
最后,最先例是括号,就好像你有一个牢不可破的令牌。除了在括号内,你可以有任何表达式:
N -> '(' E ')' | number
number
本身可以用正则表达式表示,例如'[1-9][0-9]*'