2010-04-02 3 views
8

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

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

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

+1

Существуют библиотеки подсветки синтаксиса (приходят на ум пигменты), которые обрабатывают множество разных языков. Интересно, будет ли один из них предоставить достаточную информацию для вашего дела. Я подозреваю, что нет, но, возможно, стоит посмотреть. – Ken

ответ

6

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

Следствие: существует очень мало библиотек определений языков, которые определены с использованием единого формализма или общего фонда. Толпа ANTLR поддерживает один из больших наборов ИМХО, хотя, насколько я могу судить, большинство из этих парсеров не являются вполне способными к производству. Там всегда есть Bison, который был вокруг достаточно долго, поэтому вы ожидаете, что библиотека определений langauge будет собрана где-нибудь, но я ее никогда не видел.

Я провел последние 15 лет, определяя основы машин для анализа и преобразования программ, а также создал еще одну такую ​​библиотеку, называемую DMS Software Reengineering Toolkit. Он имеет анализаторы качества продукции для C, C++, C#, Java, COBOL (IBM Enterprise), JCL, PHP, Python и т. Д. Ваше мнение может, конечно, варьироваться от моего, но они ежедневно используются с DMS для выполнения задач массового изменения на больших телах кода.

Я не знаю никого другого, где набор определений langauge является зрелым и построен на одном основании ... возможно, компиляторы IBM являются такими наборами, но IBM не предлагает оборудование или определения языка.

Если все, что вы хотите сделать, это вычислить простые показатели, вы можете жить только с лексиками и специальным подсчетом гнезда (как вы описали). Даже это сложнее, чем кажется, что в большинстве случаев он работает правильно (проверьте синтаксисы сумасшедших строк Python, Perl и PHP). Когда все сказано и сделано, даже C - это удивительная работа, чтобы определить точный лексер: у нас есть несколько тысяч строк сложных регулярных выражений, чтобы охватить все странные лексемы, которые вы найдете в Microsoft и/или GNU C.

Поскольку DMS имеет последовательно определенные зрелые парсеры для многих языков, из этого следует, что DMS последовательно определяет зрелые лексеры для тех же языков. Мы на самом деле создаем Source Code Search Engine (SCSE), который обеспечивает быстрый поиск по большим телам кодов на нескольких языках, который работает путем лексинга языков, с которыми он сталкивается, и индексации этих лексем для быстрого поиска. SCSE так просто вычисляет те показатели, которые вы обсуждаете, также, поскольку он индексирует базу кода, почти так, как вы описываете, за исключением того, что он использует эти точные лексеры langauage.

+0

Ира, спасибо за увлекательный ответ! Инструментарий DMS Software Reengineering Toolkit выглядит скорее как более крупная (более продуманная, менее метрическая) версия того, что я пытаюсь сделать. Хм. Интересно, что вы упоминаете PHP, потому что именно это подтолкнуло меня к тому, что мне нужен настоящий парсер. Если я могу спросить, есть ли у вас какие-либо рекомендации, если я решит написать свои собственные парсеры для нескольких языков? (Опять же, глядя на веб-сайт Semantic Designs, стратегии написания такой серии парсеров могут оказаться в секретах торговли! Если это так, пожалуйста, не обращайте внимания на вопрос.) – Arkaaito

+1

Мы не делаем ничего секретного. Стратегия написания парсеров легко заключается в том, чтобы получить самую сильную технологию синтаксического анализа, которую вы можете получить (GLR), самое точное определение языка (PHP не дает этого теста prett плохо), кодирует грамматику и запихивает миллионы строк кода, пытаясь найти сбои. Реальная проблема - просто пот; даже с этой стратегией для каждого языка требуется много энергии. Суть построения DMS заключалась в том, чтобы избежать дублирования общей инфраструктуры для каждого нового языка (я уже делал это в течение 25 лет, прежде чем решил создать DMS). –

2

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

+0

gcc-xml не даст никакой информации о телах функций, просто объявления. Трудно получить полезные показатели, когда вы видите только заголовки функций. –

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