Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试ANTLR4中包含的PL/SQL语法?_Java_Oracle_Parsing_Plsql_Antlr4 - Fatal编程技术网

Java 如何测试ANTLR4中包含的PL/SQL语法?

Java 如何测试ANTLR4中包含的PL/SQL语法?,java,oracle,parsing,plsql,antlr4,Java,Oracle,Parsing,Plsql,Antlr4,我刚刚开始使用ANTLR,并想尝试使用语法测试解析一些简单的PL/SQL语句。我遵循中使用的格式 执行以下命令时不会出现问题: antlr4 plsql.g4 java org.antlr.v4.Tool plsql.g4 javac plsql*.java 在入门示例中,它们运行以下命令: grun Hello r -tree 其中“Hello”是语法的名称,“r”是其产生式规则之一。语法表示“sql_脚本”生成规则由零个或多个单元语句或sqlplus命令组成,后跟输入流的结尾: sql_

我刚刚开始使用ANTLR,并想尝试使用语法测试解析一些简单的PL/SQL语句。我遵循中使用的格式

执行以下命令时不会出现问题:

antlr4 plsql.g4
java org.antlr.v4.Tool plsql.g4
javac plsql*.java
在入门示例中,它们运行以下命令:

grun Hello r -tree
其中“Hello”是语法的名称,“r”是其产生式规则之一。语法表示“sql_脚本”生成规则由零个或多个单元语句或sqlplus命令组成,后跟输入流的结尾:

sql_script
    : (unit_statement | sql_plus_command)* EOF
    ;
因此,我尝试调用PL/SQL解析器,如下所示:

grun plsql sql_script -tree
但我得到了以下错误:

Can't load plsql as lexer or parser

调用此语法的解析器以生成简单PL/SQL语句的解析树的正确方法是什么?我在Windows机器上使用JDK 8。这是一个显示我的终端窗口内容的示例。

JVM是罪魁祸首。在检查系统范围的%CLASSPATH%环境变量(如果存在)之前,它不会首先自动检查工作目录。将“.”添加到%CLASSPATH%环境变量的开头将解决此问题,并允许命令按预期工作。请参阅Windows 10中“编辑环境变量”工具的这一部分,以了解其外观


可以通过控制面板->系统和安全->系统访问此工具,单击左侧显示“高级系统设置”的项目,然后单击标记为“环境变量”的按钮。选择一个变量,然后单击“编辑…”按钮将在屏幕截图中显示该工具。

我像您一样执行了所有命令,一切正常!当我删除
plsqlLexer.class
文件时,我设法重现错误。是否确实在存在
plsqlLexer.class
plsqlParser$*.class
文件的目录中执行
grun-plsql\u script-tree
命令?是。这是一个显示我的终端窗口内容的示例。在屏幕截图上:为什么用
ls
命令列出的所有
plsqlParser$*.class
文件都用单引号括起来
'
?@Quepas我不确定。我认为这只是Windows命令提示符的一个怪癖。如果我在PowerShell中使用相同的命令,它将不带单引号地显示它们。没有这样的更改。我从1997年开始使用Java,它一直是这样工作的<代码>是默认的类路径,如果您根本没有,但如果有,它从来不会自动假装有一个。@EJP我的理解是,该行为是特定于JVM实现的。例如,我不记得OpenJDK是以这种方式工作的。@EJP我更改了答案的措辞,以便不将责任归咎于行为的改变,而是简单地描述了当前的行为。不管怎样,这都是正确的答案;作为提出问题的人,我可以确认这是问题的解决方案。如果你收回你的否决票,我将不胜感激。