Bison 没用的 non-term
Bison useless non-term
σ我正在尝试创建一个简单的野牛示例。我已经从我的 .l 文件中定义了操作的值,但是当我尝试执行 -v 检查冲突时,expr 与 stmt 没有任何联系,因此 bison 只识别我写的第一件事,即使我在 stmt 的开头有一个 "expr SEMICOLON"。我还在状态 0 中遇到 reduce/reduce 冲突。有什么想法吗?
program: state
|;
state: expr SEMICOLON
| BREAK SEMICOLON
| CONTINUE SEMICOLON
|;
expr: expr "+" expr
| expr "-" expr
| expr "*" expr
| expr "/" expr
| expr "%" expr
;
expr
的所有情况都是递归的,因此 expr
无法匹配任何输入。您需要一个基本案例(例如 NUM
and/or ID
)。
reduce/reduce冲突是因为program
和stmt
都有一个空的case。因此,由于 stmt
也是 program
的情况之一,因此有两种可能的路径可以从 program
导出空字符串(program -> stmt -> ""
和 program -> ""
)。所以你需要移除其中一个空箱子。
σ我正在尝试创建一个简单的野牛示例。我已经从我的 .l 文件中定义了操作的值,但是当我尝试执行 -v 检查冲突时,expr 与 stmt 没有任何联系,因此 bison 只识别我写的第一件事,即使我在 stmt 的开头有一个 "expr SEMICOLON"。我还在状态 0 中遇到 reduce/reduce 冲突。有什么想法吗?
program: state
|;
state: expr SEMICOLON
| BREAK SEMICOLON
| CONTINUE SEMICOLON
|;
expr: expr "+" expr
| expr "-" expr
| expr "*" expr
| expr "/" expr
| expr "%" expr
;
expr
的所有情况都是递归的,因此 expr
无法匹配任何输入。您需要一个基本案例(例如 NUM
and/or ID
)。
reduce/reduce冲突是因为program
和stmt
都有一个空的case。因此,由于 stmt
也是 program
的情况之一,因此有两种可能的路径可以从 program
导出空字符串(program -> stmt -> ""
和 program -> ""
)。所以你需要移除其中一个空箱子。