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

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

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

Ответы [ 3 ]

16 голосов
/ 20 мая 2011

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

Так что это уже не ответ !!


Я рекомендую вам взглянуть на скальпель .Со своей домашней страницы

Скальпель расшифровывается как s wece c ода a анализ, l ibre и p ortabl e l ibrary.Это библиотека C ++, цель которой - выполнить полный синтаксический и семантический анализ любой программы C ++.

И

Что заставляет меня думать, что Скальпель может быть принятinto Boost

Scalpel использует несколько библиотек Boost: Spirit, Wave, shared_ptr (теперь в STL C ++ 0x), Optional, Test и т. д. На самом деле, он использует исключительно библиотеки Boost и C ++стандартная библиотека, необходимая для Boost.

Кроме того, Boost уже предоставляет библиотеку предварительной обработки исходного кода C ++ на основе Spirit: Wave.Включение библиотеки анализа исходного кода C ++ кажется естественной эволюцией.

4 голосов
/ 19 мая 2011

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

2 голосов
/ 01 октября 2011

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

...