У меня есть грамматика, которую я должен использовать JJTree и JavaCC для создания таблицы символов и AST. Хотя я полностью понимаю разделы моего задания для создания таблицы и дерева, грамматика, которую я дал, неоднозначна, содержит левую рекурсию и косвенную левую рекурсию. Его также нужно учитывать. Я проехал по всему Интернету, чтобы попробовать найти методы, которые будут работать для меня.Левый факторинг и удаление левой рекурсии JavaCC
Например:
A :: = Аа | β
может быть изменен на:
A :: = 'βA
A' :: = αA» | ε
Но я не знаю, как применить это к моей грамматике.
Вот раздел правил производства, которые я написал из грамматики, содержащей проблемы, упомянутые выше.
void statement() #STM : {}
{
identifier() <ASSIGNMENT> expression()
| identifier() <ASSIGNMENT> <STRING>
| <EXCLAMATION> expression()
| <QUESTION> identifier()
| identifier() <LBR> arg_list() <RBR>
| <BEGIN> (statement() <SEMIC>)+ <END>
| matched()
| unmatched()
| <WHILE> <LBR> condition() <RBR> <DO> statement()
| {}
}
void matched() #void : {}
{
<IF> condition() <THEN> matched() <ELSE> matched()
}
void unmatched() #void : {}
{
<IF> condition() <THEN> statement()
| <IF> condition() <THEN> matched() <ELSE> unmatched()
}
void expression() #EXPR : {}
{
fragment() ((<PLUS>|<MINUS>|<MULT>|<DIV>) fragment())*
}
void fragment() #FRAG : {}
{
(identifier() | <NUM> | (<PLUS>|<MINUS>) fragment() | expression())
}
Спасибо за ваш ответ, я просмотрел FAQ и ваш учебник, к сожалению, я сталкиваюсь с теми же проблемами. Я понимаю приведенные примеры, но я не понимаю, как применить его к моей грамматике. Грамматика, которую я здесь, мне дали для моего задания, поэтому предполагается, что фрагмент и выражение должны быть там, мне просто нужно удалить левую косвенную рекурсию. С другой проблемой, как это было сделано в заметках моего преподавателя, поэтому меня беспокоит, что вы сказали, что это не очень хороший способ сделать это. –
Что касается выражения и фрагмента, то это выглядит так, как будто ваш преподаватель остановился в круглых скобках вокруг выражения. I.e., это должно быть 'фрагмент(): {} {... | "(" expression() ")"} '. Я предлагаю проверить это с инструктором. Точно так же, если это грамматика, которую дал вам инструктор, вы могли бы указать, что 'matchched 'является unmatchable (он представляет нулевой набор). Это означает, что вы можете удалить '| matched()' из производства 'statement' и вторую альтернативу от' несравненной' продукции. Попробуйте найти вывод для 'statement = * =>, если a тогда b: = c else e: = d' –