Генератор парсеров Earley для Java

Я ищу генератор парсера Earley, который способен генерировать выходной код Java, то есть генерирует код Java для лексера и анализатора и позволяет включать действия (реализованные в виде кода Java), которые выполняются для правил грамматики.

Я посмотрел на два генератора парсеров Earley, которые генерируют Java-код ( Pep и PEN), но ни один из них не позволяет встраивать действия в грамматику.

3 ответа

Если я понял ваш вопрос, под "внедрением действий в грамматику" вы подразумеваете вставку семантических действий в грамматику, чтобы они выполнялись "inline" (например, на этапе синтаксического анализа, когда ввод обрабатывается).

Парсеры Earley не подходят для этого, потому что они допускают любые (даже неоднозначные) языковые грамматики без контекста. Смотрите: http://en.wikipedia.org/wiki/Earley_algorithm

В основном: для данного выполнения и данного состояния парсер Earley содержит все возможные состояния синтаксического анализа. Традиционный подход (например, Yacc/Bison) заключается в выполнении семантического действия после завершения правила или частичного ввода. Но при разборе неоднозначной грамматики (например, с конфликтом "уменьшить / уменьшить") парсер Earley позаботится об обоих "сокращениях", но из-за своей неоднозначности не будет знать, какое действие следует выполнить.

Обычный способ использовать парсеры Earley - это проанализировать входные данные и в итоге получить лес деревьев синтаксического анализа, для которых вы позже выполните желаемые действия (например, отбрасывание тех, кого вы знаете, недопустимо, или применение к ним некоторых семантических действий).

Тем не менее, было проведено некоторое исследование по этой теме, пытавшееся выполнить некоторые действия встроенным (извините, нашел только эту ссылку) http://www.springerlink.com/content/602270808666074p/

похоже, что ни один из них не позволяет встраивать действия в грамматику.

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

Не уверен, что это ответ, но одним из генераторов сканера, который я регулярно использую, является JFlex, который выводит код Java.

Он тесно сотрудничает с CUP, который немного ближе к действиям.

Другие вопросы по тегам