antlr - 对包中的语法运行 ANTLR grun (TestRig)。

标签 antlr antlr4 grun

在 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中的dsourcepath选项。

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

这是目录结构。

enter image description here 检查一切正常后,我尝试使用 grun (TestRig)。我尝试了 grun Expr prog -treegrun out/expr/Expr prog -tree,但它们不起作用。

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

最佳答案

AFAIK,grun 仅当所有文件都位于同一文件夹中时才有效。它是一种快速调试工具。

编辑

对于那些最近读过这篇文章的人来说:事情似乎已经发生了变化,而且现在这是可能的。阅读 raffian 的答案来尝试 -package 参数(我自己没有尝试过)。

关于antlr - 对包中的语法运行 ANTLR grun (TestRig)。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36678576/

相关文章:

java - 允许空白部分 ANTLR4

parsing - Antlr 空格标记错误

antlr - ANTLR4:零或一倍

javascript - 在 ANTLR4 中使用访问者的正确方法(javascript 目标)

java - Antlr4 在简单语法上没有找到任何可行的输入字符串替代方案

antlr4 - 无法使用Antlr4解析COBOL源代码

ANTLR - 树构造中的孙节点

java - antlr3 unicode字符导致错误