我有一个基于antlr4的项目,其中的Main类包含以下代码:
package com.progur.langtutorial;
import java.io.FileInputStream;
import java.io.IOException;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
public class Main {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
try {
ANTLRInputStream input = new ANTLRInputStream(
new FileInputStream(args[0]));
GYOOLexer lexer = new GYOOLexer(input);
GYOOParser parser = new GYOOParser(new CommonTokenStream(lexer));
parser.addParseListener(new MyListener());
// Start parsing
parser.program();
} catch (IOException e) {
e.printStackTrace();
}
}
}
但是,由于不建议使用ANTLRInputStream,因此我需要改用CharStream。
但是,当我尝试使用CharStream时,我无法走得更远,
CharStream input = new ANTLRInputStream(
new FileInputStream(args[0]));
这是因为我不知道如何替换'='符号后的语句部分。我尝试了
CharStreams.fromFileName(new FileInputStream(args[0]));
,但是eclipse指出此错误“ CharStreams.fromFileName无法解析为类型”。我也尝试了CharStreams.fromFileName(args[0]);
,结果相同。我什至尝试了
CharStream input = new CharStreams.fromFileName("test");
其中“ test”是用来测试我编写的语言解析器的程序。也一样。我在
parser.addParseListener(new MyListener());
中也出现了另一个错误,其中说MyListener cannot be resolved to a type
。那是什么意思?在每个教程中,我都看过“ MyListener()”所在的位置有一个随机名称。什么是正确的说法呢?
谢谢!
最佳答案
像这样:
CharStream charStream = CharStreams.fromString("test");
其中
"test"
是要解析的输入本身。或者,当输入位于文件中时,执行以下操作:
CharStream charStream = CharStreams.fromFileName("/path/to/file.ext");
如果这不起作用,则需要检查引发的异常(很可能该文件不在ANTLR查找的位置:尝试使用绝对路径)。
关于java - 将ANTLRInputStream转换为CharStream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52847969/