首页 > 解决方案 > ANTLR 递归替换

问题描述

我想使用 antlr 更改 DBMS_LOB.substr: 示例 1:输入:

DBMS_LOB.SUBSTR(field_name1, 4000, 1)

输出:

SUBSTR(field_name1, 1, 4000)

我们需要做两件事:1) 删除 DBMS_LOB。2)交换第二和第三个参数

我能够覆盖特定令牌的规则并将其更改为处理上述问题。

处理递归的问题:我有这样的输入:

DBMS_LOB.SUBSTR(field_name1, DBMS_LOB.SUBSTR(field_name2, 6000, 1), DBMS_LOB.SUBSTR(field_name3, 8000, 1))

我想改变类似的东西:

SUBSTR(field_name1, SUBSTR(field_name3, 1, 8000), SUBSTR(field_name2, 1, 6000))

当 DBMS_LOB.SUBSTR 在原始语句中出现多个级别时如何处理。

任何帮助,将不胜感激。

标签: recursionurl-rewritingantlr

解决方案


如果不知道您用来实现此任务的方法,很难说清楚。

但总的来说,建议可能如下所示:

将内部 DBMS_LOB.SUBSTR 语句视为单个非终结语句

我的意思是,在处理任何一个时,您的替换算法应该没有区别

“DBMS_LOB.SUBSTR(field_name1, 4000, 1)”

或者

“DBMS_LOB.SUBSTR(field_name1, DBMS_LOB.SUBSTR(field_name2, 6000, 1), DBMS_LOB.SUBSTR(field_name3, 8000, 1))”。

在这两种情况下4000DBMS_LOB.SUBSTR(field_name2, 6000, 1)只是arguments,无论它们看起来像什么或由什么组成。


推荐阅读