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