ANTLR Рекурсивная замена - PullRequest
0 голосов
/ 05 марта 2019

Я хочу изменить DBMS_LOB.substr, используя antlr: Пример1: Ввод:

DBMS_LOB.SUBSTR(field_name1, 4000, 1)

Вывод:

SUBSTR(field_name1, 1, 4000)

Нам нужно сделать 2 вещи: 1) удалить DBMS_LOB.2) поменяйте местами 2-й и 3-й аргументы

Я могу переопределить правило для конкретного токена и изменить его для обработки вышеуказанного.

Проблема обработки рекурсивно: у меня есть что-то вроде вводаэто:

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 появляется на нескольких уровнях в исходной инструкции.

Любойпомощь будет оценена.

1 Ответ

0 голосов
/ 05 марта 2019

Сложно сказать, не зная подхода, который вы используете для реализации этой задачи.

Но в целом совет может выглядеть так:

Подумайте о внутреннем 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) являются просто аргументами , независимо от того, как они выглядят или состоят из них.

...