III – Análise sintáctica • Construção de tabelas para parsers LR • Bibliografia aconselhada: – Aho, Sethi e Ullman – secção 4.7 – Crespo – secção 5.5, 5.6 e 5.7 – Appel – secção 3.3 Jorge Morais LFA 1999/2000 - 1 Gramáticas LR(0) • Podem ser derivadas usando apenas o símbolo no topo da pilha, fazendo instruções shift-reduce sem ler nenhum símbolo à frente • Demasiado fracas, servem de base às outras formas de construções de tabelas Jorge Morais LFA 1999/2000 - 2 Itens LR(0) • Proução: – AXYZ • Itens LR(0): – – – – A.XYZ AX.YZ AXY.Z AXYZ. • No caso A , temos apenas o item A . Jorge Morais LFA 1999/2000 - 3 Operação de fecho • Sendo I um conjunto de itens, fecho(I) é um novo conjunto construído usando as seguintes regras: – Todos os itens em I pertencem a fecho(I) – Se A . B está em fecho(I) e B é uma produção da gramática, B . é adicionado ao fecho(I) Jorge Morais LFA 1999/2000 - 4 Operação de salto (goto) • goto(I,X) onde I é um conjunto de itens e X é um símbolo da gramática • Fecho do conjunto de itens de todos os itens da forma A X . onde A . X pertence a I Jorge Morais LFA 1999/2000 - 5 Construção de conjuntos de itens • Algoritmo: – C = {fecho ({S’ . S})} – Para cada I em C e cada X símbolo da gramática (até não haver mais itens a adicionar) • Adicionar goto(I,X) a C Jorge Morais LFA 1999/2000 - 6 Exemplo • • • • • • • E’ E EE+T ET TT*F TF F(E) F id Jorge Morais LFA 1999/2000 - 7 goto(I0 , X) I1=goto(I0 , E) = {E’ E . , E E . + T} I2=goto(I0 , T) = {E T . , T T . * F} I3=goto(I0 , F) = {T F .} I4=goto(I0 , ‘(‘ ) = {F ( . E ) , E . E + T, E . T, T . T * F, T . F, F . ( E ), F . id} • I5=goto(I0 , id ) = {F id .} • • • • Jorge Morais LFA 1999/2000 - 8 Restantes conjuntos • I6=goto(I1 , +) = {E E + . T, T . T * F, T . F, F . ( E ), F . id} • I7=goto(I2 , *)={TT*.F,F.( E ),F . id} • I8=goto(I4 , E) = {F ( E . ) , E E . + T} • I9=goto(I6 , T) = {E E + T . , T T .* F} • I10=goto(I8 , F) = {T T * F .} • I11=goto(I8 , ‘)’) = {F ( E ) .} Jorge Morais LFA 1999/2000 - 9 Autómato finito • Cada um dos Ik vai ser um estado dum autómato finito determinístico • As transições são dadas por (I,X,goto(I,X)) • O estado inicial será o que contém E’ E • Este autómato pode ser construído usando a Construção de Thompson e a construção de subconjuntos, partindo das transições: – ({A . X }, X, {A X . }) – ({A . X }, , {X . }) Jorge Morais LFA 1999/2000 - 10 SLR – Simple LR • Construir C={I0, I1, ..., In} • Se {A . a } pertence a Ii e goto(Ii,a) = Ij , então acção(i,a) = shift j • Se {A . } pertence a Ii, então para todo o a em FOLLOW(A), então acção(i,a) = reduce A ; A não pode ser S’ • Se {S’ S} pertence a Ii, então acção(i,$) = aceit. • Se {A . X } pertence a Ii, X variável (não terminal), então salto(i,X) = j Jorge Morais LFA 1999/2000 - 11 LR(1) • LR(1) – usa um símbolo de lookahead • os itens LR(1) são da forma (A . , a) onde a é um símbolo terminal • se não é , a não tem qualquer significado • os itens(A . , a) vão corresponder a uma redução A se a for o próximo símbolo na entrada Jorge Morais LFA 1999/2000 - 12 LALR(1) – LookAhead LR(1) • LALR(1) – diminui número de estados relativamente a LR(1) e é mais forte que SLR • Junta qualquer par de estados iguais que apenas tenham o símbolo de lookahead diferente Jorge Morais LFA 1999/2000 - 13 Hierarquia de gramáticas Jorge Morais LFA 1999/2000 - 14