Если источником строк оператора SQL являются другие кодировщики, вы можете просто настаивать на том, что части, которые необходимо изменить, просто помечаются специальными условными обозначениями, например, пишите $ TABLE вместо имени таблицы или $ TABLEPREFIX, где один необходимо. Затем можно найти места, которые необходимо исправить, с помощью поиска и замены подстроки.
Если у вас действительно есть произвольные строки SQL, и вы не можете их правильно пометить, вам нужно как-то проанализировать строку SQL, как вы заметили. XML-решение, безусловно, является одним из возможных способов.
Другой способ - использовать систему программной трансформации . Такой инструмент может анализировать строку для экземпляра языка, создавать AST, выполнять анализ и преобразование AST, а затем выплевывать исправленную строку.
Набор реинжиниринга программного обеспечения DMS - это такая система. Он имеет синтаксический анализатор PLSQL. И он может использовать шаблонно-ориентированные преобразования для выполнения переписываний, которые вам нужны. Для вашего примера, включающего выбор предметов:
domain PLSQL.
rule use_explicit_column(e: expression):select_item -> select_item
"\e" -> "\e \column\(\e\)".
Чтобы прочитать правило, вы должны понимать, что содержимое внутри кавычек представляет собой абстрактные деревья в каком-либо компьютерном языке, которым мы хотим манипулировать. Фраза «доменный PLSQL» гласит: «используйте анализатор PLSQL» для обработки содержимого строки в кавычках, как он это знает. (У DMS есть много синтаксических анализаторов на выбор). Условия
«expression» и «select_item» являются грамматическими конструкциями на интересующем языке, например, PLSQL в этом случае. Смотрите железнодорожные схемы в вашем справочном руководстве по PLSQL.
Обратная косая черта представляет escape-/ мета-информацию, а не целевой синтаксис языка.
Правило гласит: преобразуйте те проанализированные элементы, которые являются select_item s.
которые состоят исключительно из выражения \ e путем преобразования его в select_item , состоящий из того же выражения \ e и соответствующего столбец ( \ column (\ e) ), предположительно основанный на положении в списке элементов выбора для конкретной таблицы. Вам нужно будет реализовать функцию column , которая может определить соответствующее имя с позиции выбранного элемента. В этом примере я решил определить функцию столбца, чтобы принять выражение интереса в качестве аргумента; выражение фактически передается как совпавшее дерево, и, таким образом, функция столбца может определить, где оно находится в списке select_items , пройдя вверх по дереву абстрактного синтаксиса.
Это правило обрабатывает только выбранные элементы. Вы бы добавили больше правил, чтобы справиться с другими интересующими вас случаями.
Что система преобразования делает для вас:
- разбирать интересующий фрагмент языка
- построить AST
- позволяет вам сопоставлять шаблоны для достопримечательностей (путем сопоставления шаблонов AST)
но с использованием поверхностного синтаксиса целевого языка
- заменить совмещенные рисунки другими рисунками
- вычислить произвольные замены (как ASTs)
- восстановить исходный текст из модифицированных AST.
Хотя написание правил не всегда тривиально, это то, что необходимо, если ваша проблема
указано как изложенное.
Предлагаемое в XML решение - это еще один способ создания таких AST. Он не имеет хороших свойств сопоставления с образцом, хотя вы можете многое получить от XSLT. Что я не знаю, так это то, что у XML есть дерево разбора во всех деталях; синтаксический анализатор DMS обеспечивает это по своему замыслу, так как это необходимо, если вы хотите выполнить произвольный анализ и преобразование.