LINUX.ORG.RU

regexp python поиск между

 , ,


0

1

Доброго времени. Помогите составить запрос для регулярного выражения. Нужно найти всё содержимое функции в коде на си.
Вот мой запрос:

func = re.compile(r'int\s+\w+\(\)(.*?)}', re.DOTALL)

Проблема в поиске конца функции. Нужно каким-то образом определить последнюю фигурную скобку.



Последнее исправление: wojaovlad (всего исправлений: 1)

int

Ты main штоле ищешь? Лучше пройдись по коду, приведи заголовки подпрограмм в одному виду и поставь после имени комментарий типа //GREPME. Дальнейшие действия оставляю в качестве домашнего задания.

Ну или работай с AST, если заняться нечем.

ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 2)
Ответ на: комментарий от aedeph_

Очередной гений парсит контекстно-свободные языки регулярными выражениями.


А какие есть способы парсинга языков прораммирования? Вот нашёл Clang, кое-какие есть примеры для си/си++

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

О, титан мысли подтянулся. Обтёк уже после предыдущего раза?

aedeph_ ★★
()
Ответ на: комментарий от wojaovlad

Руками напиши конечный автомат с магазинной памятью и всё, задачи-то на 5 минут.

aedeph_ ★★
()

Проблема в поиске конца функции. Нужно каким-то образом определить последнюю фигурную скобку.

Проблема в том, что вложенные друг в друга скобки это рекурсивная структура, а регулярные выражения они созданы для поиска повторяющихся структур (типа друг за другом идут пары скобок)

Вобщем гугли рекурсивные регулярные выражения

Yur4eg ★★
()
Ответ на: комментарий от Cactus64k

Там на десяток строк кода.

Гм.

А что будет этот десяток строк делать с таким?

void main()
{
	printf("Hello :}\n");
}

Или с таким:

#define COOL_MACRO {

void main()
COOL_MACRO
	printf("Hello :}\n");
}
anonymous
()
Ответ на: комментарий от Cactus64k

Последнее вообще не скомпилируется.

А, эксперт. Извиняюсь, сразу не понял. Хорошо, пусть будет так

anonymous
()

регулярками такого не сделать. Мало того, что {} рекурсивно вложены, внутри могут быть комментарии, строковые и символьные константы

Только хардкор, только парсер :-) Можно быстро накатать на flex, на 80% используя примеры из туториала, для большинства тестов будет даже работать :-) можно задействовать готовые https://github.com/eliben/pycparser или http://sourceforge.net/projects/lexerproject/

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

Я бы предложил для такой задачи ручной парсер, но дешёвый и сердитый: детектировать открытие функций по «{» в конце строки с нулевой идентацией в начале, и закрытие - по «}» в конце строки с нулевой идентацией в начале, то есть пропускать после открытия функции все строки с отступами - и так до закрытия. Один фиг все правильно проставляют идентацию. А чтобы макросы учесть можно же раскрыть препроцессором исходник через какой-то там специальный флажок gcc.

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

парсер, но дешёвый и сердитый

Придется проходить indent'ом и препроцессором. Полученная функция будет отличаться от той, которая в исходном коде.

Можно сделать жестяной такой трюк. Для него нужно, чтобы программа (по крайней мере до окончания функции) была валидна.

Берем из исходного файла все содержимое до начала функции, и само это начало, сохраняем в файл. Потом начинаем добавлять к этому файлу по одному токену и пытаться компилировать. Как только скомпилировалось, значит все, функция закончилась. Брутфорс вместо регулярок!

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

ручной парсер, но дешёвый и сердитый

всё уже украдено придумано до нас :-) многие старые codestyle подразумевают быстрый поиск существенных имён по простым регуляркам типа «^\w[^\{]*{$»

но это было давно, когда торжествовал разум :-) Теперь стили не несут нагрузки и отражают исключительно эстетство

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)
30 декабря 2015 г.
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.