【发布时间】:2018-11-29 10:52:25
【问题描述】:
我是 Bison 的新手。我收到减少/减少冲突错误,但没有得到它发生的地方。错误消息是“冲突:1 减少/减少”。这是我的语法规则。
%token INT FLOAT CHAR EXIT V_MAIN BS BE NL EQU CM ADD SUB MUL DIV LT GT LP RP PRINT IF ELSE THN HH
%token <VarNm> V_NM
%token <num> NUMBER
%token <flt> R_NUM
%type <num> EXP TERM FACTOR CON STATEMENTS
%type <VarNm> X
%nonassoc THN
%nonassoc ELSE
%start STRT
%left LT GT
%left PLUS MINUS
%left MULT DIV
%%
STRT : V_MAIN BS CODE BE {printf("Compilation complete. :)\n");}
| EXIT {exit(EXIT_SUCCESS);}
;
CODE : /* empty */
| CODE STATEMENTS NL {printf("Statements complete\n");}
| CODE DECLARATION NL {printf("Declaration complete\n");}
| STMNT
;
DECLARATION : TYPE V {printf("D\n");}
;
TYPE : INT {printf("I\n");}
| FLOAT {printf("F\n");}
| CHAR
;
V : V CM V_NM {AddNewVar($3);printf("V\n");}
| V_NM {AddNewVar($1);printf("Vn %s\n",$1);}
| /* empty */ {printf("E\n");}
;
STATEMENTS : { $$ = 0; }
| EXP EQU X {AsgnVal($3,$1);}
| PRINT EXP {printf("Output: %d\n",$2);}
| EXP { $$ = $1 ;}
;
STMNT : MIF NL
| UIF NL
;
MIF : IF CON THN HH MIF HH ELSE HH MIF HH {printf("MIF1\n");}
| CODE STATEMENTS NL
;
UIF : IF CON THN HH STMNT HH {printf("UIF1\n");}
| IF CON THN HH MIF HH ELSE HH UIF HH {printf("UIF2\n");}
;
CON : EXP GT EXP { $$ = $1 > $3? 1: 0 ; }
| EXP LT EXP { $$ = $1 < $3? 1: 0 ; }
| EXP EQU EXP { $$ = $1 == $3? 1: 0 ; }
;
X : V_NM { $$=$1;CheckIfFound($1);}
;
EXP : TERM
| EXP ADD TERM { $$ = $1 + $3; }
| EXP SUB TERM { $$ = $1 - $3; }
;
TERM : TERM MUL FACTOR { $$ = $1 * $3; }
| TERM DIV FACTOR { if($3){$$ = $1 / $3;}
else {printf("Division by zero\n");}
}
| FACTOR { $$ = $1; }
| X { $$=VarVal($1); }
;
FACTOR : NUMBER { $$ = $1; }
| LP EXP RP { $$ = $2; }
;
当我插入 IF/ELSE 的语法时,冲突错误开始了。 排除那部分我的代码工作得很好。我还想知道是否有任何方法可以使用 command 检测这种冲突发生在哪里。
【问题讨论】:
标签: bison flex-lexer