首页 > 解决方案 > 无法理解为什么我会收到错误消息“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。

提前致谢。

标签: javaantlr4

解决方案


您正在混合来自 ANTLR 4 和 ANTLR 3 的导入。任何没有v4其中的导入都是从 ANTLR 3 导入类(这是可能的,因为 ANTLR 4 jar 包含 ANTLR3,因为 ANTLR 4 使用 ANTLR 4)。

如果您将所有导入切换到org.antlr.v4并删除强制转换,代码应该可以工作。


推荐阅读