Estoy usando COPA para crear un analizador que necesito para mi tesis. Tengo un shift/reduce el conflicto en mi gramática. Tengo esta regla de producción:

command ::= IDENTIFIER | IDENTIFIER LPAREN parlist RPAREN;

y tengo esta advertencia:

Warning : *** Shift/Reduce conflict found in state #3
between command ::= IDENTIFIER (*) 
and     command ::= IDENTIFIER (*) LPAREN parlist RPAREN 
under symbol LPAREN

Ahora, yo en realidad quería a cambio, así que estoy bastante de acuerdo, pero mi profesor me dijo que encontrar una manera de resolver el conflicto. Estoy ciego. Siempre he leído acerca de la if/else conflicto, pero para mí, este no parece el caso.
Me pueden ayudar?

P. S.: IDENTIFICADOR, LPAREN «(» y RPAREN «)» son de la terminal, parlist de comandos y no lo son.

OriginalEl autor dierre | 2010-07-02

3 Comentarios

  1. 7

    El problema no está en las reglas. Aunque Michael Mrozek respuesta es correcta aproximación a la resolución de la «colgando otro problema», es no entender el problema a la mano.

    Si usted mira el mensaje de error, se ve que el cambio /reducir el conflicto está presente cuando gramatical LPAREN. Estoy bastante seguro de que las normas por sí solas no crear un conflicto.

    Yo no puedo ver su gramática, así que no puedo ayudarte. Pero su conflicto es, probablemente, cuando un command es seguido por una regla diferente, que comienzan con una LPAREN.

    Vistazo a las demás normas que pueden ser potencialmente después de command y empezar con LPAREN. Entonces usted tendrá la consolidación de las reglas. Hay una muy buena probabilidad de que su gramática es errónea para una entrada específica.

    Sí, tienes derecho. El problema estaba en la línea por encima de este. He resuelto este problema hace 4 días. Me he olvidado de actualizar a la pregunta.

    OriginalEl autor rioki

  2. 5

    Tiene dos producciones:

    command ::= IDENTIFIER
    command ::= IDENTIFIER LPAREN parlist RPAREN;
    

    Es un cambio/reducir el conflicto, cuando la entrada de los tokens son IDENTIFIER LPAREN, porque:

    • LPAREN podría ser el comienzo de una nueva producción aún no aparece, en cuyo caso el analizador debe reducir la IDENTIFIER ya en la pila en command, y han command LPAREN restantes
    • Podrían ser el inicio de la segunda producción, por lo que se debe cambiar el LPAREN en la pila junto a IDENTIFIER y seguir leyendo, tratando de encontrar una parlist.

    Puedes solucionarlo haciendo algo como esto:

    command ::= IDENTIFIER command2
    command2 ::= LPAREN parlist RPAREN |;
    
    Gracias, pero yo estoy teniendo el mismo turno/reducir el conflicto incluso con esta solución. No estoy teniendo errores de sintaxis, así que estoy bastante seguro de que la COPA no utilizar algunos raros «símbolo vacío», pero estoy revisando para ello.

    OriginalEl autor Michael Mrozek

  3. 2

    Intenta establecer un orden de prioridad:

    precedence left     LPAREN, RPARENT;
    

    Que las fuerzas de la COPA para decidir el conflicto, tomando la izquierda de partido.

    OriginalEl autor trunks0

Dejar respuesta

Please enter your comment!
Please enter your name here