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。