【发布时间】:2017-07-03 06:26:03
【问题描述】:
我有一个算术表达式语法,可以解决文本文件中的表达式数量(每行一个)。在编译 YACC 时,我收到消息 2 shift 减少冲突。但我的计算是正确的。如果解析器给出正确的输出,它如何解决移位/减少冲突。就我而言,有什么方法可以在 YACC 语法中解决它。
YACC 语法
Calc : Expr {printf(" = %d\n",$1);}
| Calc Expr {printf(" = %d\n",$2);}
| error {yyerror("\nBad Expression\n ");}
;
Expr : Term { $$ = $1; }
| Expr '+' Term { $$ = $1 + $3; }
| Expr '-' Term { $$ = $1 - $3; }
;
Term : Fact { $$ = $1; }
| Term '*' Fact { $$ = $1 * $3; }
| Term '/' Fact { if($3==0){
yyerror("Divide by Zero Encountered.");
break;}
else
$$ = $1 / $3;
}
;
Fact : Prim { $$ = $1; }
| '-' Prim { $$ = -$2; }
;
Prim : '(' Expr ')' { $$ = $2; }
| Id { $$ = $1; }
;
Id :NUM { $$ = yylval; }
;
我应该做些什么改变来消除我的语法中的这种冲突?
【问题讨论】:
标签: parsing yacc shift-reduce-conflict