【发布时间】:2016-12-16 16:35:02
【问题描述】:
我有以下语法(Yacc),它是一个简单的 C 编译器的开始,我从一个简单的 if 语句开始:
S : E
;
E : COND_NO_ELSE
;
COND_NO_ELSE : IF BOOL_EXP BLOCK
;
BLOCK : LC EXP RC
BOOL_EXP : LP EXP BOOL_OP EXP RP
;
BOOL_OP : LT_OP
| GT_OP
| LE_OP
| GE_OP
| EQ_OP
| NE_OP
;
MATH_OP : PLUS_OP
;
EXP : IDENTIFIER
| EXP MATH_OP EXP
;
以下是相关规则的词法分析器扫描器:
"=" { yylval.string = strdup(yytext); return ASSIGN;}
"+" { yylval.string = strdup(yytext); return PLUS_OP;}
"-" { yylval.string = strdup(yytext); return MINUS_OP;}
"*" { yylval.string = strdup(yytext); return MULTIPLY_OP;}
"/" { yylval.string = strdup(yytext); return DIV_OP;}
"%" { yylval.string = strdup(yytext); return MOD_OP;}
"<" { yylval.string = strdup(yytext); return LT_OP;}
">" { yylval.string = strdup(yytext); return GT_OP; }
"<=" { yylval.string = strdup(yytext); return LE_OP; }
">=" { yylval.string = strdup(yytext); return GE_OP; }
"==" { yylval.string = strdup(yytext); return EQ_OP; }
"!=" { yylval.string = strdup(yytext); return NE_OP; }
"(" { yylval.string = strdup(yytext); return LP; }
")" { yylval.string = strdup(yytext); return RP; }
"{" { yylval.string = strdup(yytext); return LC; }
"}" { yylval.string = strdup(yytext); return RC; }
if { return IF; }
我确实知道冲突是在我添加 MATH_OP 时开始的(我有所有的数学运算符,并得到 5 个冲突,而不是删除除 PLUS_OP 之外的所有运算符并得到 1 个移位/减少冲突)。
我按照here 的建议将-v 标志用于输出文件,并检查了this 问题,但它与我的语法不太相似...
我怎样才能找到冲突?
【问题讨论】:
标签: parsing compilation grammar bison yacc