java - 无法理解为什么我会收到错误消息“myLexer cannot be cast to org.antlr.runtime.TokenSource”
问题描述
我正在尝试 ANTLR 4.8。我在编写调用词法分析器和解析器类的正确主文件时遇到问题。
在正确解析我的 ANTLR g4 文件(获取 antlr 提供的所有文件和类)后,我编写了以下主要 java 文件:
import java.io.*;
import org.antlr.v4.runtime.TokenStream;
import org.antlr.runtime.*;
import org.antlr.runtime.TokenSource;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CharStreams;
public class example3Ppal {
public static void main(String[] args){
try{
CharStream input = CharStreams.fromFileName(args[0]);
//Create a Lexer with the previously created CharStream
example3Lexer mylexer = new example3Lexer(input);
//Conecting lexer and parser
CommonTokenStream tokens = new CommonTokenStream((TokenSource) mylexer);
example3Parser myparser = new example3Parser((TokenStream) tokens);
myparser.operation();
} catch (java.lang.RuntimeException re) {
System.out.println(re.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
}
}
我从以前的主文件开始,所以我不得不从 ANTLRFileStream 等更改为 CharStreams。在我尝试连接词法分析器和解析器之前,一切似乎都有效。在 ANTLR 网站中提供的示例之后,词法分析器对象足以创建“CommonTokenStream”对象,此外,它应该足以创建解析器对象。
好吧,我首先尝试不进行任何转换,但 eclipse 和 NetBeans 都要求我转换“mylexer”和“tokens”对象。我不明白为什么,因为词法分析器超类实现了“TokenSource”接口,而“CommonTokenStream”也实现了“TokenStream”接口。此外,这两种环境都允许我使用没有任何属性的“CommonTokenStream”构造函数,而ANTLR 文档中不存在此构造函数
我在这里阅读了很多关于类似问题的评论,但我没有发现任何可以适用于我的情况的评论。
结果是它可以编译,但是当我运行程序时,我收到以下错误消息:“mylexer cannot be cast to org.antlr.runtime.TokenSource”
我的计算机中没有预先安装 ANTLR,“antlr-4.8-complete”jar 文件作为外部 jar 库正确包含在项目中,并且它也包含在 CLASSPATH 环境变量中。我不知道为什么应该工作对我不起作用,有人可以帮助我吗?我开始考虑重新安装 java、eclipse、netBeans 和 ANTLR。
提前致谢。
解决方案
您正在混合来自 ANTLR 4 和 ANTLR 3 的导入。任何没有v4
其中的导入都是从 ANTLR 3 导入类(这是可能的,因为 ANTLR 4 jar 包含 ANTLR3,因为 ANTLR 4 使用 ANTLR 4)。
如果您将所有导入切换到org.antlr.v4
并删除强制转换,代码应该可以工作。
推荐阅读
- php - 如何构建一个插件子?
- stripe-payments - 如何使用 Strapi 找出支付/转账的条纹问题
- javascript - 获取对象数组之外的对象
- javascript - 如何使用 Node.js 读取/写入图像?
- awk - sed cut grep linux 命令输出
- sql - AWS athena - 如何过滤 json 数组?
- mongodb - 如何为 Mongo Socket 异常启用自动重试?
- python - 我的异步装饰器不断返回 NoneType 错误
- swift - stackView 内容(SF-Symbols)扭曲
- javascript - 在到达页面底部之前加载滚动项目。Javascript 代码崩溃