Я пытаюсь устранить леворекурсивный из следующего отрывка грамматики -Оставшись устранение рекурсии в грамматике LL1
expression := fragment ((+ | - | * | /) fragment)*
fragment := identifier | number | (+ | -) fragment | expression
Вопрос заключается в том, что выражение может перейти к фрагменту, можно перейти к выражению. Я пробовал кучу способов его устранения, некоторые выглядят так, как будто они работают (в JavaCC), но я a) не уверены в их правильности, и б) довольно уверен, что я нарушил ассоциативность, изменив структуру грамматики.
Я уверен, что мне нужно выражение», и имеют
fragment := identifier | number | (+ | -) fragment | expression
изменен
fragment := identifier | number | (+ | -) fragment | expressionPrime
Но я не уверен в пути формирования expressionPrime. Оба
expressionPrime := identifier | number | (+ | -) fragment | {}
И
expressionPrime := ((+ | - | * | /) fragment)*
Казаться работать, но я знаю, что это не может быть и другое.
Любые идеи будут высоко оценены, даже точка в правильном направлении.
Есть хорошо документированные методы для удаления левой рекурсии: что вы пробовали? –
Почему, по-вашему, вам нужно «выражение» в «фрагменте» вообще? – user2357112
Изменен вопрос, чтобы отразить то, что я пробовал. Часть проблемы, с которой я столкнулся, - это формулировка, примеры, которые я читал, используют такие произведения, как A -> Ab | c, чтобы проиллюстрировать, но мне очень сложно связать части грамматики выше с их соответствующими частями в учебниках. – Saf