2012-07-23 3 views
0

ли Возможное извлечение вызовов функций в исходных файлах C, например,имена функций Извлечение из вызовов функций в файлах C

... 
myfunc(1); 
... 

или

... 
myfunc(anotherfunc(1, 2)); 
.... 

только с помощью регулярных выражений Ruby? Если нет, может ли быть полезен генератор синтаксического анализатора, такой как ANTLR?

ответ

0

Это не полное доказательства шаблона для выяснения вызовов методов, но должен только служить модель, которая вас интересует.

[a-zA-Z\s]*\([a-zA-Z0-9]*(\([a-zA-Z0-9\s]*[\s,]*[\sa-zA-Z0-9]*\))?\); 

Это регулярное выражение будет соответствовать следующим шаблонам метод вызова.

1. myfunc(another(one,two)); 
2. myfunc(); 
3. myfunc(another()); 
4. myfunc(oneArg); 
0

Вы также можете использовать регулярные выражения уже написанные от грамматики, которые используются в Emacs - imenu, ETags, ECB, с-режим и т.д.

0

В чистом виде вы не можете, потому что возможность рекурсивно встраивать вызовы функций делает его нерегулярным. То есть вы не можете написать регулярное выражение, которое соответствует произвольному вызову функции и извлекает все содержащиеся имена функций.

Но, конечно, вы можете искать поэтапно для последовательностей символов, разрешенных в именах функций (то есть, должны начинаться с буквы или подчеркивания, а затем буквы, подчеркивания, числа и т. Д.), А затем левая скобка, Или что-то вдоль этих линий.

Имейте в виду, что любой такой подход подвержен ошибкам: что делать, если функция упоминается в комментарии? Что, если оно появляется внутри строковой константы? Действительно, чтобы поймать все особые случаи, вам придется (почти) правильно разобрать полный файл C.

Большинство современных двигателей регулярных выражений имеют функции для анализа более обычных языков, например. с помощью обратных ссылок на подвыражения. Но вы не должны идти по этой дороге. С помощью соответствующего анализатора, такого как ANTLR, который может анализировать контекстно-бесплатные языки, вы сделаете свою собственную жизнь намного проще.

Смежные вопросы