0

C# の文法をデバッグしているときに、非常に異常なことに気付きました。完全な文法では受け入れられない一部の入力が、いくつかの独立した規則が削除された同じ文法で受け入れられています。論理的な説明が見つかりませんでした。例えば:

CS - この文法は入力を受け入れませんa<a<a>><EOF>

CS' - この文法は基本的にCSと同じですが、いくつかの独立した規則が削除されています (規則は並べ替えられません) 受け入れますa<a<a>><EOF>

両方の文法がルールで始まることがわかるstart: namespaceOrTypeName EOF;ように、同じルール セットを呼び出す必要があります ( CSはCS'で削除されたルールを呼び出すことはありません)。これをデバッグし、新しいルールを削除または追加するのに 1 日を費やしましたが、ロジックに欠陥は見つかりませんでした。どんな助けでも役に立ちます、ありがとう。

ユニコード

EDIT:CSの開始ルールを文法に変更した後、ルールのみが定義されている場合に通常受け入れられるstart: Identifier EOF;入力を拒否し始めます。したがって、文法をコンパイルした後、この場合「メソッド」などのいくつかのフレーズが予約されるというルールがあるため、そうであるかどうかはまだわかりません。methodIdentifierattributeTarget: ...| 'method' | ...

4

1 に答える 1

1

最初の文法には、トークンoverloadableBinaryOperatorを暗黙的に定義するルールが含まれています。>>は 2 文字のトークンであるため>>、レクサーは入力>>を 2 つの別個の 1 文字のトークン として>扱うことはありません>。ANTLRWorks 2 で文法を開くと、暗黙的に定義されたトークンごとに警告インジケーターが表示されます。次の方法で、これらの警告をすべて削除する必要があります。

  1. 入力に表示する予定のすべてのトークンに対して明示的なレクサー ルールを作成します。
  2. 'new'リテラル に対応するレクサー規則が存在する場合にのみ、パーサー規則で構文を使用します'new'
于 2013-07-29T11:13:18.547 に答える