LINUX.ORG.RU

парсер для BNF в программе на с++


0

1

подскажите существует ли универсальный парсер для BNF (формы Бэкуса-Наура)
в принципе реализовать можно и самому (чем я сейчас и занимаюсь) , но велосипеды строить не хочется.

существуют правила для принимаемых сообщений
NNZ_BB_MESSAGE :=
”TITLE BB”
+ 0{points}+ msgtyp+ ldate+ 0{comment} + (extpoints) + mazid + (aldt) + [oldreqtxt | reqtxt]

само принимаемое сообщение может выглядеть так
-TITLE BB
-MSGTYP GG1 -MAZID BB18G6 -LDATE 9710010200
-BEGIN POINTS
-POZ X3456
-POZ X12C15
-END POINTS
-EXTPOINTS –NUM 017
-REQTXT
ЛЮБОЙ ТЕКСТ
КОТОРЫЙ МОЖЕТ
ВКЛЮЧАТЬ В СЕБЯ И СИМВОЛЫ СЛУЖАЩИЕ ДЛЯ РАЗДЕЛЕНИЯ ПОЛЕЙ

возможно ли получить разобранную структуру (в програме на с++) для дальнейшего анализа?


Ответ на: комментарий от anonymous

+много. только стоит брать 2-ю версию, в ней много улучшений

ott ★★★★★
()

lex, yacc. или комбинаторы из boost.spirit, как выше уже посоветовали

jtootf ★★★★★
()

Только Boost.Spirit.

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

ilias
()
Ответ на: комментарий от ilias

Вписывается прекрасно, просто маны читать надо. Но вроде бы топикстартеру нужно парсить в рантайме, а не в компайлтайме.

Reset ★★★★★
()
Ответ на: комментарий от Reset

> Вписывается прекрасно, просто маны читать надо.

Читал я эти ваши маны. Нормальный exception safety реализовать --- целая проблема.

Но вроде бы топикстартеру нужно парсить в рантайме, а не в компайлтайме.

А что, lex/yacc умеют динамически менять грамматику?

ilias
()
Ответ на: комментарий от ilias

А что, lex/yacc умеют динамически менять грамматику?

вот именно поэтому флекс с бизоном не подойдут.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Честно говоря, я не понимаю, из какой строки сообщения следует необходимость в смене грамматики.

ilias
()

эх, на форте вот парсер EBNF простой и понятный

BNFC умеет: cм C++ mode

недавно он вошёл в GF

внезапно, может быть, хорошо подойдёт GOLD вики примеры

ANTLR неплох, в связке с clojure... есть грамматика clojure, но в ANTLR есть CommonTree.toStringTree(), которая дампит AST в виде S-выражений

но ANTLR — это тяжёлая артилерия: LL(k), LL(*), семантические предикаты. Чтобы им нормально пользоваться, надо прочитать книжку и много примеров.

Это не (E)BNF, поэтому грамматику надо будет адаптировать, хотя это не сложно.

Внезапно, можно взять bison, yacc, и т.п. (cм. википедию)

возможно ли получить разобранную структуру (в програме на с++) для дальнейшего анализа?

Половина генераторов парсеров умеют это делать — автоматически или полуавтоматически строить AST (Abstract Syntax Tree, ещё бывает CST или дерево разбора, parse tree)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.