Я набрался опыта в парсинге программного кода и думаю, написать об этом статью на хабре.
Краткая теория:
1. Как и в любой программе, необходимо спланировать объекты кода. Это могут быть, например, объект class. У объекта класс спланируем метод, getPrivateFields(), getPublicFields(), getPrivateMethods и т.д.
У объекта method спланируем кроме параметров и возвращаемого значения, например, дерево getCodeAreaTree() которое будет получать участки кода метода с различной видимостью локальных переменных. Переменные родительского узла видны дочерним узлам, а переменные локальные для дочернего узла, не видны родительским.
Ну а у codeArea спланируем какую нибудь коллекцию инструкций. И так далее. Удобно, если объекты инструкций, переменные и методы будут иметь метод getReference ссылающийся на объявление этих методов и переменных.
После такого планирования мы уже будем видеть структуру дерева программного кода, которое, правда, еще нужно получить.
Начнем с низов. Проведем лексический анализ методом конечных автоматов. Я использую для этого упомянутый выше jflex. Смысл этой утилиты в том, что в нее на вход подаешь описание лексики языка в форме .flex (примеров в инете куча), а на выходе она тебе выдает готовый код парсера текста на конечных автоматах, логика которого красиво разобьет все на пробельные участки, комментарии и лексемы кода.
Далее в дело вступает конечный автомат работающий на этих лексемах. Запускаем цикл от первой до последней лексемы кода и оперируя состояниями получаем абстрактное дерево программной структуры. То есть выделяем где участки кода, где объявления, где директивы импорта.
Ну и далее третий этап. Конвертация абстрактной структуры программного кода в наши объекты, что мы спланировали в п.1. Обходим дерево и расставляем необходимые референсы к объявлениям, заполняем приваты, чтобы заработали всякие getPublicFields(), getPrivateMethods для каждого объекта дерева.
Когда мы получим спланированное дерево, то будем считать задачу выполненной. Далее это можно прицеплять в качестве плагина к какому нибудь текстовому редактору и вуаля, у вас готовый инструмент для работы с вашим кодом.