Compiler construction 编译器:如何定义这种语法?

Compiler construction 编译器:如何定义这种语法?,compiler-construction,compilation,computer-science,computer-architecture,Compiler Construction,Compilation,Computer Science,Computer Architecture,我必须为我正在创建的某些编译器编写语法: 二进制运算符&&和| |和一元运算符#和*的方式如下: 一) 优先于&& 二) &&与左侧关联:a&&b&&c表示((a&&b)&&c) 三) |与右侧关联 四) 一元运算符的优先级与二元运算符的优先级相同,且多于二元运算符 我是这样想的: E -> E || T | E && T | T T -> T # F | T * F F -> (E) | Numbers Numbers -> 0 | 1 | 2 | 3

我必须为我正在创建的某些编译器编写语法: 二进制运算符
&&
| |
和一元运算符
#
*
的方式如下:

一) 优先于
&&

二)
&&
与左侧关联:a&&b&&c表示((a&&b)&&c)
三)
|
与右侧关联
四) 一元运算符的优先级与二元运算符的优先级相同,且多于二元运算符

我是这样想的:

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 -> 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

数字
本身可以用正则表达式来表示,例如
'[1-9][0-9]*'

语法是LL吗?LR?甚至是无上下文的?这是大学里的一个项目,我和我的教授一起工作,他把这个给我研究,我开始学习编译器。非常接近,但看起来模棱两可。。。这怎么会让| |优先于&&@nemo,对不起,
|&
优先于
&&
太奇怪了,我是用另一种方式写的!修好了,没有。您正在添加原始表达式中不存在的
。您所做的是以您喜欢的方式生成解析树,而不是按照它的方式生成。Valter,您应该知道解析树最后给出的是相同的表达式,而不是括号中的内容。通过树的形状,您将了解首先计算的内容。@Shahbaz,我重新制作了第二个案例,并创建了另一个案例:
N -> '(' E ')' | number