我有一套符合规则的语法:
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;
这不是失败,但它不符合或不做我需要的。
有人知道会发生什么事以及如何解决吗?
谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!