首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单/启动ANTLR4程序:异常(不能将AntlrInputStream转换为CharStream)

简单/启动ANTLR4程序:异常(不能将AntlrInputStream转换为CharStream)
EN

Stack Overflow用户
提问于 2014-07-22 05:48:46
回答 1查看 2.6K关注 0票数 2

类型转换AntlrInputStream到CharStream的问题。当类型被抛出时,Eclipse很高兴(可以访问生成的代码);但是运行时会抛出异常。我在/两行之间标明了感兴趣的地方。

让我感到困惑的一个地方是,当我尝试导入一个包/类来解析一个类时,Eclipse会发现其中的多个类--其中一些在org.antlr.v4.runtime中,另一个是org.antlr.runtime等等。对此稍加澄清将有所帮助。ANTLR Works developer(现在在隧道视觉实验室)确实试图弄清楚这件事(非常有见地;快速回答)--但是使用NetBeans,使用Antlr-3开发Antlr 4的一部分,以及其他方面的解释,只会增加混乱.

我很抱歉听起来很沮丧,但在某种程度上,这是因为我的在8年前就使用了的旧版本,并回忆起它是一次非常愉快的体验--使用它来编译SNMP来创建HTML --并且工作得很有魅力。

这一次,在这个n度多边形的每一个角落都会遇到路障;n会倾向于天晓得的更多。

下面是代码(在ANTLR Works 2.1中验证的语法)

代码语言:javascript
复制
    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");
  }
}

想把我公司的名字改成“我的公司”。它仍有可能通过:)

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

代码语言:javascript
复制
        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)
EN

回答 1

Stack Overflow用户

发布于 2014-07-22 08:23:38

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24879808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档