¿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?
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
eif 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 elelse
más interno con la instrucciónif
más interna. Por lo tanto, el árbol de análisis produce la estructura esperada deif a then (if b then c else d)
.