1

我为我的公司在 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 上进行了搜索,但找不到任何关于此的内容。

4

1 回答 1

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注释,而不是词法分析器。这是通过在声明语法之前添加文档注释来完成的:

/**
* 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 注释的唯一方法是专门为 lexer 创建一个语法文件并给它一个 doc 注释:

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

那么输出是:

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

因此,您必须决定是仅在解析器上需要一个包含 Javadoc 的组合语法文件,还是需要两个语法文件和您可以处理的所有 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 回答