最新的ANTLR4是如何解决"dangling else"歧义的?

How does the latest ANTLR4 resolve the "dangling else" ambiguity?

我正在使用 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 如何解决这种歧义?

ANTLR 将选择第一个可能的(成功的)路径。

您可以启用 ANTLR 来报告语法中的此类歧义。检查此问答:Ambiguity in grammar not reported by ANTLR