在Antlr 3中生成自定义JavaDoc

时间:2013-02-14 10:13:50

标签: java antlr javadoc antlrworks

我在Antlr 3中为我的公司实现了一种语法语言。目前,生成代码时没有注释。我想编写注释,以便显示自定义注释。例如:

/**
* 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

上面的语法只是一个例子而不是完整的语法。当AntlrWorks 3.4生成代码时,当前会发生什么:

我得到两个Java文件:ExampleLexer和ExampleParser。

在ExampleLexer中,没有包信息。我希望它进入com.example包,而ExampleParser包含com.example包。每次更改语法时,我都必须输入com.example以便编译Lexer代码。如何更改语法中的代码以便添加包信息?

另外,我如何添加自定义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上搜索过但无法找到任何相关信息。

1 个答案:

答案 0 :(得分:1)

  

在ExampleLexer中,没有包信息。 [...]如何更改语法中的代码以便添加包信息?

对于组合语法文件(同时生成词法分析器和令牌解析器的文件),指定包名称需要指定两个header部分:一个用于词法分析器,一个用于解析器。正如您所发现的,@header仅适用于解析器。以下是使用两个标题部分的示例:

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

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


  

另外,我如何添加自定义JavaDoc注释?

我认为组合语法只能为解析器类指定Javadoc注释,而不是lexer。这是通过在声明语法之前添加doc注释来完成的:

/**
* 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

我认为获取lexer类的Javadoc注释的唯一方法是专门为词法分析器创建一个语法文件并给它一个doc注释:

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

然后输出:

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

因此,您必须决定是否只需要在解析器或两个语法文件以及您可以处理的所有Javadoc上使用Javadoc组合语法文件。

  

我还想在包信息之前删除自动生成的注释,它告诉语法生成的时间。这怎么可能?

ANTLR不允许command line option允许这样做,因此它不太可能自动完成。

如果您希望有很多访问者在您生成的文件中徘徊(听起来像您这样做),请考虑明确说明文件实际上是生成的,并且读者应该在其他地方查找完整的文档(并且不应该做出改变)。您可以通过在文件顶部添加一个大而丑陋的注释来轻松完成此操作,如下所示:

@parser::header {

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

    package com.example;
}