Parsing Antlr PLSQL语法未正确解析包名?
是PLSQL的Antlr语法文件 然而,这并不完全正确。例如,我有一个以以下内容开头的包:Parsing Antlr PLSQL语法未正确解析包名?,parsing,antlr,Parsing,Antlr,是PLSQL的Antlr语法文件 然而,这并不完全正确。例如,我有一个以以下内容开头的包: CREATE OR REPLACE PACKAGE BODY SCHEMA_NAME.PACKAGE_NAME AS 从前面的语法文件生成的解析器不会将SCHEMA\u NAME.PACKAGE\u NAME解析为PACKAGE\u NAME(PACKAGE\u NAME是Antlr解析器规则) 为了解决这个问题,我改变了这个 package_name : id ; 对此 packag
CREATE OR REPLACE PACKAGE BODY SCHEMA_NAME.PACKAGE_NAME AS
从前面的语法文件生成的解析器不会将SCHEMA\u NAME.PACKAGE\u NAME
解析为PACKAGE\u NAME
(PACKAGE\u NAME
是Antlr解析器规则)
为了解决这个问题,我改变了这个
package_name
: id
;
对此
package_name
: id ('.' id)?
;
我也试过了
package_name
: id ('.' id_expression)?
;
但没有一个成功。Antlr仍然不会将最后一个.PACKAGE\u NAME
部分包含在包名
中
为什么这不起作用?如何解决此问题?此类包定义:
package_name
: id ('.' id_expression)?
;
可以很好地处理下一个PL/SQL查询:
CREATE OR REPLACE PACKAGE BODY SCHEMA_NAME.PACKAGE_NAME AS END;
我想你忘了END
和结尾的分号
此外,如果您发现一个bug,请向官方的ANTLR语法存储库添加一个问题或pull请求,因为此PL/SQL语法没有完成,因为它在评论中已经提到过。如果其余规则是任何指示,您实际上想要
:id('.'id\u表达式)
(尽管这不应改变在本案例中被识别的内容)@Jeroenmoster我也试过了。那也没用。我想说,它没用,因为它是Antlr3语法的一个端口。它还没有完成。这个语法的另一个问题是,它试图同时解析PL/SQL、SQL和DDL语言。但是这些语法下面应该使用不同的Lexer。