2011-12-28 2 views
3

Знаете ли вы о синтаксическом синтаксическом модуле (написанном на Ruby, Python, Javascript ...), который, учитывая список токенов и грамматику в виде EBNF (передается как простая строка), возвращает проанализированное дерево? Ближайший я нашел это SimpleParse, который является хорошей библиотекой, но, к сожалению, он использует одноэтапный синтаксический анализ (без токенизации). Если возможно, я предпочел бы не использовать библиотеки, в которых реализация запутывается самим языком (pyparsing, treetop, ...).Модуль синтаксиса синтаксиса EBNF

Я не беспокоюсь о лексинге/токенизации, потому что есть много доступных библиотек (и даже писать собственное довольно просто), но реализация парсера ENBF - не совсем тривиальная задача. Я проверил Python wiki LanguageParsing и протестировал некоторые из них безрезультатно (возможно, я забыл тот, который я ищу, есть так много ...)

+0

Ну, какой синтаксический анализатор жизнеспособный, в значительной степени зависит от грамматики, которую вы анализируете, и чего вы хотите сделать с помощью ввода ... Почему это должно быть языковым агностиком и EBNF, кстати? Если вы хотите что-либо из ввода (AST или что-то еще), вам все равно придется писать код вручную, а чистый EBNF полезен только для распознавания «совпадений/не соответствует». – delnan

+0

@delnan: Я пишу транкомпилятор (в основном, чтобы играть с лексерами и парсерами, ничего серьезного), и в качестве первого шага я хотел бы, чтобы мой язык описывался как EBNF (или любой другой описатель синтаксиса) и анализировался от него (и позже генерировал из него AST или что-то еще). Советы в любом направлении добро пожаловать. – tokland

ответ

0

После нескольких поисков я решил взять типичный подход lex/yacc с использованием Jison для node.js.

1

Если вы знакомы с Clojure, я нашел Instaparse, чтобы быть отличным. Вы можете написать в «ванильном» EBNF в виде многострочной строки (или в отдельном файле и даже расширять EBNF за пределами контекстно-свободных грамматик в контекстно-зависимые грамматики (хотя я не играл так много).

+0

Я знаком с Clojure, я посмотрю, спасибо! – tokland

Смежные вопросы