我必须为我正在创建的某些编译器编写语法:
二元运算符 &&
和 ||
以及一元运算符 #
和 *
的方式是:
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
会不会搞错了? 有什么想法吗?
最佳答案
对于像这样的简单表达式,您始终可以从最低优先级开始。
因此,您希望拥有一堆 &&
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
最后,最先例的是括号,这就好像你有一个牢不可破的 token 。除此之外,括号内可以有任何表达式:
N -> '(' E ')' | number
数字
本身可以用正则表达式表示,例如'[1-9][0-9]*'
关于compiler-construction - 编译器: How to define this grammar?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264411/