在ANTLR执行之后,我将所有生成的java文件都放在一个目录中,因此我使用了一些选项来生成一个单独的目录和名称空间,以存储和编译所有生成的文件。
这是语法文件:
语法表达式;
prog: (expr NEWLINE)* ;
expr: expr ('*'|'/') expr
| expr ('+'|'-') expr
| INT
| '(' expr ')'
;
NEWLINE : [\r\n]+ ;
INT : [0-9]+ ;
我可以使用o
在不同的目录中获取生成的文件,并使用package
选项添加包信息。
java -jar /usr/local/lib/antlr-4.5.3-complete.jar -listener -visitor -package expr -lib . -o gen/expr Expr.g4
编译代码需要javac
中的d
和Source cepath
选项。
javac -cp .:/usr/local/lib/antlr-4.5.3-complete.jar -d out -sourcepath gen gen/expr/Expr*.java
我可以通过制作可执行文件来检查代码是否有效。
import expr.*;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
class ExprRunner {
public static void main(String[] args) throws Exception {
// create a CharStream that reads from standard input
String filePath = "input.txt";
File fileInput = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(fileInput);
ANTLRInputStream input = new ANTLRInputStream(fileInputStream);
ExprLexer lexer = new ExprLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
ExprParser parser = new ExprParser(tokens);
ParseTree tree = parser.prog(); // begin parsing at init rule
System.out.println(tree.toStringTree(parser)); // print LISP-style tree
}
}
我可以构建和运行它。
javac -cp .:/usr/local/lib/antlr-4.5.3-complete.jar:out -d out -sourcepath . ExprRunner.java
java -cp .:/usr/local/lib/antlr-4.5.3-complete.jar:out ExprRunner
这是目录结构。
如何对位于其他目录中的ANTLR文件运行grun?
我在Linux做的是在运行grun
之前更改目录(cd
)。
我的项目目录具有以下结构:
>
根文件夹/
>
Makefile
而我的Makefile
有以下规则:
start:
@cd bin && cat ../$(INPUT) | grun MyGrammar program -gui
因此,当我调用make start INPUT=“INPUT/test.txt”时,它会启动grun,显示输入程序的解析树。
AFAIK,grun
仅在所有文件都在同一文件夹中时才有效。它是一个快速调试工具。
问题内容: 我在Eclipse中有Maven Java项目。我右键单击项目,选择“构建项目”,并希望自动调用“ mvn软件包”。可能吗? 问题答案: 右键单击pom.xml,然后选择并输入目标:。如果现在选择“运行”(CTRL + F11),则在选择这些运行配置后它将自动运行。 正如克里斯所说,m2e是必需的。
问题内容: 以下代码可在实时站点上运行,但无法在jsfiddle站点上运行。 谁能告诉我为什么它在jsfiddle上不起作用? 在控制台上,它记录:和。 您将代码作为片段嵌入此处时,可以看到该代码的工作原理: 问题答案: 您定义的函数是在onload函数中定义的,因此在它们被引用之前,因为它们是在该函数中定义的,所以只能在该函数中引用它们。您在HTML中将它们称为全局变量。您有三种选择 a)(最简
问题内容: 我在Windows上有一个基本的webserver hello world应用程序,可用于Windows上的nodejs,它可在localhost上运行。但是,当我从互联网测试它时,它无法连接。我在netgear路由器中设置了端口转发。我是否在这里缺少使我的nodejs服务器对外界可见的步骤? 谢谢。 问题答案: 确保您聆听而不是 是仅对您的计算机可见的专用网络。 侦听所有接口,包括私
问题内容: 我正在尝试在Ubuntu终端上运行javac。但是我得到以下信息: JDK已经安装并运行说 我的jdk安装在/ usr / lib / jvm / java-6-open- jdk中;而且我能够从Eclipse编译并运行Java程序。但是在使用终端时遇到了上述问题。 问题答案: 该二进制(可能其他的Java二进制文件)是/不是您的用户环境变量。有几种解决方法: 添加到用户的环境变量。您
问题内容: 我已经阅读了以前发布的问题。有些含糊不清,没有一个解决我的问题,所以我不得不再问一次。 我有两个简单的课程, 另一类是 我在Windows cmd中的基本文件夹“ basic”中。我用编译 将创建一个文件夹和子文件夹。 这会产生大量错误。许多答案旨在指定无效的完整路径。我的班级在One中,因此使用-cp指定One也不起作用。 问题答案: 您将其运行为: …但是从 根 目录(), 不是
得到了经典作业,我需要创建学生和课程类以及驾驶员类。 我在计算我的课程班级的整体平均成绩时遇到了问题。一切都正常,但当我运行驱动程序时,我得到了“0”作为类平均值。在IDE中,它告诉我s中的“s”。getAverage();'在getClassAverage方法中无法解决,但我不确定为什么,因为我在其他地方使用它很好。我试着遍历一组学生,把他们的平均数加起来。 有什么指示吗?谢谢你的时间! 大学生