当前位置: 首页 > 知识库问答 >
问题:

antlr4 Jar在不同的包中有重复的类——不知道内部代码引用了哪些类

姚臻
2023-03-14

我正在使用antlr4.3(完整)jar。它有许多重复的org.antlr.runtime和org.antlr.v4.runtime包。

代码中,当我显式使用“v4.runtime”时——在运行时,类路径会选择“运行时”。所以我提取了jar并重新创建它,而没有org.antlr.runtime.

但是很明显,现在找不到像识别异常这样的类。

我应该如何解决这个问题,除了:

分解最新的Jar并指定组织。安特尔。v4。运行时间先于组织。安特尔。运行时,以便从v4中提取重复的类。运行时,如果没有,它将查看org。安特尔。运行时。。。??

除此之外,这里的代码片段给出了一个问题: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);
  1. 最初在ANtlrMain类中,我没有使用显式组织。安特尔。v4。运行时。;但在运行时失败了,出现了'CharStream not found'

顺便说一句,语法编译OK,生成我所有的VCFG*. java和令牌类,其中VCFG是语法名称。

更新1

为了与所有人的建议保持一致——我删除了对自己问题的回答,并将其添加到这个原始问题中。

在antlr-4.2中完成。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

所以,在建。xml,我使用上面的jar来:`

  • java-jar antlr-4.2-完整语法. g4=

更新2

根据您的回复添加。

我最近才开始在Stackoverflow上发布问题。所以,关于是回应我的问题以提供更多信息,还是对回复进行评论等方面的建议是受欢迎的。

-cp <3rd-party> is -cp "log4j.jar:commonsLang.jar".  

我所说的-cp“over-jar”是指-cp“antlr-4.2-complete.jar”。

如果我没有提到它,这是一个疏忽-我有,对于每个'java'和'javac命令,包括antlr-4.2-complete.jar.但我看到你指出antlr-runtime-4.2.jar.所以有单独的antlr-runtime jar和antlr-完整的jar。

在下面的4个步骤中(为了方便起见,我省略了-cp,但在“每个”步骤中都包含了antlr-4.2-complete.jar)。

我认为,我应该在不同的步骤中使用antlr运行时和antlr complete JAR:

1 (java MyGrammar.java) 
2 (javac MyGrammar*.java) 
3. javac MyOwnCode.java 
4. Run myCode (java MyCode) ...

在以上4个步骤中,我应该使用两个antlr JAR中的哪一个(运行时和完整;以及它们的版本)?

共有2个答案

廉博赡
2023-03-14

@280Z28/Sam:

我感到羞愧,但不得不承认最简单的答案往往是正确的。我花时间充实JAR,用它制作多个JAR文件,包括一个用于编译、一个用于运行等等。

答案是在ANT构建中简洁地解释的。下面的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"/>
        .....

生产罐缺少${p_antlrJar}=

芮歌者
2023-03-14

jar文件不包含重复的类。ANTLR 4.3工具的代码生成部分依赖于ANTLR 3.5.2运行时库,该库包含在“完整”jar文件中。虽然有些类与ANTLR 4中的类同名,但它们不是重复的,不能互换使用。

 类似资料:
  • 请任何人解释Oracle中的锁定模式,即共享、独占和更新锁定。我找到了很多关于这个和那个的理论 共享锁:没有人可以改变数据,只读目的 独占锁定:只允许一个用户/连接更改数据。 更新锁:行被锁定,直到用户提交/回滚。 然后,我尝试共享以检查它的工作原理 然后,我发现,用户可以在共享锁定后更改数据。那么,它与独占锁和更新锁有什么不同呢。 另一个问题,更新锁和排他锁有什么不同,即使它们看起来几乎是等同的

  • 我对不同类型的标识符案例以及人们对它们的称呼感兴趣。你知道这个名单上还有其他名字吗? :骆驼大小写(例如在java变量名中) :大写的骆驼大小写(例如在java类名中) :Snake大小写(例如在python变量名中) : Kebab大小写(例如球拍名称) :平面大小写(例如在java包名称) :大写(例如C常量名称)

  • 本文向大家介绍Java中定义了哪些不同类型的嵌套类?,包括了Java中定义了哪些不同类型的嵌套类?的使用技巧和注意事项,需要的朋友参考一下 在Java中,可以在另一个类中定义一个类,此类称为嵌套类。对于内部类,我们可以使用访问修饰符,例如private,public,protected或default;对于外部类, 可以使用default或public访问修饰符。 Java中定义了两种类型的嵌套类

  • 本文向大家介绍有哪些不同类型的区块链?相关面试题,主要包含被问及有哪些不同类型的区块链?时的应答技巧和注意事项,需要的朋友参考一下 回答:下面列出了三种主要的区块链类型: 公共区块链:顾名思义,这里没有人负责,任何人都可以读/写/审核区块链。 私有区块链:顾名思义,它是个人或组织的私有财产。 财团或联合区块链:财团的选定成员可以读取/写入/审核区块链

  • 本文向大家介绍Selenium有哪些不同的等待类型?,包括了Selenium有哪些不同的等待类型?的使用技巧和注意事项,需要的朋友参考一下 下面列出了Selenium中可用的不同类型的等待- 隐式等待 这是Selenium中动态等待的一种,其语法为- 明确等待 这是Selenium中动态等待的一种,其语法为- 流利的等待 这是Selenium中动态等待的一种,其语法为- 静态等待 这用于将执行暂停

  • 本文向大家介绍你知道的内容运营的方法有哪些?相关面试题,主要包含被问及你知道的内容运营的方法有哪些?时的应答技巧和注意事项,需要的朋友参考一下 内容运营是指基于产品的内容进行内容策划、内容创意、内容编辑、内容发布、内容优化、内容营销等一系列与内容相关的工作,多应用于互联网行业。为了适应当今数字媒体和社交媒体的发展,保持与顾客对话,品牌在传统平台和数字平台上都需要持续不断地提供新鲜的内容。归根结底,