在Java应用程序中运行ANTRL TestRig GUI

在Java应用程序中运行ANTRL TestRig GUI,java,eclipse,antlr,antlr4,Java,Eclipse,Antlr,Antlr4,我知道可以通过终端使用ANTLR的TestRig“grun”生成解析树的图形表示: $ alias grun='java org.antlr.v4.runtime.misc.TestRig'​​ $ grun Example test -gui hello world ​​​​E​O​F​​​​ 但是可以从Java应用程序中调用TestRig吗?我想利用TestRig功能创建一个Java应用程序,该应用程序接受用户输入并显示生成的解析树图形表示 我已经尝试了以下方法: import org.a

我知道可以通过终端使用ANTLR的TestRig“grun”生成解析树的图形表示:

$ alias grun='java org.antlr.v4.runtime.misc.TestRig'​​
$ grun Example test -gui
hello world
​​​​E​O​F​​​​
但是可以从Java应用程序中调用TestRig吗?我想利用TestRig功能创建一个Java应用程序,该应用程序接受用户输入并显示生成的解析树图形表示

我已经尝试了以下方法:

import org.antlr.v4.runtime.misc.TestRig;
...
TestRig test = new TestRig(args);
test.process();
但我得到了这个信息:

无法将示例加载为lexer或parser

它看起来应该可以工作,因为它正确地识别了我在Eclipse上设置的参数
Example test-gui
,但是TestRig似乎无法找到语法


如何正确设置参数?如果这是不可能的,有没有其他方法在Java应用程序中运行ANTLR的TestRig?

好的,我已经解决了我的问题。通过查看TestRig类的源代码,我发现我只需要使用inspect()方法来生成GUI视图。下面是一个示例代码:

// Create an input stream that receives text from the terminal
ANTLRInputStream input = new ANTLRInputStream(System.in);

// Create an Lexer that receives the char stream
ExampleLexer lexer = new ExampleLexer(input);

// Create a token stream from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);

// Create a parser that receives the token stream
ExampleParser parser = new ExampleParser(tokens);

// Create a parser tree starting from the first rule
TestContext tree = parser.test();

//Generates the GUI
tree.inspect(parser);
编辑:对于版本4.5.1,生成树的代码更改为:

//Generates the GUI
Trees.inspect(tree, parser);

好的,我已经解决了我的问题。通过查看TestRig类的源代码,我发现我只需要使用inspect()方法来生成GUI视图。下面是一个示例代码:

// Create an input stream that receives text from the terminal
ANTLRInputStream input = new ANTLRInputStream(System.in);

// Create an Lexer that receives the char stream
ExampleLexer lexer = new ExampleLexer(input);

// Create a token stream from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);

// Create a parser that receives the token stream
ExampleParser parser = new ExampleParser(tokens);

// Create a parser tree starting from the first rule
TestContext tree = parser.test();

//Generates the GUI
tree.inspect(parser);
编辑:对于版本4.5.1,生成树的代码更改为:

//Generates the GUI
Trees.inspect(tree, parser);

好的,我已经解决了我的问题。通过查看TestRig类的源代码,我发现我只需要使用inspect()方法来生成GUI视图。下面是一个示例代码:

// Create an input stream that receives text from the terminal
ANTLRInputStream input = new ANTLRInputStream(System.in);

// Create an Lexer that receives the char stream
ExampleLexer lexer = new ExampleLexer(input);

// Create a token stream from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);

// Create a parser that receives the token stream
ExampleParser parser = new ExampleParser(tokens);

// Create a parser tree starting from the first rule
TestContext tree = parser.test();

//Generates the GUI
tree.inspect(parser);
编辑:对于版本4.5.1,生成树的代码更改为:

//Generates the GUI
Trees.inspect(tree, parser);

好的,我已经解决了我的问题。通过查看TestRig类的源代码,我发现我只需要使用inspect()方法来生成GUI视图。下面是一个示例代码:

// Create an input stream that receives text from the terminal
ANTLRInputStream input = new ANTLRInputStream(System.in);

// Create an Lexer that receives the char stream
ExampleLexer lexer = new ExampleLexer(input);

// Create a token stream from the lexer
CommonTokenStream tokens = new CommonTokenStream(lexer);

// Create a parser that receives the token stream
ExampleParser parser = new ExampleParser(tokens);

// Create a parser tree starting from the first rule
TestContext tree = parser.test();

//Generates the GUI
tree.inspect(parser);
编辑:对于版本4.5.1,生成树的代码更改为:

//Generates the GUI
Trees.inspect(tree, parser);
这段代码对我很有用(antlr-4.5.3-complete.jar):

void showGuiTreeView(最终字符串代码)
{
final org.antlr.v4.runtime.CharStream=新的AntlInputStream(代码);
最终MyLexer lexer=新的MyLexer(流);
最终的CommonTokenStream令牌=新的CommonTokenStream(lexer);
最终MyParser=新的MyParser(令牌);
final ParseTree=parser.expr();
最终列表ruleNames=Arrays.asList(MyParser.ruleNames);
最终TreeViewer视图=新的TreeViewer(规则名,树);
view.open();
}
这个代码片段适合我(antlr-4.5.3-complete.jar):

void showGuiTreeView(最终字符串代码)
{
final org.antlr.v4.runtime.CharStream=新的AntlInputStream(代码);
最终MyLexer lexer=新的MyLexer(流);
最终的CommonTokenStream令牌=新的CommonTokenStream(lexer);
最终MyParser=新的MyParser(令牌);
final ParseTree=parser.expr();
最终列表ruleNames=Arrays.asList(MyParser.ruleNames);
最终TreeViewer视图=新的TreeViewer(规则名,树);
view.open();
}
这个代码片段适合我(antlr-4.5.3-complete.jar):

void showGuiTreeView(最终字符串代码)
{
final org.antlr.v4.runtime.CharStream=新的AntlInputStream(代码);
最终MyLexer lexer=新的MyLexer(流);
最终的CommonTokenStream令牌=新的CommonTokenStream(lexer);
最终MyParser=新的MyParser(令牌);
final ParseTree=parser.expr();
最终列表ruleNames=Arrays.asList(MyParser.ruleNames);
最终TreeViewer视图=新的TreeViewer(规则名,树);
view.open();
}
这个代码片段适合我(antlr-4.5.3-complete.jar):

void showGuiTreeView(最终字符串代码)
{
final org.antlr.v4.runtime.CharStream=新的AntlInputStream(代码);
最终MyLexer lexer=新的MyLexer(流);
最终的CommonTokenStream令牌=新的CommonTokenStream(lexer);
最终MyParser=新的MyParser(令牌);
final ParseTree=parser.expr();
最终列表ruleNames=Arrays.asList(MyParser.ruleNames);
最终TreeViewer视图=新的TreeViewer(规则名,树);
view.open();
}


在设置export CLASSPATH=“.:/usr/local/lib/antlr-4.2.2-complete.jar:$CLASSPATH”之后,您是否尝试过从命令行运行java代码?请根据您的情况,根据需要更改antlr-4.2.2-complete.jar的位置。如果它从命令行运行,那么可能只是eclipse设置中的某种问题是的,我已经设置了类路径,但是从命令行运行应用程序会得到相同的结果。我确实把我所有的java类都放在同一个包中,但这没有帮助。如果你看一下TestRig的源代码,那么它显然看起来像是类加载问题。这里我所能建议的就是继续挖掘这些线。那么你是说这个问题是TestRig类本身固有的?我可以看看它的源代码吗?我并不想说TestRig类有任何问题。我的意思是它具有加载类的逻辑。这是TestRig的源代码。在设置export CLASSPATH=“.:/usr/local/lib/antlr-4.2.2-complete.jar:$CLASSPATH”后,您是否尝试过从命令行运行java代码?请根据您的情况,根据需要更改antlr-4.2.2-complete.jar的位置。如果它从命令行运行,那么可能只是eclipse设置中的某种问题是的,我已经设置了类路径,但是从命令行运行应用程序会得到相同的结果。我确实把我所有的java类都放在同一个包中,但这没有帮助。如果你看一下TestRig的源代码,那么它显然看起来像是类加载问题。这里我所能建议的就是继续挖掘这些线。那么你是说这个问题是TestRig类本身固有的?我可以看看它的源代码吗?我并不想说TestRig类有任何问题。我的意思是它具有加载类的逻辑。下面是TestRig的源代码,您是否尝试过运行JavaCOD