我使用的是antlr4.3 (complete) jar。它在org.antlr.runtime和org.antlr.v4.runtime包中有很多副本。
在代码中,当我显式使用'v4.runtime' -在运行时,类路径拾取'runtime'。所以我提取了这个jar并重新创建了它,没有org.antlr.runtime。
但显然有些类,如RecognitionException现在没有找到。
我该如何解决这个问题呢?
打开最新的Jar并指定org.antlr.v4.runtime在org.antlr.runtime之前,这样就会从v4.runtime中找到一个重复的类,如果里面没有,它会查找org.antlr.runtime…??
要添加到上面,这里的代码片段给出了一个问题:jar在类路径中。
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.ANTLRInputStream;
public class AntlrMain {
public static void main(String[] args) {
System.out.println("Start Hello World");
try {
InputStream is = new FileInputStream(
"/home/ecworkspace/antlrCentral/DSL/mydev.dsl");
org.antlr.runANTLRInputStream input = new ANTLRInputStream(is);
org.antlr.v4.runtime.CharStream cs = (org.antlr.v4.runtime.CharStream) input;
VCFGLexer lexer = new VCFGLexer(cs);
- 最初在ANtlrMain类中,我没有使用explicitorg.antlr.v4.runtime。但在运行时,
'CharStream not found'
失败了。 - 然后我更改为包含类的完整路径 然后将ANTLR4 Jar更改为"排除"org.antlr.runtime(它有org.antlr.v4.runtime)。这就是
'RecognitionException not found'
错误发生的时候。语法顺便说一下,编译OK,生成我所有的VCFG*.java and tokens
类,其中VCFG是语法名称。
更新1
与所有人的建议保持一致-我删除了我对自己问题的回答,并将其添加到原始问题中。
在antlr-4.2-complete.jar中,我看到:/tmp/x/ $ jar -xf antlr-4.2-complete.jar
/tmp/x/ $ ls org/antlr
runtime stringtemplate v4
/tmp/x/ $ ls org/antlr/v4
analysis codegen parse semantics Tool$1UndefChecker.class Tool$OptionArgType.class
automata misc runtime tool Tool.class Tool$Option.class
/tmp/x/ $ ## The 2 runtimes above: org.antlr.runtime and org.antlr.v4.runtime
/tmp/x/ $ ## which to use where, along with same-name classes in
/tmp/x/ $ ## org.antlr and org.antlr.v4
所以,在build.xml中,我使用上面的jar:'
- java -jar antlr-4.2-complete grammar。g4 => 编译并给我VCFG*.java和VCFG*.tokens
- javac -cp "antlr-4.2-complete-jar" VCFG*.java => 成功。我有VCFG*.class集合。
- 然后我编译我的代码AntlrMain.java(它使用AntlrInputStream等),再次使用上述鹿角罐和一些第三方罐
(logging, commons) => 成功. -
java -cp "antlr-4.2-complete.jar:log4j.jar" -jar myJar
=> 运行失败,没有找到CharStream
更新2
根据您的回答添加
我最近才开始在Stackoverflow上发布问题。因此,关于是否回应我的问题以提供更多信息,或评论回复等的指针是欢迎的。
-cp <3rd-party> is -cp "log4j.jar:commonsLang.jar".
这里的-cp "above-jar"指的是-cp "antlr-4.2-complete.jar "。
如果我没有提到它,这是一个疏忽——我有,对于每个'java'和'javac命令,包括antlr-4.2-complete.jar。但是我看到你写的是antlr-runtime-4.2.jar。所以有单独的antlr-runtime jar和antlr-complete jar。
在下面的4个步骤中(为了方便,我省略了-cp,但是在'每个'步骤中都包含了antlr-4.2-complete.jar)
我认为,我应该在不同的步骤中使用antlr-run-time和antlr-complete jar:
1 (java MyGrammar.java)
2 (javac MyGrammar*.java)
3. javac MyOwnCode.java
4. Run myCode (java MyCode) ...
两个antlr jar中的哪一个(运行时和完成;以及他们的版本)我应该在上面的4个步骤中使用它们吗?
jar文件不包含重复的类。ANTLR 4.3工具的代码生成部分依赖于ANTLR 3.5.2运行时库,该库包含在"complete"jar文件中。虽然有些类与ANTLR 4中的类具有相同的名称,但它们不是重复的,不能互换使用。
@280Z28/Sam:
我很惭愧,但不得不承认最简单的答案往往是正确的。我花了一些时间充实这个JAR,从中生成了多个JAR文件,包括一个用于编译,一个用于运行,等等。 下面的ANT build.xml代码片段简洁地解释了答案:在这里,我生成了"最终的"生产JAR文件,这是在执行主程序时唯一包含的JAR:<jar destfile="${p_productionJar}">
<fileset dir="${p_buildDir}" casesensitive="yes">
<include name="**/*.class"/>
</fileset>
<zipfileset includes="**/*.class" src="${p_genCodeJar}"/>
<!-- How did I miss including p_antlrJar earlier?? -->
<zipfileset includes="**/*.class" src="${p_antlrJar}"/>
<zipfileset includes="**/*.class" src="${p_jschJar}"/>
<zipfileset includes="**/*.class" src="${p_log4jJar}"/>
<zipfileset includes="**/*.class" src="${p_commonslangJar}"/>
<manifest>
<attribute name="Main-Class" value="AntlrMain"/>
.....
生产Jar缺少${p_antlrJar} =>,即antlr-4.3-complete.jar!!!!你在回答中确实提到了这一点……但这是一个相当愚蠢的错误,我不认为是我做的……谢谢你。