我在创建PEMDAS和条件解析时,我的Bison中有关于我的EBNF的错误。我不太清楚我将如何减少EBNF。
输出文件中有1个shift / reduce错误。这是冲突出现的部分。 " expr" in" rel_cond"当我宣布" rel_expr"时似乎有冲突。和" par_expr"规则。
cond : rel_cond
| par_cond
;
rel_cond : expr relop cond
| expr
;
par_cond : PAR_START cond PAR_END
;
.
.
expr : rel_expr
| par_expr
;
par_expr : PAR_START expr PAR_END
;
rel_expr : term ADD expr
| term SUB expr
| term
;
term : factor MULT factor
| factor DIV factor
| factor
;
factor : CONSTANT
| ID
;
这里是.output文件中出现的内容
state 47
16 rel_cond: expr . relop expr
17 | expr .
32 par_expr: PAR_START expr . PAR_END
EQT shift, and go to state 49
NOT_EQT shift, and go to state 50
LT shift, and go to state 51
GT shift, and go to state 52
LT_EQT shift, and go to state 53
GT_EQT shift, and go to state 54
BIT_AND shift, and go to state 55
LOG_AND shift, and go to state 56
BIT_OR shift, and go to state 57
LOG_OR shift, and go to state 58
PAR_END shift, and go to state 41
PAR_END [reduce using rule 17 (rel_cond)]
relop go to state 59
答案 0 :(得分:1)
您的输出文件与您的语法不符,因此您不会在您认为自己的输入文件上运行bison。输出文件具有规则
rel_cond: expr relop expr
虽然你的规则有
rel_cond : expr relop cond
但在任何一种情况下问题都是相同的 - 这里的规则是不明确的,因为它没有指定它是正确的还是左递归的。像
这样的输入expr relop expr relop expr
可以解析为(expr relop expr) relop expr
或expr relop (expr relop expr)
。默认的“减少前移位”冲突解决意味着生成的解析器将保持递归,但您可以通过使用优先规则或通过重写语法以显式向左或向右递归来消除冲突。