首页 文章

ANTLR如何决定应用哪个词法分析器规则?最长的匹配词法分析器规则获胜?

提问于
浏览
1

输入内容:

enter image description here

语法:

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 回答

  • 0

    按以下顺序适用三条规则:

    • 最长的比赛获胜 .

    • 规则匹配隐式标记(如语法中的 # )接下来 .

    • 最后,如果是平局(按比赛长度),匹配规则中最早列出的规则将获胜 .

    经过大量的凌晨搜索,我在Sam Harwell的一篇冗长的引文中再次找到了大部分这些材料,其中他还阐述了贪婪的操作员的影响 . 我记得第一次看到它并在我的TDAR副本中勾画笔记,但没有参考 .

    ANTLR 4词法分子通常以最长匹配胜利行为进行操作,而不考虑替代词出现在语法中的顺序 . 如果两个词法分析器规则匹配相同的最长输入序列,则只有这些规则的相对顺序进行比较才能确定如何分配令牌类型 . 一旦词法分析器到达非贪婪的可选或闭包,规则内的行为就会发生变化 . 从该时刻到规则结束,该规则中的所有备选方案都将被视为有序,而具有最低备选方案的路径将获胜 . 这种看似奇怪的行为实际上是由于我们在底层ATN表示中订购替代方式而导致的非贪婪处理 . 当词法分析器处于此模式并到达块(ESC | . )时,排序约束要求它尽可能使用ESC .

    "implicit token"规则来自here .

  • 5

    我认为这是因为ANTLR首先在词法分析阶段看到 # 字符,所以它将遵循 T2 规则 . 幸运的是, T2 匹配 . 如果ANTLR首先看到 `` ,它将沿着 T1 规则行进 .

相关问题