java Main<;inputfile不工作(Main是一个测试ANTLR语法的java类)
我正试图用这样一个标准的测试平台来测试ANTLR语法java Main<;inputfile不工作(Main是一个测试ANTLR语法的java类),java,error-handling,io,redirect,antlr3,Java,Error Handling,Io,Redirect,Antlr3,我正试图用这样一个标准的测试平台来测试ANTLR语法 import org.antlr.runtime.*; class Main { public static void main(String[] args) throws Exception { SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0])); SampleParser parser = new SampleParser(new
import org.antlr.runtime.*;
class Main {
public static void main(String[] args) throws Exception {
SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0]));
SampleParser parser = new SampleParser(new CommonTokenStream(lexer));
parser.program();
}
}
我有一个名为mytest00的测试文件。现在我想使用这个文件作为输入。我想我在做一个标准的IO重定向
bash-3.2$ java Main < mytest00
您试图使用
args[0]
,但实际上没有传入任何命令行参数-您只是将文件重定向到进程的标准输入中。所以这个数组没有元素,你会得到一个异常,因为你试图得到这个空数组的第一个元素
还不清楚您是否真正想要
ANTLRStringStream
。我怀疑您想要antlInputStream
包装系统。如果args.length==0
,则antlInputStream(args[0])
否则。当您使用时,异常通常意味着什么以及如何处理异常
at Main.main(SampleTest.java:5)
问题出现在代码的5行中,即:
SampleLexer lexer = new SampleLexer(new ANTLRStringStream(args[0]));
例外情况是:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
这意味着您正试图从数组args
中检索0元素,该数组已被非法索引访问,因为该数组为空(size=0)
示例解决方案
您要使用此构造函数:
public ANTLRStringStream(String str)
为此,您可以:
读取一些字符串的标准输入
将此字符串传递给ANTLRStringStream
构造函数
对不起,请你说得更准确一点好吗?我真的抓不住它。你打算怎么办?我想我的程序正在等待arg[0]参数的输入,标准输入是arg[0]将采用的实际值。它不应该这样工作吗??谢谢。@zell:不,它不应该那样工作。程序的标准输入和用于调用它的参数之间有很大的区别。如果您编写了javamainfoobar
,您希望它做什么?在这种情况下,args
将是{“foo”,“bar”}
。谢谢Jon。但是,将我的输入文件作为ANTLR测试设备的输入,有什么好办法呢?谢谢作为参考,我曾为此目的使用过gunit,但gunit对我来说的问题是它没有提供有用的错误消息。因此,最好是有一个文件作为JAVA Main的直接输入。@zell:正如我在回答中所说的,我怀疑您需要一个AntlInputStream
,它允许您传入一个文件名,或者您可以使用AntlInputStream
包装系统。
如果您仍然需要stdin重定向。@zell,“ANTLR解释器”你可能是指AntlWorks中的解释器(这只是一个)。然而,AntlWorks的调试器工作得非常完美。
public ANTLRStringStream(String str)