Você está na página 1de 23

Construo de Compiladores

Analise Sinttica II

Universidade Federal da Paraba Departamento de Informtica

Mtodos de Analise Sinttica


Podem seguir duas abordagens:
Mtodos bottom-up
Utilizam derivao inversa Tenta casar partes da entrada com o lado direto das produes

Mtodos top-down Sempre partem da raiz (top-down)


So baseados em derivaes sucessivas Devem usar busca direcionada

Tais abordagens pode ser com ou sem Backtracking


Com = maior nmero de gramticas, porm mais complexo e lento Sem = menor nmero de gramticas, porm simples e eficiente
Universidade Federal da Paraba Departamento de Informtica

Mtodo Bottom-up
Exemplo: Shift-Reduce atravs de Pilhas
Pilha que armazena os smbolos da gramtica Buffer que contem a sentena a ser reconhecida Tabela de de Precedncia (TP) de operadores (opcional)

TP - determinar as relaes de precedncia entre os operadores e ser consultada para determinar o curso de ao em cada passo. Convencionando que $ o smbolo inicial da pilha e, ainda, marca o final da sentena a ser reconhecida, e que w a sentena a ser reconhecida teremos inicialmente: PILHA: $ e BUFFER: w$

Universidade Federal da Paraba Departamento de Informtica

Mtodo Bottom-up
Procedimento de anlise shift-reduce Transfere (shift) os smbolos da entrada um a um para a pilha at que o lado direito de uma produo aparea no topo da pilha. Quando isto ocorrer, o lado direito da produo deve ser trocado (reduced) pelo lado esquerdo da produo em questo. Esse processo deve ser repetido at que toda a sentena de entrada tenha sido analisada. Ao final do processo, a sentena estar sintaticamente correta se e somente se a entrada estiver vazia e a pilha contiver apenas o smbolo inicial da gramtica.
Universidade Federal da Paraba Departamento de Informtica

Mtodo Bottom-up
Exemplo:
y2*y
Gramtica

Universidade Federal da Paraba Departamento de Informtica

Mtodo Bottom-up
Trs maneiras de tratar conflitos
Implementar um mtodo lookahead Alterar a gramtica para evitar ambiguidade Utilizar a tabela de precedncia A gramtica no deve conter produes vazias O lado direito das produes das gramticas no pode possuir dois no-terminais adjacentes

Universidade Federal da Paraba Departamento de Informtica

Mtodo Bottom-up
A gramtica G = ({E}, {id, +, -, *, /, (, )}, P, E}, onde P:
E E+E | E-E | E*E | E/E | E-E | (E) | id

Exemplo de tabela de precedncia

Quando a relao de precedncia entre o smbolo do topo da pilha e a posio atual da sentena for < ou = feito um shift (empilha smbolo corrente do buffer na pilha) Quando a relao de precedncia entre o smbolo do topo da pilha e a posio atual da sentena for > feito um ou mais reduce na pilha

Universidade Federal da Paraba Departamento de Informtica

Mtodo Bottom-up
J trs mensagens de erro
e1: falta operando e2: parnteses no balanceados e3: falta operador

Universidade Federal da Paraba Departamento de Informtica

Mtodo Top-down
Exemplo:
1 Gramtica ambgua TR T aTc R R RbR

2 ?

Universidade Federal da Paraba Departamento de Informtica

Mtodo Top-down
Podemos escolher uma das seguintes opes: Anlise preditiva recursiva
Construo de um conjunto de procedimentos, normalmente recursivos, um para cada smbolo no-terminal da gramtica em questo

Anlise preditiva LL(1)


Implementa o mtodo descendente utilizando explicitamente uma pilha

Universidade Federal da Paraba Departamento de Informtica

Mtodo Top-down
Anlise preditiva recursiva:
Seja a gramtica
<cmd> begin <lista_cmds> end | while <condio> do <cmd> | if <condio> then <cmd>

<expr> <termo> + <expr> | <termo> <termo> <fator> * <termo> | <fator> <fator> <primrio> ** <fator> | <primrio> <primrio> IDENT | NMERO | ( <expr> )

Podemos reescrev-la como:


<expr> <termo> { + <expr> }* <termo> <fator> { * <termo> }* <fator> <primrio> { ** <fator> }* <primrio> IDENT | NMERO | ( <expr> )
Universidade Federal da Paraba Departamento de Informtica

Mtodo Top-down
Anlise preditiva recursiva:
Procedimento analisador_sinttico { obtenha_smbolo(); /* chama o analisador lxico */ EXPR(); } Procedimento EXPR() { TERMO(); se smbolo_lido = '+' ento { obtenha_smbolo(); EXPR(); } }
Universidade Federal da Paraba Departamento de Informtica

<expr> ::= <termo> { + <expr> }*

Mtodo Top-down
Anlise preditiva recursiva:
Procedimento TERMO() { FATOR(); se smbolo_lido = '*' ento { obtenha_smbolo(); TERMO(); } } <termo> ::= <fator> { * <termo> }*

Procedimento FATOR() { PRIMRIO(); se smbolo_lido = '**' ento { obtenha_smbolo(); FATOR(); } }


Universidade Federal da Paraba Departamento de Informtica

<fator> ::= <primrio> { ** <fator> }*

Mtodo Top-down
Anlise preditiva recursiva:
Procedimento PRIMRIO() { <primrio> ::= IDENT | NMERO | ( <expr> ) se smbolo_lido = IDENT ento { /* trate adequadamente um identificador */ obtenha_smbolo(); } seno se smbolo_lido = NMERO ento { /* trate adequadamente um nmero */ obtenha_smbolo(); } seno se smbolo_lido = '(' ento { obtenha_smbolo(); EXPR(); se smbolo ')' ento ERRO( "falta )" ); seno obtenha_smbolo(); } }
Universidade Federal da Paraba Departamento de Informtica

Mtodo Top-down
Anlise preditiva recursiva Limitaes do mtodo:
Entra em ciclo (loop) para gramticas recursivas esquerda No lida com regras no-determinsticas(A e A ) Requer uma linguagem com recursividade na implementao

Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica
Retirar recurso esquerda
Um no-terminal A, em uma GLC G=(N,T,P,S) recursivo se A A, para e (NT)*.
Se =, temos recurso a esquerda Se =, temos recurso a direita

Uma GLC G=(N,T,P,S) possui recurso esquerda direta se P contm pelo menos uma produo da forma A A. Uma GLC G=(N,T,P,S) possui recurso esquerda indireta se existe em G uma derivao da forma A n A, para algum n2
Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica
Retirar recurso esquerda
Considere A ::= A | A recursividade pode ser eliminada substituindo-se as produes de G(A) por:
A ::= A' A'::= A' |

Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica
Retirar recurso esquerda
O processo elimina toda recursividade direta esquerda, mas no elimina toda recursividade esquerda S Aa | b A Ac | Sd | e
Gramtica recursiva esquerda em S

Devemos usar um algoritmo geral de eliminao de recursividade esquerda

Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica

Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica
Retirar recurso esquerda (Exemplo)

Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica
Retirar recurso esquerda (Exemplo)

Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica
Retirar recurso esquerda (Exemplo)

S (A1) no tem recursividade direta esquerda

Eliminando a recursividade direta de A2 temos:

Universidade Federal da Paraba Departamento de Informtica

Adaptando a Gramtica
Retirar no determinismo
Caracterizado por:
A A

Retiramos o determinismo atravs da seguinte transformao:


A C C|

Universidade Federal da Paraba Departamento de Informtica

Você também pode gostar