未找到 ANTLR 4.7 CharStreams.fromFileName(s)

ANTLR 4.7 CharStreams.fromFileName(s) is not being found

这是一个最小化的测试用例。它应该编译。注释掉的字符串是 4.6 版本,它确实可以编译和工作。所以我的构建环境似乎是正确的。

import java.lang.*;
import java.util.*;
import java.io.*;

class xx {
    public static void main(String[] args) {
        try {
            // org.antlr.v4.runtime.ANTLRInputStream input = new
            //     org.antlr.v4.runtime.ANTLRFileStream("file name here");  // compiles
            org.antlr.v4.runtime.CharStream input = new
                org.antlr.v4.runtime.CharStreams.fromFileName("file name here");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

$ javac xx.java
xx.java:8: error: cannot find symbol
            org.antlr.v4.runtime.CharStream         input = new org.antlr.v4.runtime.CharStreams.fromFileName("file name here");
                                                                                                ^
  symbol:   class fromFileName
  location: class CharStreams
1 error

我正在从 ANTLR 4.6 升级到 4.7。其中一项更改是弃用 ANTLRInputStream 和 ANTLRFileStream。那么是什么(直接取自 The Excellent and Definitive ANTLR 4 Reference):

import org.antlr.v4.runtime.*;                  // http://www.antlr.org/
import org.antlr.v4.runtime.tree.*;

String f ...

ANTLRInputStream    input = new ANTLRFileStream(f);

现在是这样的:

CharStream          input = new CharStreams.fromFileName(f);

我已经在 /usr/local/lib/ 中安装了 4.7,并且我编译了我的语法,没有任何更改或错误。但是当我编译结果 java 我得到:

java -jar /usr/local/lib/antlr-4.7-complete.jar xx.g4
javac -Xlint:deprecation *.java
xxasm.java:61: error: cannot find symbol
                CharStream          input = new CharStreams.fromFileName(f);
                                                           ^
  symbol:   class fromFileName
  location: class CharStreams
1 error

我的类路径和 java 版本是:

CLASSPATH=.:/usr/local/lib/antlr-4.7-complete.jar:/usr/local/lib/jopt-simple-5.0.3.jar:/usr/local/lib/junit-4.12-sources.jar:/usr/local/lib/gson-2.8.1.jar

javac -version
javac 1.8.0_131

OSX 10.12.5

有什么想法吗?使用 javap:

查看 antlr-4.7-complete.jar 时一切看起来都很好
...
public static org.antlr.v4.runtime.CharStream fromFileName(java.lang.String) throws java.io.IOException;

打开 -verbose 标志:

...
[loading ZipFileIndexFileObject[/usr/local/lib/antlr-4.7-complete.jar(org/antlr/v4/runtime/CharStreams.class)]]
dwasm.java:61: error: cannot find symbol
                CharStream          input = new CharStreams.fromFileName(f);
                                                           ^
  symbol:   class fromFileName
  location: class CharStreams

此外,不起作用:

CharStream          input = new org.antlr.v4.runtime.CharStreams.fromFileName(f);

org.antlr.v4.runtime.CharStream input = new
    org.antlr.v4.runtime.CharStreams.fromFileName("file name goes here");

od -c

0004720    t   i   m   e   .   C   h   a   r   S   t   r   e   a   m   s
0004740    .   f   r   o   m   F   i   l   e   N   a   m   e   (   "   f
0004760    i   l   e       n   a   m   e       h   e   r   e   "   )   ;
new CharStreams.fromFileName(f);

应该只是

CharStreams.fromFileName(f);

无论出于何种原因,当您犯下该错误时,错误消息会很糟糕。