输入内容:
语法:
grammar test;
p : EOF;
Char : [a-z];
fragment Tab : '\t';
fragment Space : ' ';
T1 : (Tab|Space)+ ->skip;
T2 : '#' T1+ Char+;
匹配结果如下:
[@0,0:6='# abc',<T2>,1:0] <<<<<<<< PLACE 1
[@1,7:6='<EOF>',<EOF>,1:7]
line 1:0 extraneous input '# abc' expecting <EOF>
请忽略最后一行中的错误 . 我想知道为什么在 PLACE 1 匹配的令牌是 T2
.
在语法文件中, T2
词法分析器规则为 T1
lexer规则 . 所以我希望首先应用 T1
规则 . 那么为什么不跳过 # abc
中的空格呢?
ANTLR是否使用一些贪婪策略来匹配当前字符流和最长的词法分析器规则?
2 回答
按以下顺序适用三条规则:
最长的比赛获胜 .
规则匹配隐式标记(如语法中的
#
)接下来 .最后,如果是平局(按比赛长度),匹配规则中最早列出的规则将获胜 .
经过大量的凌晨搜索,我在Sam Harwell的一篇冗长的引文中再次找到了大部分这些材料,其中他还阐述了贪婪的操作员的影响 . 我记得第一次看到它并在我的TDAR副本中勾画笔记,但没有参考 .
"implicit token"规则来自here .
我认为这是因为ANTLR首先在词法分析阶段看到
#
字符,所以它将遵循T2
规则 . 幸运的是,T2
匹配 . 如果ANTLR首先看到 `` ,它将沿着T1
规则行进 .