web-dev-qa-db-ja.com

「パーサールールでの暗黙のトークン定義」は心配ですか?

ANTLRとANTLRWorks2を使用して最初の文法を作成しています。文法自体はほぼ完成しています(記述された言語で記述されたコードを認識し、正しい解析ツリーを構築します)が、それ以上のことは何も始めていません。

心配なのは、パーサールールでトークンが最初に出現するたびに、「パーサールールでの暗黙のトークン定義」という黄色の波線で下線が引かれていることです。

たとえば、このルールでは、'var'その波線があります:

variableDeclaration: 'var' IDENTIFIER ('=' expression)?;

正確にどのように見えるか:

enter image description here

奇妙なことに、ANTLR自体はこれらのルールを気にしていないようです(テストリグテストを実行すると、パーサージェネレーターの出力にこれらの警告が表示されません。Java =バージョンが私のマシンにインストールされている)、それは単にANTLRWorksが文句を言っているだけです。

心配することですか、それともこれらの警告を無視する必要がありますか?レクサールールですべてのトークンを明示的に宣言する必要がありますか?公式聖書のほとんどの例 Defintive ANTLR Reference は、コードを記述したとおりに行われているようです。

31
Matěj Zábský

重要なコードでこの警告のすべてのインスタンスを修正することを強くお勧めします。

この警告は、次のような状況を警告するために(実際には私が)作成したものです。

shiftExpr : ID (('<<' | '>>') ID)?;

ANTLR 4は、アクションコードを文法に直接埋め込むのではなく、ターゲット言語で別々のファイルに書き込むことを推奨しているため、<<>>を区別できることが重要です。これらの演算子に対してトークンが明示的に作成されていない場合、トークンには任意のタイプが割り当てられ、それらを参照するための名前付き定数は使用できません。

この警告は、次の問題のある状況を回避するのにも役立ちます。

  • パーサールールにスペルミスのトークン参照が含まれています。警告がない場合、これにより、一致しない可能性のある追加のトークンがサイレントに作成される可能性があります。
  • パーサー規則には、次のような意図しないトークン参照が含まれています。

    number : zero | INTEGER;
    zero   : '0'; // <-- this implicit definition causes 0 to get its own token
    
21
Sam Harwell

複数のパーサー文法で使用されないレクサー文法を作成している場合は、ANTLRWorks2によって示されるこの警告を無視できます。

0
humblecoder