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)
Но в регулярных выражениях я слабоват и написал глупость, нужна помощь :)
  • Вопрос задан
  • 996 просмотров
Пригласить эксперта
Ответы на вопрос 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. регулярные выражения, обратный рекурсивный просмотр по заданному матчу
Выбирайте.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы