1

这里冲突的例子是C编译器的一部分:移位/减少对C语言编译器

Exp  : 
     INTNUMBER      { $$ = $1; } 
     | lvalue      { $$ = $1; } 
     | REALNUMBER      { $$ = $1; } 
     | CHARVALUE       { $$ = $1; } 
     | TRUE       { $$ = $1; } 
     | FALSE       { $$ = $1; } 
     | Exp '+' Exp      { $$ = $1 + $3; } 
     | Exp '*' Exp      { $$ = $1 * $3; } 
     | Exp '/' Exp      { $$ = $1/$3; } 
     | Exp '-' Exp      { $$ = $1 - $3; } 
     | Exp '%' Exp      { $$ = $1 % $3; } 
     | Exp AND Exp       { $$ = $1 && $3; } 
     | Exp OR Exp     { $$ = $1 || $3; } 
     | Exp LEQ Exp     { $$ = $1 <= $3; } 
     | Exp GEQ Exp     { $$ = $1 >= $3; } 
     | Exp EQ Exp     { $$ = $1 == $3; } 
     | Exp NEQ Exp     { $$ = $1 != $3; } 
     | Exp GE Exp      { $$ = $1 > $3; } 
     | Exp LE Exp      { $$ = $1 < $3; } 
     | '-' Exp %prec UMINUS     { $$ = -1 * $2; } 
     | STRING      { $$ = $1; } 
     | '('Exp')'       { $$ = $2; }  
     | lvalue '=' Exp     { $1 = $3; } 
     | ID'('ExpList')'     {printf("Exp");} 
     ; 


IDD  : 
     ID       { printf("IDD"); } 
     | IDD '[' Exp ']'     {printf("IDD");} 
     ; 

ExpList 
     :         { printf("ExpList"); } 
     ExpPlus       {printf("ExpList");} 
     |  
     ; 

ExpPlus : 
     Exp        { printf("Exp\n"); } 
     | Exp ',' ExpPlus     {printf("ExpPlus");} 
     ;   

,其中,ID是一个终端(即,C中的ID可以与开始_或[A- 。ZA-Z] 在解析该代码使用-v标志野牛,我得到了一个转变/减少冲突如下:

52 IDD: ID . 
    78 Exp: ID . '(' ExpList ')' 

    '(' shift, and go to state 56 

    '('  [reduce using rule 52 (IDD)] 
    $default reduce using rule 52 (IDD) 

我已经解决了所有的移进/归约,我遇到迄今冲突。但我无法理解这个问题应该如何解决。

谢谢

+0

为了回答这个问题,您需要显示更多的语法。您所展示的摘录甚至没有指出在什么情况下可能会使用“IDD”;此外,冲突最有可能是使用“Exp”的环境的结果,这也是不可见的。 – rici

回答

0

冲突本身发生因为,在看到与超前记号括号(ID,解析器既可以做一个转变,并开始对ID (ExpList)函数调用语法工作,或减少IDIDD并将(保留在令牌流中。

这是通常与典型LALR语法看出来处理同样的问题:

if (exp1) 
     if (exp2) 
     stmt; 
/**/else /* which "if" does this "else" match?! */ 

其中,在这一点(与else在先行)解析器可以转移到其将结合在一个新的状态else(深嵌套)if,或减少if (exp2) stmt;到与第一if去一份声明,离开else成为首先if else部分。

Yacc-like语法分析器在遇到转换/减少冲突时总是倾向于转换。在这种情况下,这是我们想要的if,它也是你想要的语法片段。所以你不需要要求来处理它。 (但是,我不能说,如果你的语法的其余部分是可以的,我只对这一点做评论。总的来说,移位/减少冲突“按你期望的方式工作”,并且它减少/减少冲突有问题。)

另请参阅Chris Dodd's answerReforming the grammar to remove shift reduce conflict in if-then-else

0

没有足够的信息来解决您的问题您没有足够的代码来确定您正在尝试做什么。特别是,我们什么都没有,显示了IDD和EXP终结符号之间的关系

但是,你有

IDD:ID

经验:ID'( 'ExpList')'

即造成

SomeID 

在输入流中是IDD或EXP。