Устранение левой рекурсии
У меня есть эта грамматика
S->S+S|SS|(S)|S*|a
Я хочу знать, как исключить левую рекурсию из этой грамматики, потому что S+S
действительно сбивает с толку...
2 ответа
Посмотрим, сможем ли мы упростить данную грамматику.
S -> S*|S+S|SS|(S)|a
Мы можем написать это как;
S -> S*|SQ|SS|B|a
Q -> +S
B -> (S)
Теперь вы можете устранить левую рекурсию на знакомой территории.
S -> BS'|aS'
S' -> *S'|QS'|SS'|e
Q -> +S
B -> (S)
Обратите внимание, что e это эпсилон / лямбда.
Мы удалили левую рекурсию, поэтому нам больше не нужны Q и B.
S -> (S)S'|aS'
S' -> *S'|+SS'|SS'|e
Вы найдете это полезным, когда имеете дело с устранением левой рекурсии.
Мой ответ с использованием теории из этой ссылки
Как устранить левую рекурсию в контекстно-свободной грамматике.
S --> S+S | SS | S* | a | (S)
-------------- -------
Sα form β form
Left-Recursive-Rules Non-Left-Recursive-Rules
Мы можем написать как
S ---> Sα1 | Sα2 | Sα3 | β1 | β2
Правила преобразования в эквивалентную нерекурсивную грамматику:
S ---> β1 | β2
Z ---> α1 | α2 | α3
Z ---> α1 Z | α2 Z | α3 Z
S ---> β1 Z | β2 Z
куда
α1 = + S
α2 = S
α3 = *
А также β
-продукция не начинается с S
:
β1 = а
β2 = (S)
Грамматика без левой рекурсии:
Нелевая рекурсивная продукция S -> βn
S --> a | (S)
Введите новую переменную Z
со следующими производствами: Z ---> αn и Z -> αn Z
Z --> +S | S | *
and
Z --> +SZ | SZ | *Z
И новый S
производства: S -> βn Z
S --> aZ | (S)Z
Вторая форма (ответ)
Продукция Z --> +S | S | *
а также Z --> +SZ | SZ | *Z
можно сочетать как Z --> +SZ | SZ | *Z| ^
где ^
является нулевым символом.
Z --> ^
использовать для удаления Z
из правил производства.
Итак, второй ответ:
S --> aZ | (S)Z
а также Z --> +SZ | SZ | *Z| ^