parsing - 简单/入门 ANTLR4 程序 : Exception (AntlrInputStream cannot be cast to CharStream)

标签 parsing antlr4 lexer

将 AntlrInputStream 类型转换为 CharStream 时出现问题。当类型转换时,Eclipse 很高兴(可以访问生成的代码);但运行时 - 抛出异常。我已经标记了之间的兴趣点 ////////////////////////////////// 行。

令我困惑的一个地方是,当我尝试导入包/类来解析类时,Eclipse 会找到其中的多个 - 其中一些位于 org.antlr.v4.runtime 中。 ;同一个是org.antlr.runtime等等。 对此进行一些澄清会有所帮助。 ANTLR Works developer (现在在 Tunnel Vision Labs)确实尝试阐明它(信息非常丰富;快速切中要害的答案) - 但是 NetBeans 的使用、使用 Antlr-3 开发 Antlr 4 的一部分以及其他方面的解释,只会增加困惑......

我很抱歉听起来很沮丧,但部分原因是我在 8 年前使用过 ANTLR 的旧版本,并记得它是一次非常愉快的体验 - 使用过它编译 SNMP MIB 来创建 HTML - 并且非常有效。

这一次,在这个n度多边形的每个角落都面临着路障; n 倾向于天知道还有多少

这是代码(语法已在 ANTLR Works 2.1 中验证)

    package com.mycompany.devcfg;

import java.io.FileInputStream;
import java.io.InputStream;

import org.antlr.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import org.apache.commons.lang3.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mycompany.antlr4gencode.VCFGLexer;
import com.mycompany.antlr4gencode.VCFGParser;

public class AntlrMain {

  public static final String DSLFile = "../tpep.dsl";
  public static final String GrammarFile = "../VCFG.g4";
  public static final Logger log = LoggerFactory.getLogger(AntlrMain.class);

  public static void main(String[] args) {

    log.debug ("main.start");

    try {
        log.debug ("try.start");

        InputStream is = new FileInputStream(DSLFile);
        ANTLRInputStream input = new ANTLRInputStream(is);
                    //////////////////////////////////////////
                    // type cast to CharStream is allowed. But exception's thrown anyway.
        VCFGLexer lexer = new VCFGLexer((CharStream) input); 
                    ///////////////////////////////////////////
        Validate.notNull(lexer);
        log.debug("lexer created");

        CommonTokenStream tokens = new CommonTokenStream(lexer);
        VCFGParser parser = new VCFGParser(tokens);
        Validate.notNull(parser);
        log.debug ("parser created");

        /*
        ModuleContext entryPoint = parser.module();
        Validate.notNull(entryPoint);

        ParseTreeWalker walker = new ParseTreeWalker();
        ListenerDelegator listener = new ListenerDelegator();
        walker.walk(listener, entryPoint);
                    log.debug ("walker/listener invoked at 'module');

        */

                    // NOTE: eventually I need the walker.walk (listener, entryPoint)

    } catch (Exception e) {
      Util.throwRuntimeException (e);
    }
    finally {
    log.info ("main.finally.end");
  }
}

尝试将我记得的公司名称替换​​为“mycompany”。它仍然可能会渗透进来:)

命令运行窗口中的异常(在 Eclipse 中运行):

        01:10:23,069 DEBUG AntlrMain:27 - main.start
    01:10:23,129 ERROR Util:18 - com.viasat.devcfg.AntlrMain.main(AntlrMain.java:36). 
    Msg: (
      org.antlr.runtime.ANTLRInputStream cannot be cast to org.antlr.v4.runtime.CharStream)
      Exception in thread "main" java.lang.RuntimeException: com.mycompany.devcfg.AntlrMain.main

/////////////////////////////////////////////////////////////////////////////////
      (AntlrMain.java:36). Msg: (org.antlr.runtime.ANTLRInputStream cannot be cast to
      org.antlr.v4.runtime.CharStream)
/////////////////////////////////////////////////////////////////////////////////
        at com.viasat.devcfg.Util.throwRuntimeException(Util.java:19)
        at com.viasat.devcfg.AntlrMain.main(AntlrMain.java:60)

最佳答案

看起来您正在使用两个不同的运行时,并且您正在尝试将 ANTLRInputStream 从一个运行时转换为来自另一个运行时的 CharStream。这是行不通的,因为这些类不相关。

仅使用v4运行时(删除import org.antlr.runtime.ANTLRInputStream;)并看看会发生什么。另外,请确保使用 来自antlr 网站的 v4 运行时 jar ( here's why )。

免责声明:我自己使用的是.Net版本,所以我可能是错的。

关于parsing - 简单/入门 ANTLR4 程序 : Exception (AntlrInputStream cannot be cast to CharStream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24879808/

相关文章:

python - Beautiful Soup - 在文章中找到第一个链接

iphone - 将解析字符串显示为标签问题

java - 在后台修改普通 ANTLR 文件

java - Antlr4 无法识别标识符

parsing - ANTLR Lexer 匹配错误的规则

c++ - 使用 C++ 解析 C++ 函数?

java - 是否可以将 application.yml 中的属性解析为具有不同名称的 java 类字段?

parsing - 如何分析 Antlr 语法

antlr4 - ANTLR 4 比 ANTLR 3 快吗?

java - ElasticSearch支持AND、OR、NOT任意组合