我正在阅读明确的 ANTLR4 参考,并对其中一个示例(第 76 页)有疑问:
STRING: '"' (ESC|.)*? '"';
fragment
ESC: '\\"' | '\\\\' ;
该规则匹配一个典型的 C++ 字符串——一个包含在 中的字符序列""
,它也可以包含\"
。
在我的预期中,STRING
由于非贪婪结构,该规则应该匹配可能的最小字符串。因此,如果它看到 a \"
,它将在规则的末尾映射\
到.
和"
到,因为这将导致可能的最小字符串。"
取而代之的是, a\"
映射到ESC
。我有一个理解问题,因为这不是我所期望的。
这里到底发生了什么?是不是这样,一个单独的 DFA(ESC|.)
首先匹配,另一个 DFASTRING
使用已经匹配的(ESC|.)
构造字符串匹配?我不得不承认我还没有读完这本书。