微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

减少班次冲突CUP

如何解决减少班次冲突CUP

我正在尝试在cup文件中定义语法,但出现以下错误

Warning : *** Shift/Reduce conflict found in state #4
  between fielddecls ::= (*) 
  and     type ::= (*) INT 
  under symbol INT
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #4
  between fielddecls ::= (*) 
  and     type ::= (*) CHAR 
  under symbol CHAR
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #4
  between fielddecls ::= (*) 
  and     type ::= (*) BOOL 
  under symbol BOOL
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #4
  between fielddecls ::= (*) 
  and     type ::= (*) FLOAT 
  under symbol FLOAT
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #8
  between fielddecls ::= (*) 
  and     type ::= (*) INT 
  under symbol INT
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #8
  between fielddecls ::= (*) 
  and     type ::= (*) CHAR 
  under symbol CHAR
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #8
  between fielddecls ::= (*) 
  and     type ::= (*) BOOL 
  under symbol BOOL
  Resolved in favor of shifting.

Warning : *** Shift/Reduce conflict found in state #8
  between fielddecls ::= (*) 
  and     type ::= (*) FLOAT 
  under symbol FLOAT
  Resolved in favor of shifting.

以下是我的cup文件中定义的语法。

program ::= CLASS ID:i CURLBRACKETBEGIN memberdecls:m CURLBRACKETEND
            {: RESULT = new Program(i,m); :};
memberdecls ::= fielddecls:fds methoddecls:m
            {: RESULT = new Memberdecls(fds,m); :};
fielddecls ::= fielddecl:f fielddecls:fds 
            {: RESULT = new Fielddecls(f,fds); :}
            |
            {: RESULT = new Fielddecls(); :};
methoddecls ::= methoddecl:md methoddecls:mds
            {: RESULT = new Methoddecls(md,mds); :}
            |
            {: RESULT = new Methoddecls(); :};
methoddecl ::= type:t ID:i PARENTHESISBEGIN argdecls:a PARENTHESISEND CURLBRACKETBEGIN fielddecls:f stmts:st CURLBRACKETEND optionalsemi:s
            {: RESULT = new Methoddecl(t,i,a,f,st,s); :}
            |
            VOID ID:i PARENTHESISBEGIN argdecls:a PARENTHESISEND CURLBRACKETBEGIN fielddecls:f stmts:st CURLBRACKETEND optionalsemi:s
            {: RESULT = new Methoddecl(i,s); :}
            ;
type ::=    INT
            {: RESULT = new Type("int"); :}
            |
            CHAR
            {: RESULT = new Type("char"); :}
            |
            BOOL
            {: RESULT = new Type("bool"); :}
            |
            FLOAT
            {: RESULT = new Type("float"); :};
optionalsemi ::= SEMI
            {: RESULT = new Optionalsemi(";"); :}
            |
            {: RESULT = new Optionalsemi(); :};
fielddecl ::= FINAL type:t ID:i optionalexpr:oe SEMI
            {: RESULT = new Fielddecl("final",t,oe); :}
            |
            type:t ID:i optionalexpr:oe SEMI
            {: RESULT = new Fielddecl(t,oe); :}
            |
            type:t ID:i SQUAREBRACKETBEGIN INTLIT:intl SQUAREBRACKETEND 

我认为这与Fielddecls如何引用Type非终结符有关。但是,我不确定如何消除它。如果可能的话,有人可以提供一些指导来消除这些减少偏移的错误吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。