Я ищу генератор Парсер Эрли, который может генерировать выходной код Java, то есть генерирует Java-код для лексера и парсера и позволяет включать действия (реализованный как код Java), которые выполняются для правил грамматики.
Я посмотрел на два генератора парсеров Эрли, которые генерируют код Java (Пеп и РУЧКА) но ни один из них, похоже, не позволяет встраивать действия в грамматику.




Не уверен, что это ответ, но один из генераторов сканеров, которые я регулярно использую, - это JFlex, который выводит код Java.
Он тесно работает с ЧАШКА, который немного ближе к действиям.
Конечно, я добавил ссылку CUP, которая может быть немного ближе.
Ура, попробую CUP вместе с JFlex.
Я знаю, что это было давным-давно, но разве CUP не для создания парсера LALR? Алгоритм Эрли предназначен для общего CFG, не так ли? Я случайно искал ответ на исходный вопрос ОП, и кажется, что ответ по-прежнему «нет такой вещи», как и год спустя.
none of them seems to allow embedding actions into the grammar.
Вообще говоря, не рекомендуется встраивать действия непосредственно в грамматику. Лучше, если действия будут отделены от грамматики.
Если я понял ваш вопрос, под «встроить действия в грамматику» вы имеете в виду вставку семантических действий в грамматику, чтобы они выполнялись «встроенно» (например, во время фазы синтаксического анализа, когда вводится синтаксический анализ).
Парсеры Earley для этого не подходят, потому что они позволяют использовать Любые (даже неоднозначные) контекстно-зависимые языковые грамматики. См .: http://en.wikipedia.org/wiki/Earley_algorithm
В основном: для данного выполнения и данного состояния синтаксический анализатор Эрли содержит возможные состояния синтаксического анализа все. Традиционный подход (например, Yacc / Bison) заключается в выполнении семантического действия после завершения правила или частичного ввода. Но при синтаксическом анализе неоднозначной грамматики (например, с конфликтом "уменьшить / уменьшить") парсер Эрли позаботится об обоих "сокращениях", но из-за его неоднозначности не будет знать, какое действие следует выполнить.
Обычный способ использования анализаторов Эрли - это анализировать входные данные и в итоге получить лес синтаксических деревьев, на которых вы позже выполняете желаемые действия (например, отбрасывая те, которые, как вы знаете, недопустимы, или применяя к ним некоторые семантические действия).
Тем не менее, было проведено некоторое исследование по этой теме, пытаясь выполнить некоторые встроенные действия (извините, нашел только эту ссылку) http://www.springerlink.com/content/602270808666074p/
Судя по названию (JFlex) и беглому просмотру документации, я бы сказал, что это всего лишь лексер, а часть синтаксического анализа отсутствует.