这是与YACC一起实施的语法的一部分。
%right NOT
%left TIME DIV REALDIV MOD
%left LT LE
%left GT GE
%left EQ NE
%left AND OR
%right ASSIGN
%%
expression: expression EQ expression {};
|expression PLUS expression {};
| expression TIME expression{};
| PLUS expression {};
| variable PLUS PLUS {};
| variable {};
它有9班减少冲突。
如何在不改变语言的情况下修复冲突。(用这种语法生成的字符串)
答案 0 :(得分:1)
如上所述,语法含糊不清,因为无法将运算符++
与+
的两个实例区分开来。
通常情况下,使用" maximal munch"在词法扫描程序中解决了这个问题。规则,以便表达式a+++b
将分解为词汇项ID PLUSPLUS PLUS ID
,从而产生解析(a++) + b
。在这种情况下,如果用户真的想要a + (+ (+b)))
并且不想使用括号,他们可以简单地用空格分割标记,写a+ + +b
。 (在您的语法中,<=
显然是作为单个词法标记进行扫描,而不是标记<
和=
,因此输入a < = b
和a <= b
结果在不同的解析中 - 其中一个是无效的。这或多或少都是预期的。因此+ +
应该是增量运算符++
的允许拼写没有明显的原因。 。)
进行更改会略微改变语言。在您的语法中,a++b
可以解释为a+(+b)
;如果++
被词法扫描为单个标记,则生成的表达式将是语法错误。如果这是一个问题可以解决,但我不认为产生的复杂性是值得的。