2

我必须为我正在创建的一些编译器做一个语法:二元运算符&&||一元运算符#,并且*以它们的方式:

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

会不会错?有任何想法吗 ?

4

1 回答 1

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

于 2012-09-04T13:53:06.110 回答