首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在包中的语法上运行ANTLR grun (TestRig)。

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

Stack Overflow用户
提问于 2016-04-17 15:38:54
回答 2查看 3.5K关注 0票数 4

在ANTLR执行之后,我将所有生成的java文件都放在一个目录中,所以我使用一些选项来生成一个单独的目录和名称空间来存储和编译所有生成的文件。

这是语法文件:

语法费用;

代码语言:javascript
复制
prog: (expr NEWLINE)* ;
expr: expr ('*'|'/') expr
    | expr ('+'|'-') expr
    | INT
    | '(' expr ')'
    ;
NEWLINE : [\r\n]+ ;
INT     : [0-9]+ ;

我可以使用o在不同的目录中获取生成的文件,并使用package选项添加包信息。

代码语言:javascript
复制
java -jar /usr/local/lib/antlr-4.5.3-complete.jar -listener -visitor -package expr -lib . -o gen/expr Expr.g4

编译代码需要dsourcepath选项在javac中。

代码语言:javascript
复制
javac -cp .:/usr/local/lib/antlr-4.5.3-complete.jar -d out -sourcepath gen gen/expr/Expr*.java

我可以通过生成可执行文件来检查代码的工作。

代码语言:javascript
复制
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        
    }
}

我可以建造和运行它。

代码语言:javascript
复制
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

这是目录结构。

在检查了所有操作之后,我尝试使用grun (TestRig)。我试过grun Expr prog -treegrun out/expr/Expr prog -tree,但是它们没有工作。

如何在位于其他目录中的ANTLR文件上运行grun

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-17 20:31:57

只有当所有文件都在同一个文件夹中时,grun才能工作。它是一个快速调试工具。

票数 5
EN

Stack Overflow用户

发布于 2019-10-05 22:48:10

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

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

  • 根文件夹/
代码语言:javascript
复制
- src/ (where `.java` files are stored)
- bin/ (where `.class` files are stored)
- input/ (where input programs in `.txt` are stored)
- Makefile

我的Makefile有以下规则:

代码语言:javascript
复制
start:
    @cd bin && cat ../$(INPUT) | grun MyGrammar program -gui

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36678576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档