Если вы хотите точный синтаксический анализ, особенно при наличии языковых сложностей, таких как макросы и условные выражения препроцессора, вам нужны полноязыковые синтаксические анализаторы. Это на самом деле довольно много работы для создания, и большинство языков не подходят для различных типов генераторов синтаксических анализаторов. Также большинство авторов языкового парсера не интересуются другими языками; они, как правило, выбирают какой-то генератор синтаксического анализатора, который, очевидно, не является огромным препятствием при запуске, реализуют свой синтаксический анализатор для конкретной цели, которую они намереваются, и идут дальше.
Следствие: существует очень мало библиотек языковых определений, которые определяются с использованием единого формализма или общей основы. Толпа ANTLR поддерживает один из самых больших наборов, IMHO, хотя, насколько я могу судить, большинство из этих парсеров не совсем способны к производству. Всегда есть Bison, который существует достаточно долго, поэтому можно ожидать, что где-нибудь будет собрана библиотека определений языка, но я ее никогда не видел.
Последние 15 лет я занимался определением базового механизма для анализа и преобразования программ и созданием еще одной такой библиотеки, которая называется DMS Software Reengineering Toolkit . Он имеет парсеры производственного качества для C, C ++, C #, Java, COBOL (версия IBM Enterprise), JCL, PHP, Python и т. Д. Ваше мнение, конечно, может отличаться от моего, но они ежедневно используются в DMS для выполнения задач массовых изменений. на больших телах кода.
Я не знаю других, где набор языковых определений является зрелым и построен на единой основе ... может быть, что компиляторы IBM - это такой набор, но IBM не предлагает оборудование или определения языка.
Если все, что вы хотите сделать, это вычислить простые метрики, вы можете жить только лексерами и специальным подсчетом гнезд (как вы описали). Даже это сложнее, чем кажется, чтобы заставить его работать правильно в большинстве случаев (проверьте синтаксис сумасшедших строк Python, Perl и PHP). Когда все сказано и сделано, даже C - удивительный объем работы только для определения точного лексера: у нас есть несколько тысяч строк сложных регулярных выражений, чтобы охватить все странные лексемы, которые вы найдете в Microsoft и / или GNU C.
Поскольку в DMS есть последовательно определенные зрелые парсеры для многих языков, из этого следует, что DMS имеет последовательно определенные зрелые лексеры для одних и тех же языков. На самом деле мы создаем поисковую систему исходного кода (SCSE) , которая обеспечивает быстрый поиск по большому количеству кодов на нескольких языках, который работает на лексических языках, с которыми встречается, и индексирует эти лексемы для быстрого поиска. Так случилось, что SCSE также вычисляет вид обсуждаемых вами метрик, поскольку он индексирует базу кода, в значительной степени так, как вы описываете, за исключением того, что он использует эти лексеры, точные для языка.