2017-07-20 10 views
0

これまでは、(レクサールールによって生成された)トークン値が、そのルールのルールインデックスと同じであると信じていました。明らかにそうではありません。生成されたコードのruleNamesフィールドとliteral/display namesフィールドを調べると分かります。ルール名は部分的には表示名(トークン値の文字列表現のみ)とは異なる順序であり、フラグメントルールのようなものも含みます。一方、仮想トークンのエントリはありません(tokensセクションで定義されています)。トークン値からレクサールールへの移動方法は?

トークン値からルールインデックスを取得するには、どうすればよいですか?私が想像できる唯一の方法は、ボキャブラリから記号名(ルール名)を取得し、ルール名配列でこれを調べることです。しかし、それは少し奇妙に思えます。より直接的な方法があるはずです。何か案が?

追加情報:パーサー規則で始まるATNを歩きたい場合は、参照が必要です。レクサートークンはトランジションラベルとして保存され、それがどこから来たのかが分かります。レクサーATNで歩き続けるには、正しいルールインデックスが必要です。

+0

生成されたレクサーによって 'Recognizer#getRuleIndexMap()'にアクセスしましたか?それは動作するはずだが、試していないように見えます。 – GRosenberg

+0

いったんルール名があれば、それは第2ステップです。しかし、私は、ルール番号(したがって開始状態)を取得する直接的な方法があることを望んでいました。 –

答えて

0

一般にこれは不可能です。レクサールールは、ルール名には全く対応していないトークンを返すことができます。したがって、トークンとそれらを生成したルールとの間に信頼できる関係はありません(しばしば一致しますが、必ずしもそうではありません)。

関連する問題