我正在阅读明确的 ANTLR4 参考文献,并对其中一个示例有疑问(第 76 页):
STRING: '"' (ESC|.)*? '"';
fragment
ESC: '\\"' | '\\\\' ;
该规则与典型的 C++ 字符串匹配 - 包含在""
,其中可以包含\"
too.
在我的预期中,规则STRING
由于非贪婪构造,应该匹配可能的最小字符串。所以如果它看到一个\"
它会映射\
to .
and "
to "
在规则的末尾,因为这将导致可能的最小字符串。取而代之的是一个\"
被映射到ESC
。我有一个理解问题,因为这不是我所期望的。
这里到底发生了什么?是不是这样,一个单独的DFA匹配(ESC|.)
首先,还有另一场 DFA 比赛STRING
使用已经匹配的字符串(ESC|.)
构造?我必须承认我还没有读完这本书。
ANTLR 4 词法分析器通常以最长匹配获胜行为进行操作,而不考虑替代项在语法中出现的顺序。如果两个词法分析器rules匹配相同的最长输入序列,然后比较这些规则的相对顺序,以确定如何分配令牌类型。
一旦词法分析器达到非贪婪的可选或闭包,规则内的行为就会发生变化。从那一刻起到规则的末尾,该规则内的所有替代方案都将被视为有序,并且具有最低替代方案的路径获胜。这种看似奇怪的行为实际上是造成非贪婪处理的原因我们在底层 ATN 表示中订购替代方案的方式。当词法分析器处于此模式并到达块时(ESC|.)
,排序约束要求它使用ESC
如果可能的话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)