野牛修复了已签名终端的转移/减少冲突

时间:2015-12-08 11:39:36

标签: bison shift-reduce-conflict

基于这个问题Where are the shift/reduce conflicts in this Bison code coming from?我试图为这样的语法创建语法:

-10 + 3 - 2+4 - 2 + 1。第一个整数显然有一个符号。

这就是我已经拥有的:

%token INT
...
Term: INT;
TermOps: "+" | "-";
SignedTerm: TermOps Term | Term;
reminder: /* EPS */ | TermOps TermList;
TermList: SignedTerm reminder;

我知道SignedTerm的规则显然是错误的,因为它会造成歧义,但我该如何解决?

1 个答案:

答案 0 :(得分:1)

Bison生成LALR解析器,因此无需将语法转换为可用LL算法解析的版本。

语法只需要反映语言的结构。在这个简单的情况下,语言指定一个术语是一个整数,可能在它之前有一个符号,并且一个表达式从左到右分组。 (这是我的假设,但这是通常的惯例。)

可以简单地写一下:

term: INT
    | '+' term
    | '-' term

expr: term
    | expr '+' term
    | expr '-' term

这些定义直接来自说明。