ANTLR 语法中解析器和词法分析器规则的调用顺序是什么?

What is the order of invocation of parser and lexer rules in ANTLR grammar?

ANTLR 语法中解析器和词法分析器规则的调用顺序是什么? 例如在下面的语法中输入

223

始终标识为 A​​PLHANUMERIC 而不是 digit

digit  : F_DIGIT+;
alpha  : APLHANUMERIC;
APLHANUMERIC   : (LOWERCASE | UPPERCASE | F_DIGIT | '_')+ ;
fragment LOWERCASE  : [a-z] ;
fragment UPPERCASE  : [A-Z] ;
fragment F_DIGIT   : [0-9] ;

对评论进行详细说明:

分词器(又名词法分析器)将始终处理您的输入流,为解析器规则生成标记流,以便在识别您的源结构时使用。

唯一的“调用顺序”是 Tokenizer 在解析器之前运行(显然是必要的,因为解析器作用于解析器生成的标记)。

对于词法分析器规则,所有规则都逻辑上适用于您的输入流。如果您有多个 Lexer 规则可以匹配输入中的下一个字符,则有两个规则起作用。

1 - 如果一个 Lexer 规则匹配一组更长的字符,那么它将用于生成令牌。

2 - 如果多个规则匹配输入流中相同数量的字符,那么出现在语法中的第一个规则将“获胜”

fragments 不是词法分析器规则。它们只是一种便利,您可以利用它们来编写 Lexer 规则以避免重复并提高可读性。

在解析器中,您选择起始规则,然后解析器处理该规则的内容(递归调用构成该规则的规则及其子规则等)。唯一涉及的“顺序”是 ANTLR 将按顺序评估规则中的顶级替代方案,这可用于解决算术表达式中正确的运算符优先级等问题。