Как последний ANTLR4 разрешает двусмысленность "висящего остального"?
Я использую
antlr 'org.antlr:antlr4:4.9.2'
и натолкнулись на проблему двусмысленности "висящее остальное"; см. следующую грамматику
IfStat.g4
.
// file: IfStat.g4
grammar IfStat;
stat : 'if' expr 'then' stat
| 'if' expr 'then' stat 'else' stat
| expr
;
expr : ID ;
ID : LETTER (LETTER | [0-9])* ;
fragment LETTER : [a-zA-Z] ;
WS : [ \t\n\r]+ -> skip ;
Я проверил эту грамматику на вводе
"if a then if b then c else d"
. Он анализируется как «if a then (if b then c else d)», как и ожидалось. Как ANTLR4 разрешает эту двусмысленность?
1 ответ
ANTLR выберет первый возможный (успешный) путь, который он может сделать.
Вы можете включить ANTLR, чтобы сообщать о таких неясностях в вашей грамматике. Проверьте этот вопрос и ответ для этого: двусмысленность в грамматике, о которой не сообщает ANTLR