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



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

223年

总是被标识为aplhannumericnotdigit

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)将始终处理您的输入流,生成一个令牌流,供解析器规则在识别源结构时使用。

唯一的"调用顺序"是Tokenizer在解析器之前运行(这显然是必要的,因为解析器对解析器生成的令牌起作用)。

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

1 -如果一个Lexer规则匹配一个更长的字符集,那么它将被用来产生令牌。

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

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

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

最新更新