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

在通过自制安装的macOS上设置ANTLR的类路径

方博学
2023-03-14

根据此问题,我已通过自制软件安装了ANTLR:

brew install antlr

并安装在:

/usr/local/Cellar/antlr/<version>/

并通过

pip3 install antlr4-python3-runtime

从这里开始,我运行

export CLASSPATH=".:/usr/local/Cellar/antlr/<version>/antlr-<version>-complete.jar:$CLASSPATH"

但当我运行命令时

grun <grammarName> <inputFile>

我收到一条臭名昭著的错误消息:

无法加载

如果您能帮助我了解问题以及如何解决,我将不胜感激。

P、 这不要紧,但你可以看到我在这里编写的代码。

共有1个答案

司空皓
2023-03-14

此错误消息表示TestRig(grun别名使用的)在类路径中找不到Parser(或Lexer)类。如果您将生成的Parser放在包中,您可能需要考虑包名,但主要的是生成的(和编译的)类在您的类路径中。

而且TestRig将grammarName和startRule作为参数,并期望您的输入来自stdin。

我克隆了你的回购协议,以便更仔细地研究你的问题。

为什么grun会给你这个问题,最直接的问题是你在语法文件中指定了你的目标语言(看起来我需要收回关于它不是你语法中的任何东西的评论)。通过在语法中将python指定为目标语言,您没有生成*。TestRig类(由grun别名使用)需要执行的java类。

我从语法中删除了目标语言选项,并能够对您的示例输入运行grun命令。为了正确解析,我冒昧地修改了语法中的一些内容:

  • 删除了目标语言(通常最好在antlr命令行上指定目标语言,以便语法保持与语言无关(如果您想使用TestRig/grun实用程序进行测试,这也很重要,因为您需要Java目标)
  • 将lexer规则更改为parser规则(带有标记的替代项)。使用lexer规则(如“Body”Integer)将为您提供一个包含Body关键字和Integer的标记,稍后您必须将其分开(这也强制“Body”和Integer之间只有一个空格)
  • 将换行符设置为-

我使用的语法是:

grammar ElmerSolver;

// Parser Rules

// eostmt: ';' | CR;

statement: ';';

statement_list: statement*;

sections: section+ EOF;
// section: SectionName /* statement_list */ End;

// Lexer Rules

fragment DIGIT: [0-9];
Integer: DIGIT+;

Float:
    [+-]? (DIGIT+ ([.]DIGIT*)? | [.]DIGIT+) ([Ee][+-]? DIGIT+)?;

section:
    'Header' statement_list End                         # headerSection
    | 'Simulation' statement_list End                   # simulatorSection
    | 'Constants' statement_list End                    # constantsSection
    | 'Body ' Integer statement_list End                # bodySection
    | 'Material ' Integer statement_list End            # materialSection
    | 'Body Force ' Integer statement_list End          # bodyForceSection
    | 'Equation ' Integer statement_list End            # equationSection
    | 'Solver ' Integer statement_list End              # solverSection
    | 'Boundary Condition ' Integer statement_list End  # boundaryConditionSection
    | 'Initial Condition ' Integer statement_list End   # initialConditionSection
    | 'Component' Integer statement_list End            # componentSection;

End: 'End';

// statementEnd: ';' NewLine*;

NewLine: ('\r'? '\n' | '\n' | '\r') -> skip;

LineJoining:
    '\\' WhiteSpace? ('\r'? '\n' | '\r' | '\f') -> skip;

WhiteSpace: [ \t\r\n]+ -> skip;

LineComment: '#' ~( '\r' | '\n')* -> skip;

有了这些变化,我跑了

➜ antlr4 ElmerSolver.g4
javac *.java                                         
grun ElmerSolver sections -tree  < examples/ex001.sif

并得到输出:

(sections (section Simulation statement_list End) (section Equation  1 statement_list End) <EOF>)
 类似资料:
  • 我正在为我的一个讲座的一个项目工作,我需要下载软件包心理学2,以便使用postgresql数据库。不幸的是,当我尝试pip的安装心理g2以下错误弹出: 有人知道为什么会这样吗?提前谢谢!

  • 既然要学习 Go 语言,那么肯定要在本机安装 Go 语言的开发环境,这节课我们就来学习下如何在 Windows 操作系统下安装 Go 语言的开发环境: 1. Go 语言的下载 注:本文以本文撰写时的 Go 语言最新版本,也就是 go.1.13.8 版本为例*。* 1.1 Go语言的下载 下载 MacOS 版本的 Go 语言环境压缩包: curl -O https://studygolang.com

  • 如何在macOS上使用自制程序只安装JRE(而不是JDK)?

  • 我能做什么来解决这个问题?我要尽快处理这件事。 谢谢

  • 如果我在自制的MacOS Mojave上这样做: 我得到: 我已经找了好几天了,也尝试了各种解决方案,比如这里,但是至今没有运气。知道我为什么会出现这个错误以及如何修复它吗? 提前感谢!

  • 本小节我们将介绍如何在 MacOS 平台安装 Java 。 如果你想在其他平台安装 Java,请查看对应平台的安装教程: 在 Windows 上安装 Java 在 Linux 上安装 Java 1. 下载安装包 我们首先打开 Oracle 官网的 JDK 下载地址,找到 Java SE 14 版块,点击 JDK Download 按钮。 点击 JDK Download 按钮后我们会跳转到 JDK