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