Análise Sintática - Continuação Parte 4 Profa. Heloise Manica Paris Teixeira Slides cedidos pela Prof. Valéria Feltrin (DIN-UEM) Análise sintática Analisadores Sintáticos Do símbolo de partida para a sentença Descendente (Top-down) Com retrocesso (back track) Da sentença para o simbolo de partida Ascendente (Bottom-up) Sem retrocesso (preditive) •Recursiva •Não Recursiva LL(1) Um analisador preditivo tenta prever a construção seguinte da cadeia de entrada com base em uma ou mais marcas de verificação à frente ASD Preditiva • Algoritmos: – Recursivo – LL(1) • Gramáticas LL(1) • O primeiro “L” se refere ao fato de o processamento ocorrer da esquerda para a direita (Left) • O segundo “L” se refere ao fato de o analisador acompanhar uma derivação à esquerda para a cadeia de entrada. • O número (1) significa que é usado um símbolo da entrada para prever a direção da análise. ASD preditiva não recursiva • Idéia geral – A recursão é substituída pelo uso de uma pilha onde os símbolos sendo expandidos são armazenados – Para determinar qual regra gramatical aplicar, consulta-se uma tabela sintática Cadeia de entrada Pilha X a + Analisador sintático Y Z $ b Tabela sintática $ Saída ASD preditiva não recursiva • Funcionamento – Um símbolo não terminal a ser expandido é empilhado E T E’ E’ + E | ε Ta|b Pilha E $ topo ASD preditiva não recursiva – Ao expandir um não terminal no topo da pilha, ele é desempilhado e seu lado direito da regra gramatical é empilhado (em sentido inverso) para expansão • O sentido inverso garante a ordem natural de expansão da esquerda para a direita Cadeia: a+b E T E’ E’ + E | ε Ta|b Cadeia: a+b Pilha Pilha T E $ topo E’ $ topo ASD preditiva não recursiva – Quando um símbolo terminal estiver no topo da pilha e esse mesmo símbolo estiver no início da cadeia sendo reconhecida, o terminal é desempilhado e o símbolo inicial da cadeia consumido E T E’ E’ + E | ε Ta|b Cadeia: a+b Cadeia: +b Pilha Pilha T E’ $ topo Pilha a topo E’ E’ $ $ topo ASD preditiva não recursiva E T E’ E’ + E | ε Ta|b Cadeia: +b Pilha Cadeia: +b Cadeia: b Pilha Pilha Cadeia: b Pilha + E’ E E $ $ $ Cadeia: b Pilha T b E´ E´ $ $ ASD preditiva não recursiva E T E’ E’ + E | ε Ta|b Cadeia: b Pilha Cadeia: $ Cadeia: $ Pilha Pilha Pilha b E´ E´ $ $ Cadeia Aceita! $ ASD preditiva não recursiva • Considere: – – • X = topo da pilha a = símbolo inicial da cadeia de entrada Possibilidades durante a análise: 1. Se X = a = $, então o analisador termina a análise com sucesso 2. Se X = a ≠ $, então o analisador desempilha X e consome o símbolo inicial da cadeia 3. Se X é não terminal, então o analisador procura na tabela sintática a regra de X que produz o símbolo inicial da cadeia e empilha seu lado direito (em sentido inverso) 4. Se X é terminal e é diferente de ‘a’ ou se X é não terminal e não há regra cuja derivação produza ‘a’, então ocorreu um erro! ASD preditiva não recursiva • Algoritmo de análise sintática Cadeia: 4+5$ empilhe um símbolo delimitador ($) e o símbolo inicial da gramática; concatene ao final da cadeia um símbolo delimitador ($); Pilha faça ip apontar para o primeiro símbolo da cadeia; repetir X=símbolo no topo da pilha; a=símbolo apontado por ip; se (X for um terminal ou o símbolo delimitador) então E se X=a então $ desempilhar X; avançar ip; senão ERRO; senão /*X é um não terminal*/ se (existe na tabela sintática uma regra de X que produza a) então desempilhar X; empilhar em sentido inverso o lado direito da regra selecionada; senão ERRO; até que X=símbolo delimitador /*pilha está vazia*/ X=topo ASD preditiva não recursiva • Exemplo E T E’ E’ + E | ε Ta|b topo Tabela sintática a E b $ ETE’ ETE’ E’ T + E’+E E’ ε Ta Tb Reconhecer a+b Pilha Cadeia Regra $E a +b$ ETE’ $E’ T a+b$ Ta $E’ a a+b$ --- $E’ +b$ E’+E $E+ +b$ --- $E b$ ETE’ $E’T b$ Tb $E’b b$ --- $E’ $ E’ε $ $ SUCESSO ASD preditiva não recursiva • Exemplo E T E’ E’ + E | ε Ta|b Pilha Cadeia Regra $E a*b$ ETE’ $E’T a*b$ Ta $E’a a*b$ --- $E’ *b$ ERRO Tabela sintática a E b $ E’+E E’ε ETE’ ETE’ E’ T + Ta Tb Reconhecer a*b A cadeia não pertence à linguagem! ASD preditiva não recursiva • Exercício: reconheça a cadeia 01012 S 0A | 1B A 1B | 2 B 0A | 2 Tabela sintática S 0 1 S0A S1B A B A1B B0A 2 A2 B2 Pilha Cadeia Regra $S 01012$ S0A $A0 01012$ --- $A 1012$ A1B $B1 1012$ --- $B 012$ B0A $A0 012$ --- $A 12$ A1B $B1 12$ --- $B 2$ B2 $2 2$ --- $ $ SUCESSO ASD preditiva não recursiva • Como construir a tabela sintática? S 0A | 1B A 1B | 2 B 0A | 2 F(S)= {0, 1} F(A)= {1,2} F(B)= {0,2} Tabela sintática S 0 1 S0A S1B A B A1B B0A 2 A2 B2 • De acordo com o exemplo, para um não terminal X e um terminal ‘n’, a tabela indica a regra de X cujo conjunto Primeiro (Fisrt) contém ‘n’ ASD preditiva não recursiva • Exercício: construa a tabela sintática e reconheça a cadeia 0aa S 0A | B A aA | ε Bb F(S)= {0, b} F(A)= {a, ε} F(B)= {b} Tabela sintática 0 S A B a S0A b $ SB AaA Aε Bb Pilha Cadeia Regra $S 0aa$ S 0A $A0 0aa$ --- $A aa$ A aA $Aa aa$ --- $A a$ A aA $Aa a$ --- $A $ Aε $ $ SUCESSO ASD preditiva não recursiva • Exercício: construa a tabela e reconheça a cadeia 0a1 F(S)= {0, b} F(A)= {a, ε} F(B)= {b} S 0A1 | B A aA | ε Bb Tabela sintática 0 S A B 1 a S0A1 b $ SB Aε AaA Aε Bb Pilha Cadeia Regra $S 0a1$ S 0A1 $1A0 0a1$ --- $1A a1$ A aA $1Aa a1$ --- $1A 1$ ERRO Por que aconteceu o erro? A cadeia não faz parte da linguagem? Ou a tabela está errada? Para se chegar ao terminal 1, A deve produzir ε. Portanto, a regra Aε deve ser adicionada na tabela para a combinação de A com 1 e não em A com $ ASD preditiva não recursiva • Regras para construção da tabela sintática 1. Para cada produção A da gramática, execute os passos 2 e 3 abaixo 2. Para cada terminal a em Primeiro(), adicione A em T[A,a] 3. Se ε estiver em Primeiro(), adicione A em T[A,b] para cada terminal b em Seguidor(A) 4. Faça cada entrada indefinida da tabela indicar erro ASD preditiva não recursiva • Exercício: construir a tabela sintática para a gramática abaixo E TE’ E’ +TE’ | ε T FT’ T’ *FT’ | ε F (E) | id P(E) = { ( , id } seguidor(E) = { ), $ } P(E’) = { +, ε } seguidor(E') = { ), $ } P(T)={(, id} seguidor(T) = { +, ), $ } P(T’) = { *, ε } seguidor(T’) = { +, ), $ } P(F)={(, id} seguidor(F) = {*, +, ), $ } id E ( TFT’ $ E’ε E’ε T’ε T’ε TFT’ T’ε Fid ) ETE’ E’+TE’ T’ F * ETE’ E’ T + Tabela sintática T’*FT’ F(E) ASD preditiva não recursiva • Exercício: reconhecer a cadeia id+id*id E TE’ E’ +TE’ | ε T FT’ T’ *FT’ | ε F (E) | id Tabela sintática id E ( TFT’ $ E’ε E’ε T’ε T’ε TFT’ T’ε Fid ) ETE’ E’+TE’ T’ F * ETE’ E’ T + T’*FT’ F(E)