LINUX.ORG.RU

Косвенная рекурсия в LL(1)-разборе

 , ,


1

2

Помогите избавиться от косвенной рекурсии в контекстно-свободной грамматике, что бы привести её к LL(1)-виду. Уже почти совсем отчаялся. Собственно, грамматика:

<G>::=<E>
<E>::=<A><T>
<A>::=<E>+|<B>
<T>::=<M><P>
<M>::=<T>*|<B>
<P>::=x|y|(<E>)
<B>::=λ (пустая строка)

<G> - аксиома

Гугл измучил поисковыми запросами на русском и английском (увы, больше мне не дано), спрашивал всех, до кого мог дотянуться. Вот, теперь и до ЛОРовцев дотянулся.


Напомни, что такое LL(1) грамматика? И что такое косвенная рекурсия? (<P>::=x|y|(<E>) это место, что ли?) Овежишь память у лоровцев - может вместе что-нибудь придумаем.

Ну и стандатный вопрос. Книгу дракона прочитал?

sanchopanca
()

Тебе надо избавиться только от левой рекурсии. У тебя она в левую сторону наращивается, сделай так, чтобы в правую.

NeXTSTEP ★★
()

Сказал бы сначала, что за грамматика, было бы проще сделать её изначально нормальной.

devsdc ★★
()
Ответ на: комментарий от NeXTSTEP

Ага, и чтобы ещё правое ветвление не появилось при этом.

devsdc ★★
()

Вообще, это очень похоже на грамматику арифметических выражений. Для неё есть канонiчная беспроблемная грамматика:

E->T|E+T
E->F|T*F
F->n|(E)

Без левой рекурсии она выглядит так:

E->TE'
E'->+TE'|ε
T->FT'
T'->*FT'|ε
F->n|(E)

У тебя там, вижу, вместо n какие-то x и y, но это неважно.

devsdc ★★
()
Ответ на: комментарий от sanchopanca

Косвенная рекурсия - в первых трёх правилах.

kosc
() автор топика
Ответ на: комментарий от devsdc

Почти она и есть, но надо именно привести к LL(1) и объяснить, как привёл.

kosc
() автор топика

Есть готовый ответ (пардон, что сразу не выложил):

Преобразование 1:
1) <G>::=<E>
2) <E>::=<E>+<T>
3) <E>::=<T>
4) <T>::=<T>*<P>
5) <T>::=<P>
6) <P>::=(<E>)
7) <P>::=x
8) <P>::=y
<G> - аксиома

Преобразование 2:
1) <G>::=<E>
2) <E>::=<T><D>
3) <D>::=+<T><D>
4) <D>::=λ
5) <T>::=<P><V>
6) <V>::=*<P><V>
7) <V>::=λ
8) <P>::=(<E>)
9) <P>::=x
10) <P>::=y
<G> - аксиома

Связи с автором этого решения, увы, нет, так что спросить его я не могу. Как и не могу быть уверен, что решение правильное.

kosc
() автор топика
Ответ на: комментарий от NeXTSTEP

Ну именно это я и назвал косвенной рекурсией. Левая, это же когда:
<A>::=<A>a
(просто пример)
Или я неправ?

kosc
() автор топика
Ответ на: комментарий от kosc

Это явная левая рекурсия, бывает ещё неявная, которая у тебя в задании.

devsdc ★★
()
Ответ на: комментарий от kosc

Верный алгоритм устранения произвольной левой рекурсии такой:

устранить ε-правила
устранить явную левую рекурсию

Собственно, насколько я понимаю, приведённое решение именно так и делает. Как устранять ε-правила и явную левую рекурсию, гуглится.

devsdc ★★
()
Ответ на: комментарий от devsdc

Спасибо большое, хоть теперь примерно знаю куда копать. А как в гугле называть ε-правила?

kosc
() автор топика
Ответ на: комментарий от devsdc

Всё же непонятно, что это за зверь. Гугл говорит, что это правила вида:
S::=eps, но что есть eps? Один товарищ предположил, что это пустая строка. У меня она обозначена как λ. Он неправ?

kosc
() автор топика
Ответ на: комментарий от devsdc

Препод - наркоман, сир!
А вообще, большое спасибо.

kosc
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.