当前位置: 首页 > 知识库问答 >
问题:

在包中的语法上运行ANTLR grun(TestRig)。

祁景山
2023-03-14

在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中的dSource 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?

共有2个答案

庾远航
2023-03-14

我在Linux做的是在运行grun之前更改目录(cd)。

我的项目目录具有以下结构:

>

  • 根文件夹/

    >

    Makefile

    而我的Makefile有以下规则:

    start:
        @cd bin && cat ../$(INPUT) | grun MyGrammar program -gui
    

    因此,当我调用make start INPUT=“INPUT/test.txt”时,它会启动grun,显示输入程序的解析树。

  • 姬宝
    2023-03-14

    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方法中无法解决,但我不确定为什么,因为我在其他地方使用它很好。我试着遍历一组学生,把他们的平均数加起来。 有什么指示吗?谢谢你的时间! 大学生