2013-11-15 3 views
1

Есть ли способ разобрать исходную строку с пользовательским (e) bnf и получить AST как json? Позвольте мне объяснить, что мне нужно:Источник + (E) BNF = ast.json

  • У меня есть исходная строка и грамматика bnf (также как строка).
  • Я ставлю EBNF как lexer.
  • Добавить источник.
  • Получите АСТ и сохраните его как JSON.

ответ

1

«EBNF как лексер» является бессмысленным. Но остальная часть вашего вопроса может быть истолкована так: «могу ли я получить парсер, управляемый EBNF, для производства АСТ в форме JSON?»

Несомненно.

Большинство генераторов парсеров принимают (E) BNF и «разбор». Большинство из них автоматически не производят АСТ; они заставляют программиста определять, как каждое правило должно генерировать узлы дерева. Те не будут работать для вашей задачи.

Некоторые из них генерируют АСТ как структуры данных автоматически, используя только BNF и исходный файл: ANTLR4 (я думаю), и наш DMS Software Reengineering Toolkit. Ни один из них не производит JSON напрямую, но в обоих случаях следует написать (один раз) общий древоход, который плюет JSON.

BNF DMS будет обрабатывать любую контекстно-свободную грамматику, используя только Правила BNF. ANTLR4 обрабатывает большинство грамматик, но имеет ограничения на то, что вы можете написать (например, некоторые виды левых рекурсий verboten), и требования для вас добавить дополнительную информацию о том, что грамматика не LL (1).

DMS будет напрямую экспортировать XML. См. this example.

+0

Так что, если мне нужно написать древовидный, то не имеет смысла, какое программное обеспечение использовать, даже YACC с кодом C. Я прав? –

+0

Если не произойдет чудо, и кто-то предлагает вам пакет, который делает именно то, что вы указали (я знаю мир парсера довольно хорошо, я думаю, что у него мало шансов), вы не собираетесь делать какую-то работу. YACC хуже, чем ANTLR/DMS, потому что он не создает деревья для вашей грамматики вообще без значительной помощи для вас. Прогулка по дереву довольно легко построить, если у вас есть AST. Если это не очевидно для вас, то я сомневаюсь, что вы сможете использовать результат JSON. –

+0

Итак, нет никакого программного обеспечения для преобразования источника в плоский список лексем, который можно было бы использовать для сборки АСТ? –