Очень простой C ++ лексический анализ в Java - PullRequest
1 голос
/ 05 февраля 2012

Мне нужно проанализировать некоторые исходные файлы C ++, чтобы сгенерировать очень основную информацию. То, что я пытаюсь сделать, выглядит так:

  1. Предположим, что у нас есть грамматика C ++ и исходный файл C ++ для анализа
  2. Анализатор будет читать исходный файл как лексический анализатор, он будет определять ключевые слова и т. Д., Как определено грамматикой C ++.
  3. После прочтения каждой строки анализатор выведет следующую информацию: Строка №: лексическая информация. Например, рассмотрим это:

    int main(int x, int y)
    {
       return x+y;
    }
    

Программа выведет:

    Line 1: function: main, params: x, y
    Line 2: paren "{"
    Line 3: keyword: "return"

или что-то подобное.

Может кто-нибудь сказать, пожалуйста, как это сделать? Я посмотрел на Antlr и TXL, но я предполагаю, что должен быть более простой способ. Я хотел бы написать программу на Java, которая сделает эту работу. Первое, что я хотел бы сделать, это получить определения функций в файле с соответствующими номерами строк. Любая помощь будет высоко ценится.

Спасибо, Anton

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

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

int
main
(
int
x
,
int
y
)
{
return
x
+
y
;
}

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

К сожалению, синтаксический анализ C ++ общеизвестно труден, и большинство генераторов синтаксического анализаторадолжны быть специально откалиброваны для создания работающего синтаксического анализатора C ++.Я бы посоветовал взглянуть на существующую среду синтаксического анализатора C ++, возможно, что-то вроде Elsa .Это даст вам необходимую информацию в формате, который вы сможете использовать.Другой вариант - подключиться к компилятору C ++ напрямую и обработать базовый AST, который обрабатывает всю информацию о разборе и номере строки.Инструмент Treehydra может быть полезен здесь, хотя вы будете писать код JavaScript, а не Java.

Надеюсь, это поможет!

2 голосов
/ 07 февраля 2012

Ваша лучшая ставка на сегодня, вероятно, CLang .

Несмотря на то, что CLang известен как внешний интерфейс C / C ++ / Objective-C / Objective-C ++ поверх LLVM, он был разработан как набор библиотек конкретно , так что отдельные компоненты могут быть перезаписаны -используется вне самого компилятора.

Интересно, что libclang - это библиотека C, которая оборачивает ядро ​​предварительной обработки и семантического анализа, чтобы обеспечить "синтаксическое дерево" в C, потому что C является языком общения. libclang, в частности, служит основой для привязок Python, поэтому, если вы действительно хотите это в Java, вы должны иметь возможность использовать JNI (если я правильно помню термины) для взаимодействия с ним. Кроме того, интерфейс libclang является чрезвычайно стабильным (в отличие от внутренних представлений компилятора), поскольку означает для использования внешними пользователями.

Привязки Python уже использовались для создания clang_complete, плагина vim для автозаполнения. Вы можете прочитать об этом статью блога , например, об этом (есть отличное видео, показывающее это в действии).

Примечание для инсайдера: привязки Python в настоящее время значительно улучшены Григорием Сзорком под руководством Тобиаса Гроссера, вы можете увидеть объявление Грегори здесь .

...