Parsing ML Yacc Tiger解析器减少/减少错误

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

我正在学习在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 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*)