Carregar apresentação
A apresentação está carregando. Por favor, espere
1
III – Análise sintáctica
DEI Parsers predictivos não recursivos FIRST e FOLLOW Bibliografia aconselhada: Aho, Sethi e Ullman – secção 4.4 Crespo – secção 4.3 Jorge Morais LFA 1999/
2
Parser descendente não recursivo
DEI Jorge Morais LFA 1999/
3
Função FIRST DEI Se x é um símbolo terminal FIRST(x) = {x}
Se X , adicionar a FIRST(X) Se X Y1 Y2 ... Yi-1 Yi ... Yk , onde está em FIRST(Y1), FIRST(Y2), ..., FIRST(Yi-1), adicionar o conteúdo de FIRST(Yi) a FIRST(X); se todos os FIRST(Yj ), com j=1,2, ..., k, contiverem então adicionar a FIRST(X) Jorge Morais LFA 1999/
4
Função FIRST DEI FIRST(X1 X2 ... Xk) contém: FIRST(X1)\{};
se está em FIRST(X1) também contém FIRST(X2)\{}; ... se está em FIRST(Xk-1) também contém FIRST(Xk)\{}; se está em FIRST(Xk) também contém ; Jorge Morais LFA 1999/
5
Função FOLLOW DEI $ pertence a FOLLOW(S), onde $ é o fim de sequência e S o símbolo inicial Se A B, então FIRST()\{} é adicionado a FOLLOW(B) Se A B ou A B (onde FIRST() contém ), adicionar FOLLOW(A) a FOLLOW(B) Jorge Morais LFA 1999/
6
Exemplo DEI E T E’ E’ + T E’ | - T E’ | T F T’ T’ * F T’ | / F T’ | F ( E ) | id Jorge Morais LFA 1999/
7
Exemplo - FIRST DEI FIRST(E) = {(, id} FIRST(E’) = {+, -, }
FIRST(T) = {(, id} FIRST(T’) = {*, /, } Jorge Morais LFA 1999/
8
Exemplo - FOLLOW DEI FOLLOW(E) = {), $} FOLLOW(E’) = {), $}
FOLLOW(T) = {+, -, ), $} FOLLOW(T’) = {+, -, ), $} FOLLOW(F) = {*, /, +, -, ), $} Jorge Morais LFA 1999/
9
Tabela de derivação DEI Para cada produção A
Para cada terminal a em FIRST() Adicionar A a M(A,a) Se está em FIRST() Adicionar A a M(A,b), para todos os b em FOLLOW(A) Se está em FIRST() e $ em FOLLOW(A) Adicionar A a M(A,$) Jorge Morais LFA 1999/
10
Exemplo - Tabela de derivação
DEI id + - * / ( ) $ E E TE’ E’ E’ +TE’ E’ -TE’ E’ T T FT’ T’ T’ T’ *FT’ T’ /FT’ F F id F ( E ) Jorge Morais LFA 1999/
11
Parser descendente não recursivo
DEI A pilha é iniciada com o símbolo inicial S sobre o símbolo $ Sendo X o símbolo no topo da pilha e a o símbolo de entrada actual: Se X = a = $, terminar com sucesso Se X = a $, retirar X da pilha e prosseguir com o símbolo de entrada seguinte Se X é uma variável (não terminal) consultar a tabela. Se existir uma produção colocar o lado direito na pilha (por ordem, o primeiro no topo). Senão entrada de erro. Jorge Morais LFA 1999/
12
Exemplo - Parser DEI Pilha Entrada Saída $E id+id*id$ - $E’T E TE’
$E’T’F T FT’ $E’T’id F id $E’T’ +id*id$ $E’ T’ $E’T+ E’ +TE’ Jorge Morais LFA 1999/
13
Exemplo - Parser (cont.)
DEI Pilha Entrada Saída $E’T id*id$ - $E’T’F T FT’ $E’T’id F id $E’T’ *id$ $E’T’F * T’ *FT’ id$ Id$ Jorge Morais LFA 1999/
14
Exemplo - Parser (cont.)
DEI Pilha Entrada Saída $E’T $ - $E’ T’ E’ A sequência é reconhecida A uso da tabela evita a recursividade Jorge Morais LFA 1999/
15
Recuperação de erros DEI
Na variável A, adicionar tokens de sincronização em FOLLOW(A) Adicionar tokens de sincronização de variáveis hierarquicamente anteriores Adicionar tokens de FIRST(A) Se a produção gerar a palavra vazia, usar essa por defeito Retirar um símbolo terminal do topo da pilha Jorge Morais LFA 1999/
16
Gramáticas LL(1) DEI Gramáticas não ambíguas, sem recursividade à esquerda Uma gramática diz-se LL(1) se, e só se, para 2 produções distintas A | : para qualquer terminal a, e não derivam, simultaneamente, palavras começadas por a apenas um (de ou ) pode derivar se * , então não deriva nenhuma palavra começando por um terminal em FOLLOW(A) Jorge Morais LFA 1999/
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.