recursion - 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 在原始语句中出现多个级别时如何处理。
任何帮助,将不胜感激。
解决方案
如果不知道您用来实现此任务的方法,很难说清楚。
但总的来说,建议可能如下所示:
将内部 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))”。
在这两种情况下4000和DBMS_LOB.SUBSTR(field_name2, 6000, 1)只是arguments,无论它们看起来像什么或由什么组成。