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冲突是因为programstmt都有一个空的case。因此,由于 stmt 也是 program 的情况之一,因此有两种可能的路径可以从 program 导出空字符串(program -> stmt -> ""program -> "")。所以你需要移除其中一个空箱子。