Я знаю, что это не так, но вы разрабатываете язык .На самом деле очень простой язык обработки строк.Поэтому подходите к проблеме так же, как к разработке языка программирования.Ваш рабочий процесс должен быть:
- Lex входной строки в последовательность токенов
- Преобразовать последовательность токенов, используя ваше правило
- Преобразовать последовательность токенов обратно в строку
Первый - сложный, но не такой сложный.Вы можете сделать это.
Ваш лексер может быть смоделирован как конечный автомат .То есть:
- мы отслеживаем «текущее состояние»
- мы обрабатываем каждый символ, по одному
- обработка зависит только от двух вещей: чточто это был за символ, и в каком состоянии мы находимся?
- . Это порождает две вещи: (1) новое текущее состояние (возможно, такое же, как старое состояние) и (2) решение, да или нет, мына границе токена?
- Если мы находимся на границе токена, то мы добавляем новый токен в список токенов.
Когда мы обработали каждый символ, мыполучил список токенов.
Давайте рассмотрим некоторые типичные правила лексера для вашего примера.Мы всегда начинаем с того, что говорим:
- Есть четыре состояния: Нормальное, Равное, Одиночное и Двойное
- Мы начинаем в Нормальном состоянии
Сейчасскажи, что делать в каждом состоянии:
- В нормальном состоянии, если вы получаете
=
, завершите текущий токен, если он есть, запустите новый токен Equals, добавьте =
вэто, и перейдите в состояние равных.В противном случае добавьте символ к текущему токену, если он есть, или создайте новый токен Normal, если его нет. - В состоянии Equals завершите текущий токен.Если вы получили
'
, перейдите в состояние Single и создайте токен Single.Если вы получите "
, создайте Двойной токен и перейдите в Двойное состояние.Если вы получите =
, создайте токен Equals и оставайтесь в состоянии Equals.В противном случае создайте токен Normal и вернитесь в нормальное состояние.Добавьте символ к текущему токену. - В одиночном состоянии добавьте символ к текущему токену.Если вы получили
'
, перейдите в нормальное состояние.В противном случае оставайтесь в одиночном состоянии. - Аналогично для двойного состояния.
- Если у вас закончились символы, завершите текущий токен.
И так далее.Вы видите, как это происходит.У нас есть очень простая маленькая машинка, которая просто просматривает все символы и решает, какой текст мы видели до сих пор, и нужно ли разбивать его на этом этапе или нет.Вы получите список токенов, где каждый токен имеет часть вашей строки.
Теперь вы можете выполнять поиск и замену на своих токенах Normal, зная, что вы не будете делать замены ни на одном из ваших токенов Single, Double или Equals.
Затем поместите замененные строкивместе в том же порядке, и все готово.