2016-10-30 17 views
-4

//レックスファイル:for.l指定されたコードの競合を修正していますか? "25シフト/競合を減らす[-Wconflicts-SR]"

alpha [A-Za-z] 
digit [0-9] 
%% 
[\t \n] 
for   return FOR; 
{digit}+ return NUM; 
{alpha}({alpha}|{digit})* return ID; 
"<="   return LE; 
">="   return GE; 
"=="   return EQ; 
"!="   return NE; 
"||"   return OR; 
"&&"   return AND; 
.   return yytext[0]; 
%% 

// Yaccのファイル:

%{ 
#include<stdio.h> 
#include<stdlib.h> 
%} 
%token ID NUM FOR LE GE EQ NE OR AND 
%right "=" 
%left OR AND 
%left '>' '<' LE GE EQ NE 
%left '+' '-' 
%left '*' '/' 
%right UMINUS 
%left '!' 
%% 
S   : ST {printf("Input accepted\n"); exit(0);} 
ST  : FOR '(' E ';' E2 ';' E ')' DEF 
; 
DEF : '{' BODY '}' 
| E';' 
| ST 
| 
; 
BODY : BODY BODY 
| E ';'   
| ST 
|    
; 
E  : ID '=' E 
| E '+' E 
| E '-' E 
| E '*' E 
| E '/' E 
| E '<' E 
| E '>' E 
| E LE E 
| E GE E 
| E EQ E 
| E NE E 
| E OR E 
| E AND E 
| E '+' '+' 
| E '-' '-' 
| ID  
| NUM 
; 
E2  : E'<'E 
| E'>'E 
| E LE E 
| E GE E 
| E EQ E 
| E NE E 
| E OR E 
| E AND E 
;  
%% 
#include "lex.yy.c" 
main() 
{ 
printf("Enter the expression:\n"); 
yyparse(); 
}   

for.y私はそれを実行し、表示:

warning: 25 shift/reduce conflicts [-Wconflicts-sr] 
warning: 4 reduce/reduce conflicts [-Wconflicts-rr] 

どうすれば修正できますか?

のコンパイル方法:

$ lex c.l 
$ yacc c.y 
+0

コードを編集して問題の詳細を特定してください。お手数ではありがとうございます。 – Clay

+0

これらの競合を解決してください。 –

+1

このSOの投稿を見てください:http://stackoverflow.com/questions/26968665/bison-shift-reduce-conflict-tiger-compiler – Clay

答えて

1

あなたの文法を持つ様々な問題があります。ここで最も明白なものは以下のとおりです。

  1. あなたはDEFが空であることを可能にします。それは

    for (i=0;i<1;i++) for (j=0;j<1;j++) 
    

    が空の体を持つ2つのfor文、またはそのボディ(ボディ空である)別のfor文があるfor文であることを意味します。したがって、空の生産は文法をあいまいにします。

  2. BODY: BODY BODYは指数関数的に曖昧であり、優先順位宣言は補償できません。問題は、あなたがBODYの空の生産を(また不要な)生産しているという事実によって悪化します。

  3. E '+' '+'i++で2 +は別々のトークン(と、確かに、あなたのフレックスの定義は、例えば、単一トーメンとして=<をunlimeを++を認識しないであることを意味している。ということあなたの文法がi + +を有効なポストインクリメントとみなすことを意味します。これは意図的なものかもしれませんが、確かに私が知っている言語とは異なります。 :3*j++3*(j++)であり、ではありません。。 (事後減分演算子についても同様です。)

関連する問題