iLeonidze
@iLeonidze
xbooster.ru

Как сделать регулярное выражение, определяющее уровень вложенности циклов?

Для программы, содержащей несколько вложенных циклов используя регулярные выражения определить уровень вложенности циклов.
т.е. как оно работает:
Скармливаем регулярке код:
...
for(var i=0;i<10;i++){
    something();
    if(){
        ....
    }
	while(true){
		for(var i=0;i!=3;i++){
			...
		}
	}
}
...

И она нам должна вернуть что вложенность 3.
Программа написана на JAVA, соответственно она использует что-то типа:
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
   i++;
}

Где i - количество совпадений вложенности

Я так понимаю нам надо что-то типа
(for|while){(*^})(if{*})(*^})(for|while)
Но в регулярных выражениях я слабоват и написал глупость, нужна помощь :)
  • Вопрос задан
  • 1035 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Регулярка не предназначена для вычислений и плохо подходит для рекурсивных вложений. ИМХО, здесь нужен лексический анализатор.
Ответ написан
@saltydogd
Как вариант совместить регулярку и последовательное ее применение:
Для получения "объемлющего" цикла (его тела)
(?<=((for\s*(.*[;]{0,2}.*)\n?)|(do\s*)|(while\s*)))\{(?>\{(?<DEPTH>)|\}(?<-DEPTH>)|[^{}]+)*\}

, потом вытаскиваем содержимое матча, и применяем этот же паттерн к нему, глубина +1, и т.д. пока контент по регулярке матчится
ЗЫ регулярка из C#, на яве не проверял, но должна справиться
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Варианты решения (по типу задач, в порядке возрастания нагрузки на CPU):
1. обход "дерева"
2. обратная польская запись
3. регулярные выражения, обратный рекурсивный просмотр по заданному матчу
Выбирайте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы