私は明確な ANTLR4 リファレンスを読んでいて、例の 1 つに関して質問があります (p. 76):
STRING: '"' (ESC|.)*? '"';
fragment
ESC: '\\"' | '\\\\' ;
この規則は、典型的な C++ 文字列 ( に含まれる char シーケンスで""あり、これも含むことができる) に一致し\"ます。
STRING私の期待では、非貪欲な構造のため、ルールは可能な限り最小の文字列に一致するはずです。したがって、 a が見つかった場合は、ルールの最後でtoおよびtoに\"マップされます。これは、可能な限り最小の文字列になるためです。これの代わりに、 aは にマップされます。それは私が期待したものではないので、理解に問題があります。\.""\"ESC
ここで正確に何が起こりますか?(ESC|.)分離された DFA が最初に一致し、別の DFAがコンストラクトSTRINGの既に一致した文字列を使用して一致するのはこのようなもの(ESC|.)ですか? 私はその本を最後まで読んでいないことを認めなければなりません。