Você está na página 1de 14

Transformações em GLCs

Prof. Ricardo Mesquita


Fatoração à Esquerda
⚫ Um problema ocorre quando duas produções
para um mesmo não-terminal começam com
o mesmo token.
➢ A máquina não tem como decidir qual
produção seguir!
⚫ Solução: deixar a decisão sobre qual
produção seguir para o passo seguinte.
➢ Efetuamos o processo de fatoração da gramática

Prof. Ricardo P. Mesquita 02/14


Fatoração à Esquerda
⚫ Considere a gramática
A →  | 
⚫ Usamos fatoração à esquerda para colocá-la
na forma
A → A'
A' →  | 
⚫ Agora, podemos selecionar a produção de
forma imediata, sem indeterminações!

Prof. Ricardo P. Mesquita 03/14


Exemplo:
Fatoração à Esquerda
⚫ Considere:

C → id == num | id != num | id < num

⚫ Fazendo a fatoração, introduzimos um não-


terminal C':

C → id C'
C' → == num | != num | < num

Prof. Ricardo P. Mesquita 04/14


Exemplo:
Fatoração à Esquerda
⚫ Considere

S → if C then S else S | if C then S

⚫ Reescrevendo…
S → if C then S S'
S' → else S | 

Prof. Ricardo P. Mesquita 05/14


Eliminação de Recursividade à
Esquerda
⚫ Analisadores descendentes (top-down) só
processam gramáticas sem recursividade à
esquerda.
⚫ A recursividade à esquerda pode ser reconhecida
em produções do tipo:

A → A | 

Prof. Ricardo P. Mesquita 06/14


Eliminação de Recursividade à
Esquerda
⚫ Eliminação de recursividade direta:
Substituir cada regra da forma

A → A1 | A2 | ... | An | 1 | 2 | ... | m

onde nenhum i começa com A por


A → 1X | 2X| ... | mX
X → 1X | 2X| ... | mX | 
Ou, se produções vazias não são permitidas:
A → 1 | 2 | ... | m | 1X | 2X| ... | mX
X → 1 | 2 | ... | n | 1X | 2X| ... | mX

Prof. Ricardo P. Mesquita 07/14


Eliminação de Recursividade à
Esquerda
⚫ Exemplo: usando o procedimento descrito
anteriormente, elimine a recursividade direta
da produção a seguir
A → Aa | b
⚫ Solução:

A → bX
X → aX | 

Prof. Ricardo P. Mesquita 08/14


Eliminação de Recursividade à
Esquerda
⚫ Eliminação de recursividade indireta:
1. Renomeie os não terminais numa ordem
crescente qualquer
2. Transformação das produções para a forma
Ar → As, onde r  s:
identifique produções Ar → As nas quais r > s
Para cada Ar → As  P nessa situação (r > s), faça
remover Ar → As de P;
para toda As →   P, faça
P = P  { Ar →   }
3. Excluir as recursividades diretas
Prof. Ricardo P. Mesquita 09/14
Exercício
Eliminar a recursividade da seguinte GLC:

G = ({S,A}, {a, b}, P, S)


Onde P = { S → AA | a, A → SS | b }

Prof. Ricardo P. Mesquita 10/14


⚫ Renomeie os não terminais numa ordem crescente qualquer:

S → AA | a
A → SS | b

Vamos fazer: S  A1
A  A2

A1 → A2A2 | a
A2 → A1A1 | b

Prof. Ricardo P. Mesquita 11/14


A1 → A2A2 | a A 1 → A 2A 2 | a
A2 → A1A1 | b A2 → A2A2A1 | aA1 | b
1  2 
Note: Ar = A2  r = 2
As = A 1  s = 1 Eliminando a recursividade direta:
1 2 A 1 → A 2A 2 | a
e mais: As →   A1 → A2A2 | a A2 → aA1B | bB
B → A2A1B | 
Ar → As  A2 → A1A1
Ar As  Símbolos originais:
S → AA | a
Substituindo... A → aSB | bB
B → ASB | 
Prof. Ricardo P. Mesquita 12/14
Exercício
Eliminar a recursividade à esquerda na
seguinte gramática:
E→E+T|T
T→T*F|F
F → (E) | id | num
Resposta:
E → T E'
E' → + T E' | 
T → F T'
T' → * F T' | 
F → (E) | id | num

Prof. Ricardo P. Mesquita 13/14


Dúvidas?

Você também pode gostar