java - 将 ANTLRInputStream 转换为 CharStream
问题描述
我有一个基于 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");
“测试”是为测试我编写的语言解析器而编写的程序。也是一样。
我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 正在寻找它的位置:尝试使用绝对路径)。
推荐阅读
- swift - 快速更改帧速率后保存avplayer视频
- spring-boot - 在SpringBoot中,当我可以在Catch中编写代码时,为什么我们需要单独的注解@ExceptionHandler注解?
- php - mySQL 只选择有多个 ID 匹配的一行
- regex - 匹配字符串中可选单词前后的内容
- amazon-web-services - 更快地创建 tarball 的最佳设置
- typescript - Angular 和 typescript:在 ngfor 循环中更改文本和全局颜色变量
- javascript - 产品订购单
- .htaccess - 使用 RewriteCond 重定向 410
- macos - Android Studio 经常死机
- python - 使用 matplotlib 的 x 轴的不同比例