ANTLR4解析器,未创建Visitor。

8

我对ANTLR不太熟悉,想要在ANTLR4中写出语法,之前没有接触过早期的版本。 我正在按照《ANTLR 4权威指南》一书进行操作。 我使用Eclipse,并按照这里提供的说明安装了ANTLR4 IDE。 我在Expr.g4中编写了以下语法:

grammar Expr;

import Common;

options{
language = Java;
}
prog: stat+;

stat: expr NEWLINE
    | ID '=' expr NEWLINE
    | NEWLINE;

expr: expr ('/'|'*') expr
    | expr ('+'|'-') expr
    | INT
    | ID
    | '('expr')';

Common.g4包含以下内容:

lexer grammar Common;

ID: [A-Za-z]+;
INT: [0-9]+;
NEWLINE: '\r'?'\n';
WS: [\t]+ -> skip;

已创建lexer.java文件,但parser.java、visitor.java和其他基础文件尚未创建。请帮我解决这个问题。提前感谢。


信息不足。您确定解析器和访问者应该被生成吗?您是否查看了正确的目录?也许您应该再次查阅文档和/或问题跟踪器。 - blackcompe
@blackcompe 是的,我已经使用了其他语法并进行了检查。当我保存文件时,所有文件都会自动创建。但在上述情况下不是这样。 - Pacu
我也有同样的问题,你找到解决方案了吗? - user902383
5个回答

8
事实上,我曾经遇到过同样的问题。我曾在同一项目中集成两个 G4 文件,第一个生成了 Visitor,而第二个则没有生成。
后来我意识到,每个 G4 文件都有自己的代码生成配置,您可以通过以下方式进行更改:
1.右键单击 G4 文件,然后选择“Run As”。 2.选择“External tool configuration”。 3.将 "no-visitor" 更改为 "visitor",listener 同理。
现在,“Visitor”文件已经生成了。

1
这对我很有帮助!我没有得到任何访客文件。我只使用了一个G4文件,但知道每个G4文件都有自己的工具配置是关键... - skrilmps

6

对于Maven,从文档中并不清楚如何设置visitor属性。您需要在<plugin>元素中进行设置。

<plugin>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-maven-plugin</artifactId>
    <version>${antlr.version}</version>
    <configuration>
        <visitor>true</visitor>
    </configuration>
    ...
</plugin>

2

检查您的JRE版本(命令行[Windows]:java-version)。
我在使用此示例时遇到了相同的问题,因为使用了JRE 8

因此,如果您有JRE8,则可能的解决方案是:

  • 在eclipse.ini中添加-version:1.7;或者
  • 在“Run As/External Tools Configurations...”中的参数中添加-version:1.7;或者
  • 在Windows/Java/Installed JREs中选择JRE 1.7

要生成XXXVisitor,请在“Run As/External Tools Configurations...”中将-no-visitor参数更改为-visitor

  • -version:1.6也适用。

1
当您使用命令行生成Java类时,请像上面提到的那样使用-visitor作为参数以生成访问者类。 - user235273

2
你应该在构建过程中生成你的语法。从ANTLR 4.2开始(目前可通过Sonatype快照Maven存储库作为4.2-SNAPSHOT获取),Maven插件支持Eclipse m2e。Maven插件的文档可以在这里找到:

http://www.antlr.org/api/maven-plugin/master/index.html

我不会信任使用 ANTLR 语法而没有将代码生成步骤自动化到构建过程中的任何构建,并强烈建议您避免使用手动代码生成步骤或将代码生成作为 IDE 扩展的一部分

1

首选项 -> ANTLR4 -> 工具 -> 选项 -> 生成解析树访问器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接