1

フォームのクラスを認識する(簡略化された)文法を使用する

classDeclaration
    : Class className=Identifier
      ( Extends parentClassIdentifier=PackageIdentifier )?
      ( classSpecifier )*
      Semicolon
    ;
classSpecifier
    : ( Abstract | Final )
    | /* ... */
    ;

クラスを簡単に作成して、抽象的かつ最終的なものにすることができます

class MyContradiction abstract final;

私の現在の文法では、これらのキーワードのいくつかを組み合わせても意味がありません。意味をなさない組み合わせを確認するにはどうすればよいですか。ひどいループとチェックを含めることでこれを防ぐために文法を変更する必要がありますか、それともリスナーまたはビジターを使用して、設定されているフラグと意味のないフラグを使用してコードをチェックインする必要がありますか?

4

1 に答える 1

4

コード内のこれらの間違った組み合わせをチェックする方が、「構文エラー」のようなものよりも優れたエラーメッセージをユーザーに提供する機会があるため、より優れていると言えます。

明確にするために、これらの種類のセマンティック制約をチェックし、キーワードの間違った組み合わせなどをキャッチするコードは、コード内にある必要がありますが、パーサーのセマンティックアクションのコード内にある必要があります。これはそれのための最高の場所です。したがって、これは文法と同じファイルにありますが、文法自体をより複雑にすることはありません。

セマンティックアクションに、解析される言語の式を評価するコードが含まれているパーサーを見たことがあります。基本的に、一部の人々は、解析された言語のインタープリターを文法ファイルに埋め込みます。これは間違っています。パーサーはASTを生成する必要があり、それだけです。しかし、繰り返しになりますが、文法ファイルのセマンティックアクションでキーワードの間違った組み合わせをチェックするなどのことを行うのが最善だと私は信じています。文法を勉強している人は、これらの構文に関連するものを見ることはありません。また、構文解析が完了した後、これらのチェックを行うのを忘れることもあります。そして、結局のところ、文法に違法なテキストのASTをパーサーから返すのは、少し危険ですよね。

于 2013-02-23T20:05:53.947 に答える