如何在Windows上为Python3安装antlr4

4
我正在尝试在Windows上为Python 3安装antlr4。我成功地运行了以下pip命令:pip install antlr4-python3-runtime。安装软件包没有问题。我正在使用Miniconda环境,并且文件位于预期位置。
但是当我尝试从命令行运行antlr4时,却返回错误:"antlr4不被识别为内部或外部命令,可执行程序或批处理文件"。
我已经验证了我的路径变量是否符合预期......而且我在Miniconda环境中运行其他通过pip安装的软件包也没有问题。我还尝试通过CMD将其安装到Windows上的主Python安装,也可以顺利安装......但是运行时返回相同的反应。我也在我的Mac上尝试过,同样也有这个问题。
我假设antlr4构建存在问题,但是在继续之前,我想确定我没有漏掉任何东西。
更新0 @Bart的回答是正确的,但现在我无法运行.jar文件。它抛出一个错误,说我的Java已经过时(我是52版本的类文件,而它需要55版本)。但我有Java 1.8,应该比这更高。以下是错误信息:
C:\Users\mathg>java -jar C:\Users\mathg\miniconda3\Scripts\antlr-4.10.1-complete.jar -help
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/antlr/v4/Tool has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$100(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)

更新1 我进行了更多的挖掘,并按照antlr4: Getting Started中的安装说明操作。更新了所有环境变量,按要求创建了.bat文件,然后再次运行...但即使现在它已经在我的PATH中了,仍然出现相同的错误。可能是我Java安装有问题,但我确实进行了干净的重新安装。我在GitHub上找到了一个类似的问题,但似乎已经解决了。相关的antlr4 GitHub问题

更新2 解决运行antlr4 .jar文件的问题的答案是重新安装早期版本的Java。这完全解决了问题。如果其他人也遇到了这个问题,请查看我发布的GitHub问题链接。


但是 Python 版本需要吗?文档说不需要,因为使用 Python 时一切都可以从源代码工作。 - Trekkie
antlr4.bat文件丢失了。实际上,这让我一开始认为pip安装已经损坏了。有一个pygrun.py文件可以在命令行中运行,但它不接受与antlr4相同的参数。 - Trekkie
如果当前版本的命令行界面出现问题,那么我是否可以直接在Python脚本中导入antlr4并在那里构建我的文件? - Trekkie
1
你可能想要查看 https://github.com/antlr/antlr4-tools 并且不使用别名,手动下载antlr4 .jar文件,手动安装Java,调整PATH变量,添加JAVA_HOME变量,手动运行 java -jar ....complete.jar -Dlanguage=Python3 *.g4等等。你只需要设置好Python3和Pip,运行 pip install antlr4-tools,然后你就可以直接运行 antlr4 -Dlanguage=Python3 *.g4 而不用担心运行工具的正确Java版本。 "antlr4"命令行工具会自动下载一切。 - kaby76
1
@LionKimbro 听起来你还残留了Java安装。在设置/应用程序中删除所有已安装的Java,验证在命令行提示符下java.exe不存在,删除JAVA_HOME和PATH中Java目录的痕迹,并在文件系统中查找java.exe并删除以及相关文件。 - kaby76
显示剩余4条评论
2个回答

3

antlr4不是随 antlr4-python3-runtime 一起提供的二进制文件。它只是一个命令的别名:

java -jar /usr/local/lib/antlr-4.10.1-complete.jar

换句话说,当您想要从.g4语法文件生成解析器时,您需要下载antlr-4.10.1-complete.jar文件并安装Java运行时。您只需要Java来生成解析器类,之后您需要Python运行时类来使用这些生成的解析器类。
例如,您有一个名为MyLanguage.g4的语法:
grammar MyLanguage;

parse
 : GREET NAME EOF
 ;

GREET : 'Hi' | 'Hello';
NAME  : [a-zA-Z]+;
SPACE : [ \t\r\n] -> skip;

然后你需要做以下事情:
  1. 生成解析器类:
java -jar antlr-4.10.1-complete.jar MyLanguage.g4 -Dlanguage=Python3

这将生成MyLanguageLexer.pyMyLanguageParser.py(以及一些监听器类)。

  1. 使用词法分析器和语法分析器:
from antlr4 import *
from MyLanguageLexer import MyLanguageLexer
from MyLanguageParser import MyLanguageParser

if __name__ == '__main__':
    lexer = MyLanguageLexer(InputStream('Hi Trekkie'))
    parser = MyLanguageParser(CommonTokenStream(lexer))
    parse_tree = parser.parse()
    print(parse_tree.toStringTree(recog=parser))

上面的脚本只需要你安装了 antlr4-python3-runtime 库(并使用 from antlr4 import * 导入)。如果你运行此脚本,将会打印出以下内容:

(parse Hi Trekkie <EOF>)

哦,我想我明白你的意思了,所以我应该安装Java运行环境,但是当我调用它来制作一个Python文件时,Java运行时会寻找Python安装吗? - Trekkie
@Trekkie 不完全正确。Java运行时只会生成词法解析器和语法解析器的Python源代码文件。为了在你的Python代码中使用词法解析器和语法解析器,你需要安装antlr4-python3-runtime。我已经添加了一个快速示例以便开始使用。 - Bart Kiers
我仍然在启动jar文件方面遇到麻烦。如果您有时间,请查看我上面问题的更新?基本上,我拥有最新的Java版本...1.8...但我收到的错误提示说我的版本太旧了。我已经卸载并重新安装了Java,但是还是出现了奇怪的错误。 - Trekkie
(希望它重新变得活跃起来,我将取消接受答案) - Trekkie
发现问题是antlr4显然不适用于最新版本的Java(请参见我的编辑)。但就所有目的而言,您的答案是可行的。 :) 再次接受,再次感谢。 - Trekkie
显示剩余3条评论

1

“此版本的Java运行时仅识别52.0及以下的类文件版本。”上述错误信息意味着您的Java版本是Java 8或Java 1.8,而不是Java 18或称为Java十八,它们是两个不同的版本。


1
是的,也许我的系统上安装了两者中的不良组合。无论如何,卸载并重新安装最新的Java都没有解决问题。我不得不安装2018年的Java才能使其正常工作。另外,Java的版本号令人困惑。 - Trekkie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接