Как сопоставить прототипы функций C и определения переменных с регулярным выражением? - PullRequest
0 голосов
/ 11 октября 2011

Об этом уже спрашивали, но у меня есть специальный случай, который я смогу обработать с помощью регулярного выражения.

Я пытаюсь прочитать журнал предупреждений из Doxygen, и источник находится в C (до сих пор я боюсь думать о C ++).

Мне нужно сопоставить функции и определения переменных, найденные в этом журнале, и подобрать имена функций и переменных.

Более конкретно, журнал имееттакие строки, как

/home/me/blaa.c:10:Warning: Member a_function(int a, int b) (function) of file blaa.c is not documented

и

/home/me/blaa.h:10:Warning: Member a_variable[SOME_CONST(sizeof(SOME_STRUCT), 64)*ANOTHER_CONST] (variable) of file blaa.h is not documented

Со всеми вариациями, которые вы можете иметь в C ...

Могу ли я сопоставить эти варианты только с одним регулярным выражением или я должендаже не беспокоить?Слово в списке после «параметра» (я использую его свободно, чтобы включить переменные) в скобках - это набор определенных слов (функция, переменная, перечисление и т. Д.), Поэтому, если больше ничего не помогает, я могу сопоставить их сЯ бы предпочел, если бы в журналах были типы, которых я еще не видел.

Моя текущая попытка выглядит как

'(?P<full_path>.+):\d+:\s+Warning:\s+Member\s+(?P<member_name>.+)([\(\[](\**)\s*\w+([,)])[\)\]))*\s+\((?P<member_type>.+)\) of file\s+(?P<filename>.+)\s+is not documented'

(я использую пакет Python re.)

Но все равно не удается поймать все.

РЕДАКТИРОВАТЬ: Там есть какая-то ошибка, которую я сделал в последнем редактировании.

1 Ответ

1 голос
/ 12 октября 2011

Вы разрешали ноль или более совпадений между <member_name> и <member_type>.Попробуйте вместо этого:

'(?P<full_path>.+):\d+:\s+Warning:\s+Member\s+(?P<member_name>\w+).*\s+\((?P<member_type>\w+)\) of file\s+(?P<filename>.+)\s+is not documented'
...