2016-06-15 68 views
1

Here是PLSQL的Antlr语法文件。Antlr PLSQL语法无法正确解析包名?

但是,它并不完全正确。例如,我有开头的软件包:

CREATE OR REPLACE PACKAGE BODY SCHEMA_NAME.PACKAGE_NAME AS 

从前面的语法文件生成解析器不解析SCHEMA_NAME.PACKAGE_NAME作为package_namepackage_name是ANTLR的解析器规则)。

为了解决这个问题,我已经改变了这个

package_name 
    : id 
    ; 

对此

package_name 
    : id ('.' id)? 
    ; 

我也曾尝试

package_name 
    : id ('.' id_expression)? 
    ; 

,但没有一次成功。 Antlr仍不会包含package name中的最后.PACKAGE_NAME部分。

为什么这不起作用?我怎样才能解决这个问题?

+0

如果其余的规则有任何迹象,你实际上需要':id('。'id_expression)?'(尽管这不应该改变在这种情况下被识别的东西)。 –

+0

@JeroenMostert我也尝试过。那也行不通。 – Utku

+1

我会说,它不工作,因为它是Antlr3语法的一个端口。它尚未完成。这个语法的另一个问题是,它试图一次解析PL/SQL,SQL和DDL语言。但是这些语法应该在下面使用不同的Lexer。 – ibre5041

回答

1

这样的包定义:

package_name 
    : id ('.' id_expression)? 
    ; 

与下一个PL/SQL查询工作良好:

CREATE OR REPLACE PACKAGE BODY SCHEMA_NAME.PACKAGE_NAME AS END; 

我想你在最后忘记END和分号。

此外,如果您发现错误,请向正式ANTLR语法库添加问题或请求,因为此PL/SQL语法未完成,因为它已在评论中提及。