Источник синтаксических анализаторов для языков программирования?

Я стираю старый мой проект, который вычисляет много простых метрик о больших проектах программного обеспечения. Одна из метрик является длиной файлов/классов/методов. В настоящее время мой код "предполагает", где границы класса/метода основаны на очень сыром алгоритме (пересеките файл, поддержав "текущую глубину" и корректируя его каждый раз, когда Вы встречаетесь с закрывшими кавычки скобками; когда Вы возвращаетесь к уровню, класс или метод начались на, полагайте, что он вышел). Однако существует много проблем с этой процедурой и "простой" способ обнаружить, когда Ваша глубина изменилась, является не всегда эффективным.

Чтобы заставить это дать точные результаты, я должен использовать канонический путь (на каждом языке) обнаружения функциональных определений, определений классов и изменений глубины. Это составляет запись простого синтаксического анализатора для генерации деревьев синтаксического анализа, содержащих, по крайней мере, эти элементы для каждого языка, к которому я хочу свой проект быть применимым.

Очевидно, синтаксические анализаторы были записаны для всех этих языков прежде, таким образом, кажется, что мне не придется копировать то усилие (даже при том, что запись синтаксических анализаторов является забавой). Есть ли некоторый проект с открытым исходным кодом, который собирает готовые к использованию библиотеки синтаксического анализатора для набора исходных языков? Или я должен просто использовать ANTLR для создания моего собственного с нуля? (Отметьте: я был бы рад портировать проект на другой язык для использования большого существующего ресурса, поэтому если Вы знаете об одном, не имеет значения, в каком языке он записан.)

8
задан Arkaaito 2 April 2010 в 03:10
поделиться

2 ответа

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

Следствие: существует очень мало библиотек определений языков, которые определены с использованием единого формализма или общей основы. Толпа 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 вычисляет те метрики, которые вы обсуждаете, по мере индексирования базы кода, практически так же, как вы описали, за исключением того, что у него есть эти точные лексемы для языков, которые можно использовать.

6
ответ дан 5 December 2019 в 20:15
поделиться

Если вы разбираете C ++, вас может заинтересовать gcc-xml . Java CUP содержит грамматики для языка Java.

2
ответ дан 5 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: