Как последний 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

Другие вопросы по тегам