Parsing Antlr PLSQL语法未正确解析包名?

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

是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
    ;
对此

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。