编译器:如何定义这个语法?

时间:2012-09-04 13:22:28

标签: compiler-construction compilation computer-science computer-architecture

我必须为我正在创建的某些编译器执行语法: 二元运算符&&||以及一元运算符#*以这样的方式:

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

会不会错? 有什么想法吗?

1 个答案:

答案 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]*'