Существуют ли бесплатные генераторы парсеров, которые генерируют код C ++ и правильно обрабатывают Unicode? - PullRequest
9 голосов
/ 30 ноября 2010

Задав этот вопрос , я теперь продан за попытку использовать генератор парсеров, где раньше я собирался писать вещи вручную.

Однако я не могу показатьсянайти любой такой синтаксический анализатор, который генерирует код C ++, и при этом я не могу найти синтаксический анализатор, который правильно обрабатывает Unicode.(обратите внимание, что мой ввод в UCS-2 - меня не волнует поддержка битов вне базовой многоязычной плоскости, если это усложняет построение парсера)

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

Существует ли генератор парсера, который отвечает этим двум принципам, или я застрял, делая все вручную?

РЕДАКТИРОВАТЬ: О, и мой проект имеет лицензию BSL, поэтому не может быть много ограничений на использование выходных данных самого генератора синтаксического анализатора.

Ответы [ 8 ]

5 голосов
/ 09 декабря 2010

Есть два пути в C ++.Использование программы, которая генерирует файлы C ++ из грамматики, написанной в свободной форме или с использованием шаблонов.

И у вас есть два варианта при написании грамматики в типах шаблонов.Использование boost :: proto, где каждый оператор переопределяется для построения синтаксического дерева в boost :: fusion (используется в boost :: spirit, boost :: msm, boost :: xpressive).(основная идея здесь: Шаблоны выражений ) или построение дерева выражений, написанного вручную с помощью собственных шаблонов, и сохранение его непосредственно в контейнерах boost :: mpl.Эта техника используется в бисквите.

В бисквите у вас есть

or_<>, seq_<>, char_<>, ..

шаблонов.Печенье основано на ярде, но расширено расширенным диапазоном наддува ::, чтобы получить лучшую способность к подстатьюБиблиотека синтаксического анализа 2

Платформа синтаксического анализа еще одного рекурсивного спуска (YARD) для C ++

4 голосов
/ 04 декабря 2010

Хорошо, это может быть длинный выстрел, но есть генератор синтаксических анализаторов (LALR), поскольку побочный проект для Qt называется QLALR это действительно тонкий слой, лексингвсе еще зависит от вас, но всю работу можно выполнить через QStrings, которые поддерживают Unicode.В нем не так много функциональности, вы пишете грамматику с кодом, который выполняет работу для каждого токена, и он генерирует для вас парсер.Но я успешно использовал его для генерации парсера с ~ 100 правилами, создавая AST анализируемого языка.

1 голос
/ 04 декабря 2010

Парсер не заботится о символах, поскольку он обрабатывает токены.

Лексирование Unicode очень дорого.Это потому, что вы либо платите огромные функции, вызывающие накладные расходы на классификацию, либо убиваете память большими массивами таблиц.Обычно вы поддерживаете только Unicode для определенных мест в PL, таких как строковые литералы и, возможно, идентификаторы, где функция, созданная вручную, может эффективно выполнять эту работу.

Однажды я закодировал в Ocamllex лексер, который бы принимал идентификаторы, предписанные стандартом ISO C ++ (который включает в себя набор диапазонов кодовых точек Unicode, рассматриваемых как «буквы» на разных языках).Хотя число диапазонов кодовых точек довольно мало (около 20 или около того диапазонов), для этого DFA UTF-8 имеет более 64 тыс. Состояний и взорвал генератор лексеров:)

Мой совет: выЯ должен вручную изготовить свой лексер.На самом деле, это очень легко сделать неэффективно.Эффективно сделать это гораздо сложнее: я бы посмотрел на массивы Джуди для поддержки (это самая быстрая структура данных на планете).

1 голос
/ 30 ноября 2010

если вы настроены экспериментировать, этот поддерживает широкие символы, но неясен: http://wiki.winprog.org/wiki/LibCC_Parse

1 голос
/ 30 ноября 2010
1 голос
/ 30 ноября 2010

ANTLR поддерживает Unicode. Он имеет поддержку C ++ (и C, Java и некоторых других языков), хотя я никогда не использовал поддержку C ++, поэтому не уверен, насколько хорошо она разработана.

0 голосов
/ 09 декабря 2010

Я не знаю много теории о парсерах, так что простите, если это не отвечает всем требованиям, но есть Ragel.

Ragel генерирует конечные автоматы. Он (возможно, наиболее известный?) Используется HTTP-сервером Mongrel для Ruby для анализа HTTP-запросов.

Ragel предназначается для простого C (среди прочих), но все данные конечного автомата являются либо статическими константами, либо выделенными стеками, так что это должно устранить некоторые важные проблемы с исключениями C ++. Если требуется специальная обработка исключений, Ragel не уклоняется от разоблачения своих внутренних возможностей. (Не так сложно, как может показаться.)

Unicode должен быть возможен, потому что input - это массив любого базового типа, обычно char, но, вероятно, short или int в вашем случае. Если этого не произойдет, вы можете даже заменить итерацию массива собственным механизмом получения следующего элемента ввода / токена / события.

0 голосов
/ 09 декабря 2010

Попробуйте Boost.Spirit . Вы можете подключить свой собственный «потоковый декодер», который обрабатывает unicode-часть вашей проблемы. Чтобы Sprit работал с wchar_t, это возможно, хотя я сам не пробовал.

...