es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo resuelve el último ANTLR4 la ambigüedad del “else colgante”?

Estoy usando el código antlr 'org.antlr:antlr4:4.9.2' y me encuentro con el problema de ambigüedad de “else colgante”; ver la siguiente gramática IfStat.g4.

// archivo: IfStat.g4
gramática IfStat;

stat: 'if' expr 'then' stat
     | 'if' expr 'then' stat 'else' stat
     | expr
     ;

expr: ID;

ID: LETTER (LETRA | [0-9])*;
fragmento LETTER: [a-zA-Z];

WS: [ \t\n\r] + - & gt; omitir;

Probé esta gramática con la entrada "if a then if b then c else d". Se analiza como `"if a then (if b then c else d)" como se esperaba. ¿Cómo resuelve ANTLR4 esta ambigüedad?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    ANTLR4 resuelve la ambigüedad de else pendiente utilizando la convención de asociar un else con el if más interno que aún no se ha emparejado con un else. En la gramática proporcionada, la regla para stat con dos alternativas, if expr then stat e if expr then stat else stat, representa esta convención. La primera alternativa coincide con una instrucción if sin un else, y la segunda alternativa coincide con una instrucción if con un else.

    Al analizar la entrada if a then if b then c else d, ANTLR4 asocia correctamente el else más interno con la instrucción if más interna. Por lo tanto, el árbol de análisis produce la estructura esperada de if a then (if b then c else d).

Comments are closed.