首页 > 解决方案 > 将 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()”所在的位置都有一个随机名称。正确的说法应该是什么?

谢谢!

标签: javaantlr4

解决方案


像这样:

CharStream charStream = CharStreams.fromString("test");

"test"要解析的输入本身在哪里。

或者当输入在文件中时,执行以下操作:

CharStream charStream = CharStreams.fromFileName("/path/to/file.ext");

如果这不起作用,您需要检查引发的异常(很可能该文件不在 ANTLR 正在寻找它的位置:尝试使用绝对路径)。


推荐阅读