Подтвердить что ты не робот

Может ли Boost.Spirit теоретически/практически использоваться для синтаксического анализа С++ (0x) (или любого другого языка)?

Теоретически ли это зависит от задачи?

Можно ли это сделать практически, и будет ли полученный парсер с достаточной производительностью и выходом (например, LLVM IR или GCC gimple) интегрироваться в конкурирующий компилятор?

4b9b3361

Ответ 1

Нет. 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. Как отмечает Ирак Бакстер, известный специалист в этой области, есть некоторые генераторы парсеров, которые могут генерировать парсер, который будет генерировать полный парсерный лес. Насколько мне известно, для выбора правильного разбора требуется семантическая фаза. Я не знаю каких-либо некоммерческих генераторов парсеров, которые могут сделать это для грамматики С++. Для получения дополнительной информации см. этот ответ.

Ответ 2

Прости. Я поговорил с его автором, и он сказал, что он не будет полностью разбирать С++, но признает, что он принимает его для разбора некоторых конструкций как двусмысленных.

Так что это больше не ответ!


Я рекомендую вам взглянуть на 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 >

Ответ 3

Для "любого другого языка" я однажды попытался создать синтаксический анализатор оболочки script с Spirit. Это оказалось теоретически возможным (я считаю, что это сработает), но оно не было компилируемо на машине с 1 ГБ памяти, поэтому в итоге я отказался.