Parsing ML Yacc Tiger解析器减少/减少错误
我正在学习在ML书中Appel的现代编译器实现中生成Tiger解析器的Ch3编程练习。我的tiger.grm文件是。我试图诊断的错误是由一元和二元减号运算符的规则引起的reduce-reduce冲突。以下是yacc错误:Parsing ML Yacc Tiger解析器减少/减少错误,parsing,compiler-construction,sml,tiger,ml-yacc,Parsing,Compiler Construction,Sml,Tiger,Ml Yacc,我正在学习在ML书中Appel的现代编译器实现中生成Tiger解析器的Ch3编程练习。我的tiger.grm文件是。我试图诊断的错误是由一元和二元减号运算符的规则引起的reduce-reduce冲突。以下是yacc错误: error: state 128: reduce/reduce conflict between rule 48 and rule 46 on OR error: state 128: reduce/reduce conflict between rule 48 and r
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on OR
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on AND
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on GE
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on GT
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on LE
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on LT
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on NEQ
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on EQ
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on DIVIDE
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on TIMES
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on MINUS
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on PLUS
error: state 128: reduce/reduce conflict between rule 48 and rule 46 on RPAREN
state 128:
boolean : exp . AND exp
boolean : exp . OR exp
arithmetic : MINUS exp . (reduce by rule 46)
arithmetic : exp . PLUS exp
arithmetic : exp . MINUS exp
arithmetic : exp MINUS exp . (reduce by rule 48)
arithmetic : exp . DIVIDE exp
arithmetic : exp . TIMES exp
comparison : exp . EQ exp
comparison : exp . NEQ exp
comparison : exp . GT exp
comparison : exp . LT exp
comparison : exp . LE exp
comparison : exp . GE exp
我定义了优先级高于负数的一元数,并在规则中使用%prec显式设置它。当然,当我删除任何一条规则时,冲突就会消失,但语法会错误地解析减号
我无法诊断此错误-有什么想法吗 胡乱猜测:您的规则是否允许exp为空?如果是这样的话,那么这将在exp是可选的任何地方产生歧义-例如在-exp之前。胡乱猜测:您的规则之一是否允许exp为空?如果是这样的话,那么这将在exp是可选的任何地方产生歧义-例如在-exp.之前,作为他/她正确的接受答案的后续-在序列中存在允许exp进入epsilon的错误 下面是有问题的代码见最后一行:
sequence : LPAREN exp_sequence RPAREN ()
exp_sequence : (*epsilon*) ()
| exp seq ()
seq : (*epsilon*) () (*an exp sequence can be empty*)
| SEMICOLON exp exp_sequence () (*exps separated by semicolon*)
以下是更正后的代码:
sequence : LPAREN exp_sequence RPAREN ()
exp_sequence : (*epsilon*) ()
| exp seq ()
seq : (*epsilon*) () (*an exp sequence can be empty*)
| SEMICOLON exp seq () (*exps separated by semicolon*)
作为被接受答案的后续,他/她是对的——序列的制作中有一个错误,允许exp进入epsilon 下面是有问题的代码见最后一行:
sequence : LPAREN exp_sequence RPAREN ()
exp_sequence : (*epsilon*) ()
| exp seq ()
seq : (*epsilon*) () (*an exp sequence can be empty*)
| SEMICOLON exp exp_sequence () (*exps separated by semicolon*)
以下是更正后的代码:
sequence : LPAREN exp_sequence RPAREN ()
exp_sequence : (*epsilon*) ()
| exp seq ()
seq : (*epsilon*) () (*an exp sequence can be empty*)
| SEMICOLON exp seq () (*exps separated by semicolon*)