bison 修复签名终端的 shift/reduce 冲突
bison fix shift/reduce conflict for signed terminals
基于这个问题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
的规则显然是错误的,因为它会产生歧义,但我该如何解决?
Bison 生成 LALR 解析器,因此无需将语法变形为可使用 LL 算法解析的版本。
语法只需要反映语言的结构。在这个简单的例子中,语言指定一个项是一个整数,可能前面有一个符号,并且一个表达式是从左到右分组的。 (这是我的假设,但这是通常的约定。)
可以简单的写成:
term: INT
| '+' term
| '-' term
expr: term
| expr '+' term
| expr '-' term
这些定义直接来自描述。
基于这个问题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
的规则显然是错误的,因为它会产生歧义,但我该如何解决?
Bison 生成 LALR 解析器,因此无需将语法变形为可使用 LL 算法解析的版本。
语法只需要反映语言的结构。在这个简单的例子中,语言指定一个项是一个整数,可能前面有一个符号,并且一个表达式是从左到右分组的。 (这是我的假设,但这是通常的约定。)
可以简单的写成:
term: INT
| '+' term
| '-' term
expr: term
| expr '+' term
| expr '-' term
这些定义直接来自描述。