Разбор языка программирования и определение его компонентов

Я ищу шаги / библиотеки / подходы, чтобы решить эту проблему.

  1. Учитывая исходный файл языка программирования, мне нужно разобрать его и подразделить на компоненты.

Пример: учитывая Java-файл, мне нужно найти в нем следующее.

  1. список импорта
  2. Классы присутствующие в нем
  3. Атрибуты в классе
  4. Методы в нем - по параметрам, если таковые имеются. и т.п.

Мне нужно извлечь их и хранить отдельно. Причина, почему я хочу это сделать?

  1. Я хочу построить Инвертированный Индекс на вершине этих Компонентов.

Примеры запросов к инвертированному индексу 1. Найдите список файлов с именем класса: Пример 2. Найдите позиции, где переменная XXX используется в классе AAA.

Мне нужно для поддержки запросов нравится выше

Итак, у моего плана есть файл, и если я построю из него эти компоненты, было бы легко построить инвертированный индекс поверх него.

Пример: Sample - Class - Sample.java(Keyword - Component - FileName) Я хочу построить инвертированный индекс, как описано выше.

Я вижу, что он внедряется во многих IDE, таких как IntelliJ. Мне интересно, сколько усилий потребуется для создания чего-то подобного. И я хочу попробовать реализовать то же самое по крайней мере для одного языка.

Заранее спасибо.

1 ответ

Вы можете попытаться сделать это "просто" парсером; для вашего конкретного примера этого может быть достаточно.

Но вам понадобится парсер для каждого языка. Если вы придерживаетесь только Java, вы можете найти парсеры Java довольно легко; просто используйте повторно, и вам не нужно изобретать еще один набор правил грамматики для описания Java.

Для более чем одного языка это становится сложнее. Вы можете:

  • Попробуйте найти отдельный парсер для каждого языка. Это может быть своего рода успешным для основных языков. По мере того как вы переходите на менее известные языки, их становится все труднее найти. Если вам это удастся, у вас возникнет проблема, заключающаяся в том, что синтаксические анализаторы, вероятно, несовместимы с технологией; Теперь склейка их вместе для сбора информации об индексе станет беспорядком.
  • выберите одну технологию синтаксического анализа и получите грамматику для всех языков, которые вас интересуют. У вас есть только два реалистичных варианта: YACC/Bison и ANTLR. На практике YACC и Bison использовались для реализации множества языков... но файлы грамматики не собираются в одном месте, поэтому их трудно найти. ANTLR, по крайней мере, имеет один репозиторий, который вы можете найти на их веб-сайте. Так что это может сработать.

Будет достаточно усилий, чтобы собрать все это в единое целое.

Сложность в том, что вам может потребоваться нечто большее, чем простой синтаксис; Возможно, вы захотите узнать значение символов и для каждого символа точно, где оно определено в каком файле. В конце концов, вы хотите, чтобы ваш индекс был точным в масштабе, и для этого потребуется отличить имя переменной от имени функции. Возможно, вам нужны таблицы символов. Как правило, именно здесь ломается чистый синтаксический анализ языков; есть серьезная жизнь после разбора.

В этом случае вам нужен интегрированный набор инструментов для извлечения информации из разных языков.

Наш инструментарий реинжиниринга программного обеспечения DMS является такой структурой, и для него предопределено около 40 языков. Мы используем что-то вроде предложенного OP процесса для построения индексов базы кода для инструментов поиска на основе DMS. Создание чего-то вроде DMS - это огромное усилие.

Другие вопросы по тегам