Теоретически ли это зависит от задачи?
Можно ли это сделать практически, и будет ли полученный парсер с достаточной производительностью и выходом (например, LLVM IR или GCC gimple) интегрироваться в конкурирующий компилятор?
Теоретически ли это зависит от задачи?
Можно ли это сделать практически, и будет ли полученный парсер с достаточной производительностью и выходом (например, LLVM IR или GCC gimple) интегрироваться в конкурирующий компилятор?
Нет. C++ слишком сложно разобрать для большинства автоматических инструментов, и на практике, как правило, анализируются вручную написанные парсеры. [Редактировать 1-Мар-2015: Добавлено "большинство" и "обычно".]
Среди трудных проблем:
A * B;
, который может быть либо определением переменной B с типом A*
, либо просто умножением двух переменных A и B.A < B > C > D
Где заканчивается шаблон A<>
? Обычные правила "max-munch" для разбора выражений не будут работать здесь.vector<shared_ptr<int>>
, где >>
заканчивается два шаблона, что трудно сделать только с одним токеном (и пробел между ними разрешен). Но в 1>>15
пространство не допускается.И я уверен, что этот список далек от завершения.
Дополнение. Грамматика доступна, но является неоднозначной и, следовательно, недействительна в качестве входных данных для таких инструментов, как Spirit.
Обновление 1-Мар-2015. Как отмечает Ирак Бакстер, известный специалист в этой области, есть некоторые генераторы парсеров, которые могут генерировать парсер, который будет генерировать полный парсерный лес. Насколько мне известно, для выбора правильного разбора требуется семантическая фаза. Я не знаю каких-либо некоммерческих генераторов парсеров, которые могут сделать это для грамматики С++. Для получения дополнительной информации см. этот ответ.
Прости. Я поговорил с его автором, и он сказал, что он не будет полностью разбирать С++, но признает, что он принимает его для разбора некоторых конструкций как двусмысленных.
Так что это больше не ответ!
Я рекомендую вам взглянуть на scalpel. На домашней странице
Scalpel stands for source code analysis, libre and portable library. This is a C++ library which aims to perform full syntax and semantic analysis of any given C++ program.
И
Что заставляет меня думать, что Scalpel можно принять в Boost
Scalpel использует несколько библиотек Boost: Spirit, Wave, shared_ptr (теперь в С++ 0x STL), Необязательный, Тест и т.д. Фактически, он использует исключительно библиотеки Boost и стандартную библиотеку С++, что требуется Boost.
Кроме того, Boost уже предоставляет основанную на духе библиотеку предварительной обработки исходного кода на С++: Wave. Включение библиотеки анализа исходного кода на С++ кажется естественной эволюцией.Забастовкa >
Для "любого другого языка" я однажды попытался создать синтаксический анализатор оболочки script с Spirit. Это оказалось теоретически возможным (я считаю, что это сработает), но оно не было компилируемо на машине с 1 ГБ памяти, поэтому в итоге я отказался.