1

私の会社では、Antlr3に文法言語が実装されています。現在、コードが生成されるとき、コメントはありません。カスタムコメントが表示されるようにコメントをコーディングしたいと思います。例えば:

/**
* This class does something.
* @author name
*/
public class GrammarLanguageExample() {
}

以下に示す文法言語の例:

grammar Example;

options {
output=AST;
}

@header {
package com.example;
}

@rulecatch {
// ANTLR does not generate its normal rule try/catch
catch(RecognitionException e) {
    throw e;
}
}


insert      : 'INSERT INTO table' 'VALUES';
QUOTE       : '"';
SPECIALCHAR : '-'|'~'|;
STRING  : QUOTE('a'..'z'|'A'..'Z'|SPECIALCHAR|WS)+QUOTE;
WS: (' '|'\t'|'\f'|'\n'|'\r')+ { $channel = HIDDEN;}; // hide token from parser

上記の文法は単なる例であり、完全な文法ではありません。コードがAntlrWorks3.4によって生成されたときに現在何が起こるか:

ExampleLexerとExampleParserの2つのJavaファイルを取得します。

ExampleLexerには、パッケージ情報はありません。ExampleParserにはパッケージcom.exampleが含まれているのに対し、com.exampleパッケージに含まれると思います。文法が変更されるたびに、Lexerコードをコンパイルするためにcom.exampleを入力する必要があります。パッケージ情報が追加されるように文法のコードを変更するにはどうすればよいですか?

また、カスタムJavaDocコメントを追加するにはどうすればよいですか?私はこの形式で欲しいです:

package com.example;

Then import statements;

/**
* This class is used for Lexer.
* @author name
*/
public class ExampleLexer() {
}

package com.example;

Then import statements

/**
* This class is used for parsing.
* @author
*/
public class ExampleParser() {
}

また、文法がいつ生成されたかを示すパッケージ情報の前に自動生成されたコメントを削除したいと思います。これはどのように可能ですか?

お役に立てば幸いです。Googleで検索しましたが、これについては何も見つかりませんでした。

4

1 に答える 1

1

ExampleLexerには、パッケージ情報はありません。[...]パッケージ情報が追加されるように、文法のコードを変更するにはどうすればよいですか?

結合された文法ファイル(レクサーとトークンパーサーの両方を生成するファイル)の場合、パッケージ名を指定するheaderには、レクサー用とパーサー用の2つのセクションを指定する必要があります。あなたが発見@headerしたように、パーサーにのみ適用されます。両方のヘッダーセクションを使用する例を次に示します。

@parser::header {
    package com.example;
    //parser's imports go here.
}

@lexer::header { 
    package com.example;
    //lexer's imports go here.
}


また、カスタムJavaDocコメントを追加するにはどうすればよいですか?

結合された文法は、パーサークラスのJavadocコメントのみを指定でき、レクサーは指定できないと思います。これは、文法が宣言される前にドキュメントコメントを追加することによって行われます。

/**
* This class is used for parsing.
* @author name
*/
grammar Example;

出力はあなたが期待するものです:

/**
* This class is used for parsing.
* @author name.
*/
@SuppressWarnings({"all", "warnings", "unchecked"})
public class ExampleParser extends Parser {
 //etc

レクサークラスのJavadocコメントを取得する唯一の方法は、レクサー専用の文法ファイルを作成し、それにドキュメントコメントを付けることだと思います。

/**
* Lexer!
* @author name
*/
lexer grammar ExampleLexer;

その場合、出力は次のようになります。

/**
* Lexer!
* @author name
*/
@SuppressWarnings({"all", "warnings", "unchecked"})
public class ExampleLexer extends Lexer {
     //etc

したがって、パーサー上でのみJavadocと組み合わせた文法ファイルが必要か、2つの文法ファイルと処理できるすべてのJavadocが必要かを決定する必要があります。

また、文法がいつ生成されたかを示すパッケージ情報の前に自動生成されたコメントを削除したいと思います。これはどのように可能ですか?

ANTLRはこれを可能にするコマンドラインオプションを提供していないため、自動的に実行できる可能性はほとんどありません。

生成されたファイルを多くの訪問者が突っついていると予想される場合(そしてあなたがそうしているように聞こえます)、ファイルが実際に生成されていること、および読者が完全なドキュメントを他の場所で探す必要があることを明確にすることを検討してください(変更を加えないでください) 。次のように、ファイルの先頭に大きくて醜いコメントを追加することで、これを簡単に行うことができます。

@parser::header {

    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    //!!!                                                            !!!
    //!!! THIS CODE IS AUTOMATICALLY GENERATED! DO NOT MODIFY!       !!!
    //!!! Please refer to file Example.g for grammar documentation.  !!!
    //!!!                                                            !!!
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    package com.example;
}
于 2013-02-14T11:30:50.317 に答える