Здравствуйте, создатели/пользователи ANTLR,
Некоторый контекст - я использую синтаксический анализатор PlSql ANTLR4 для облегченной передачи некоторых запросов из oracle sql, скажем, в искровой sql. У меня есть настройка класса прослушивателя, которая расширяет базовый прослушиватель.
Пример проблемы. Допустим, ввод выглядит примерно так:
SELECT to_char(to_number(substr(ATTRIBUTE_VALUE,1,4))-3)||'0101') from xyz;
Теперь я хотел бы заменить || с CONCAT и to_char с CAST как STRING, так что окончательный запрос выглядит так:
SELECT CONCAT(CAST(to_number(substr(ATTRIBUTE_VALUE,1,4))-3) as STRING),'0101') from xyz;
В моем классе слушателя я переопределяю для этого две функции из базового слушателя — конкатенацию и string_function. В них я использую замену tokenStreamRewriter для выполнения необходимых преобразований. Поскольку tokenStreamRewriter оценивается лениво, я бегу к проблеме ->
java.lang.IllegalArgumentException: replace op boundaries of
<ReplaceOp@[@38,228:234='to_char',<2193>,3:15]..[@53,276:276=')',
<2214>,3:63]:"CAST (to_number(substr(ATTRIBUTE_VALUE,1,4))-3 as STRING)">
overlap with previous <ReplaceOp@[@38,228:234='to_char',<2193>,3:15]..
[@56,279:284=''0101'',<2209>,3:66]:"CONCAT
(to_char(to_number(substr(ATTRIBUTE_VALUE,1,4))-3),'0101')">
Ясно, что проблема заключается в том, что две мои функции прослушивателя пытаются заменить/преобразовать текст на перекрывающихся границах.
Есть ли какой-нибудь обходной путь для проблем с перекрытием территорий для ANTLR4? Я уверен, что люди постоянно сталкиваются с такими вещами.
Я был бы признателен за любые обходные пути, даже грязные на данный момент :)
Я понял, что ANTLR4 не позволяет нам модифицировать исходный AST, иначе это было бы немного проще решить.
Спасибо!