Здравствуйте, создатели / пользователи ANTLR,
Некоторый контекст - я использую синтаксический анализатор PlSql ANTLR4 для упрощенной передачи некоторых запросов из oracle sql в, скажем, spark 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, иначе это было бы немного проще решить.
Спасибо!