在状态#xx(java cup)中发现shift/reduce冲突

vcirk6k6  于 2021-07-06  发布在  Java
关注(0)|答案(0)|浏览(173)

我有一套符合规则的语法:

bloqueCodigo ::= LLAVEIZQ bloquesAdmitidos LLAVEDER;

bloquesAdmitidos ::= bloqueTiposVariablesFuncion bloqueSentencias |
bloqueSentencias;

bloqueTiposVariablesFuncion ::= declaracionesTiposBloques |
declaracionesVariablesBloques |
declaracionesTiposBloques declaracionesVariablesBloques;

declaracionesTiposBloques ::= tipos declaracionesTiposBloques | 
tipos;

declaracionesVariablesBloques ::= variables declaracionesVariablesBloques |
variables;

bloqueSentencias ::= expresiones PUNTOCOMA bloqueSentencias |
sentencias PUNTOCOMA bloqueSentencias |
epsilon;

expresiones ::= expresionesAritmeticas {: syntaxErrorManager.syntaxInfo ("Expresión aritmética detectada"); :} | 
expresionesLogicas {: syntaxErrorManager.syntaxInfo ("Expresión lógica detectada"); :};

expresionesAritmeticas ::= NUMERO | 
IDENTIFICADOR | 
IDENTIFICADOR CORCHETEIZQ valorNumero CORCHETEDER;

expresionesLogicas ::= SUMA;

使用测试运行此操作会导致以下输出错误:

[cup] Warning :***Shift/Reduce conflict found in state #32
  [cup]   between declaracionesVariablesBloques ::= variables (*) 
  [cup]   and     parametroTipo ::= (*) IDENTIFICADOR IDENTIFICADOR 
  [cup]   under symbol IDENTIFICADOR
  [cup]   Resolved in favor of shifting.
  [cup] Warning :***Shift/Reduce conflict found in state #36
  [cup]   between bloqueTiposVariablesFuncion ::= declaracionesTiposBloques (*) 
  [cup]   and     parametroTipo ::= (*) IDENTIFICADOR IDENTIFICADOR 
  [cup]   under symbol IDENTIFICADOR
  [cup]   Resolved in favor of shifting.

回过头来看,如果我不得不看的话,我有其他的规则,它告诉我哪里有错误:

valorNumero ::= NUMERO | IDENTIFICADOR;

parametroTipo ::= IDENTIFICADOR IDENTIFICADOR;

variables ::= declaracionVariableEntera | declaracionVariableTipo;

declaracionVariableEntera ::= parametroEntero listaVariablesEnteras PUNTOCOMA {: syntaxErrorManager.syntaxInfo ("Variable(s) entera(s) detectada(s)"); :};

listaVariablesEnteras ::= ASIGNACION valorNumero listaVariablesEnteras |
COMA IDENTIFICADOR listaVariablesEnteras |
epsilon;

如果我在“expresionesaritmeticas”规则中指示的第一件事是identifier,则会出现指示的错误,但是如果我以以下方式创建规则:

expresionesAritmeticas ::= NUMERO | 
IDENTIFICADOR | 
IDENTIFICADOR CORCHETEIZQ valorNumero CORCHETEDER;

这不是失败,但它不符合或不做我需要的。
有人知道会发生什么事以及如何解决吗?
谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题