Начните с сканирования областей. Вам нужно посчитать открытые скобки {и закрывающие скобки} при прохождении через файл, чтобы вы знали, в какой области вы находитесь. Вам также нужно анализировать // и / * ... * / при сканировании файла , так что вы можете сказать, когда что-то есть в комментарии, а не в реальном коде. Также есть #if, но вам придется скомпилировать код, чтобы знать, как их интерпретировать.
Затем вам нужно разобрать текст непосредственно перед открытием некоторых фигурных скобок, чтобы понять, что они из себя представляют. Ваши функции могут находиться в глобальной области видимости, области классов или области пространства имен, поэтому вы должны иметь возможность анализировать пространства имен и классы, чтобы определить тип рассматриваемой области. Обычно вы можете обойтись довольно простым анализом (большинство программистов используют похожий стиль - например, редко кто-то ставит пустые строки между «классом Fred» и его открытой фигурной скобкой. Но они могут написать «класс Fred {». также есть вероятность того, что они добавят лишнюю строку в строку - например, «шаблон класса __DECLSPEC MYWEIRDMACRO Фред {». Однако, вы можете обойтись довольно простым: «содержит ли строка слово« класс »с пробелами с обеих сторон?» эвристика, которая будет работать в большинстве случаев.
ОК, теперь вы знаете, что находитесь внутри пространства имен и внутри класса, и вы нашли новую открытую область. Это метод?
Основные характеристики метода:
- тип возврата. Это может быть любая последовательность символов и может быть много токенов ("__DLLEXPORT const unsigned myInt32typedef * &"). Если вы не скомпилируете весь проект, у вас нет шансов.
- имя функции. Один токен (но обратите внимание на «operator =» и т. Д.)
- пара скобок, содержащих ноль или более параметров или пустота. Это ваша лучшая подсказка.
- Объявление функции не будет включать в себя определенные зарезервированные слова, которые будут предшествовать многим областям (например, enum, class, struct и т. Д.). И он может использовать некоторые зарезервированные слова (template, const и т. Д.), Которые вам не следует использовать.
Так что вы можете искать пустую строку или строку, оканчивающуюся на; {или}, обозначающий конец предыдущего оператора / области видимости. Затем возьмите весь текст между этой точкой и открытой скобой вашей области видимости. Затем извлеките список токенов и попытайтесь сопоставить скобки со списком параметров. Убедитесь, что ни один из токенов не является зарезервированным словом (перечисление, структура, класс и т. Д.).
Это даст вам «разумную степень уверенности» в том, что у вас есть метод. Вам не нужно много разбора, чтобы получить довольно высокую степень точности. Вы можете потратить много времени на поиск всех особых случаев, которые приводят в замешательство ваш «парсер», но если вы работаете над достаточно последовательной кодовой базой (т.е. просто кодом вашей собственной компании), то вы, вероятно, сможете идентифицировать все Методы в коде довольно легко.