Устранение левой рекурсии

У меня есть эта грамматика

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| ^

Другие вопросы по тегам