转移减少冲突

时间:2015-05-07 10:58:14

标签: grammar yacc

这是与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班减少冲突。 如何在不改变语言的情况下修复冲突。(用这种语法生成的字符串)

1 个答案:

答案 0 :(得分:1)

如上所述,语法含糊不清,因为无法将运算符+++的两个实例区分开来。

通常情况下,使用&#34; maximal munch&#34;在词法扫描程序中解决了这个问题。规则,以便表达式a+++b将分解为词汇项ID PLUSPLUS PLUS ID,从而产生解析(a++) + b。在这种情况下,如果用户真的想要a + (+ (+b)))并且不想使用括号,他们可以简单地用空格分割标记,写a+ + +b。 (在您的语法中,<=显然是作为单个词法标记进行扫描,而不是标记<=,因此输入a < = ba <= b结果在不同的解析中 - 其中一个是无效的。这或多或少都是预期的。因此+ +应该是增量运算符++的允许拼写没有明显的原因。 。)

进行更改会略微改变语言。在您的语法中,a++b可以解释为a+(+b);如果++被词法扫描为单个标记,则生成的表达式将是语法错误。如果这是一个问题可以解决,但我不认为产生的复杂性是值得的。