σ我正在尝试创建一个简单的野牛示例。我已经从我的.l文件中定义了操作的值,但是当我尝试对-d检查冲突时,expr与stmt没有任何关联,因此bison只识别我写的第一个东西,即使我在stmt的开头有一个“expr SEMICOLON”。我也在状态0中减少/减少冲突。任何想法?
program: state
|;
state: expr SEMICOLON
| BREAK SEMICOLON
| CONTINUE SEMICOLON
|;
expr: expr "+" expr
| expr "-" expr
| expr "*" expr
| expr "/" expr
| expr "%" expr
;
答案 0 :(得分:1)
expr
的所有案例都是递归的,因此expr
无法匹配任何输入。您需要一个基本案例(例如NUM
和/或ID
)。
减少/减少冲突的原因是program
和stmt
都有空案例。因此stmt
也是program
的案例之一,因此有两种可能的路径来从program
(program -> stmt -> ""
和program -> ""
)派生空字符串。所以你需要删除其中一个空案例。