LINUX.ORG.RU

Анализатор вложенности скобок в регулярных выражениях

 


0

2

Я хочу сделать подсветку кода регулярных выражений и частично сделал (пример-исходник), но мне хотелось сделать типа отличать одни скобки от других, например первая скобка тёмнокрасная, вторая светлокрасная, то есть видеть какая закрытая скобка принадлежит какой открытой скобке, то есть чётные скобки светлокрасные, нечётные тёмнокрасные. Казалось бы алгоритм не сложный, нашёл скобку, добавь +1 к счётчику и бинарный переключатель цвета инвертируй и задай цвет из массива с индексом 1, потом из 0, потом из 1 и т.д. Закрывающие также считаем -1 к счётчику скобок, и тоже если чётный, то один цвет, если нечётный то другой. Ну в общем, когда делал запутался и не работало. Мне предложили сделать со стеком, да почти тоже, со своим не разобрался вставил чужой вариант, но случилось однажды прога упала (при вставке регвыра в поле с подсветкой) и вот думаю, надо со своим разобраться, чтобы понимать в совершенстве как работает и не думать что он является причиной падения.


Тебе правильно всё сказали: делаешь стек, ложишь в него тип скобки и цвет. Когда встречаешь пару - достаёшь из стека и красишь скобку. Всё. Тут дольше думать, что делать в случае ошибок, когда скобки перепутаны ‘([)]’ или непарные встречаются.

bbc69
()
Ответ на: комментарий от bbc69

Да у меня тоже стек был, только номера 1, 2, 3, 4 и потом нашёл закрывающуюся, убрал 4. Зачем мне ещё саму скобку ложить в стек. Ну ладно со свежей головой я уже выложил новый код и примерно понял где моя ошибка. Только я хотел упрощенный код типа идёшь посимвольно и делаешь счётчик вверх/вниз, добавляя в массив позиции, а сейчас я сделал список структур, когда закрытая скобка добавилась, то копирую структуру в новый список. То есть у тех скобок что не закрыты я могу назначить цвет ошибки, а у тех что заполнены правильно сделать не 2 цвета, а больше. Если двух-цветный то есть смысл упрощать алгоритм.

AZJIO
() автор топика
Ответ на: комментарий от AZJIO

Зачем мне ещё саму скобку ложить в стек.

Затем, чтобы их отличать, если их несколько видов ([{()}]). Не, можно несколько стеков организовать. Сомнительно и не окэй.

bbc69
()
Ответ на: комментарий от bbc69

Затем, чтобы их отличать, если их несколько видов ([{()}]).

Внутри {} нет скобок. Внутри перечисления [ ] круглые скобки игнорируются, ну и важно, если перед ()[] стоит нечётное число обратных слешев то они тоже игнорируются. Неигнорируемый класс [ ] пробегает до своего завершения игнорируя любые скобки внутри.

AZJIO
() автор топика
Последнее исправление: AZJIO (всего исправлений: 2)
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария