Zbiory FIRST i FOLLOW Załóżmy, że w gramatyce znajduje się ciąg

Transkrypt

Zbiory FIRST i FOLLOW Załóżmy, że w gramatyce znajduje się ciąg
Zbiory FIRST i FOLLOW
Załóżmy, że w gramatyce znajduje się ciąg produkcji:
1
n
A ::= | ... | Zbiór “FIRST” ( symboli startowych/początkowych ? ):
i
i

FIRST( ) = { x: x wywodzi się z , gdzie x należy do T, a 
jest słowem}
Zbiór “FOLLOW” ( symboli końcowych ?):
FOLLOW(A) = {x: A wywodzi się z S, gdzie , a  
x∈ FIRST 

 i są słowami }
Przykład:
X ::= aAy | Az A ::= B | C | d B ::= e | є C ::= f | є
FIRST(B) = {e} FOLLOW(A) = {y,z}
O.Świda wg A.Aho,R.Sethi,J.Ullman
1
Wyznaczanie symboli startowych
Jeżeli x jest terminalem, to FIRST(x) = {x}
●
Jeżeli w gramatyce istnieje produkcja A ::= є, to FIRST(A) = FIRST(A)+{є}
●
Jeżeli X jest nieterminalem, to dla wszystkich produkcji postaci:
X ::= Y1Y2...Yn
●
●
●
FIRST(X) = FIRST(X) + FIRST(Y1)
Jeżeli z Y1 da się wywieść є, to dodatkowo FIRST(X) = FIRST(X)+FIRST(Y2)
( Postępuj tak, dopóki z Yi da się wywieść є )
●
Jeżeli є należy do każdego zbioru FIRST(Yi) i=1,2,...,n, to FIRST(X) = FIRST(X) + {є}
FIRST(E) = FIRST(T) = FIRST(F) = { ( , id }
FIRST(E') = {+ , є } FIRST(T') = { * , є } O.Świda wg A.Aho,R.Sethi,J.Ullman
2
Wyznaczanie symboli końcowych
FOLLOW(S) = { eof }
●
 
Jeżeli istnieje produkcja A ::= B , to: FOLLOW(B) = FOLLOW(B)+(FIRST( )­{є})

●

 
Jeżeli istnieje produkcja A ::= B lub produkcja A ::= B i є należy do FIRST( ), to:

FOLLOW(B) = FOLLOW(B)+FOLLOW(A)
●
E ::= TE'
T ::= FT' E' ::= +TE' | є
T' ::= *FT' | є
F ::= (E) | id
FOLLOW(E) = { ) , EOF }
FOLLOW(T) = { +,),EOF }
FOLLOW(F) = { +,*,),EOF }
O.Świda wg A.Aho,R.Sethi,J.Ullman
3
Tablice parsingu dla parsera LL(1)
1. Dla każdej produkcji postaci: A ::= wykonaj:


a) Dla każdego symbolu terminalnego a ze zbioru FIRST( )
TP[A,a] = A ::= 

b) Jeżeli є należy do FIRST( ), to:

TP[A,b] = A::= dla każdego symbolu terminalnego b ze zbioru FOLLOW(A)

c) Jeżeli є należy do FIRST( ) oraz EOF do FOLLOW(A), to:
TP[A,EOF] = A::= 
2. Pozostałe miejsca w tablicy oznacz jako błędne.
O.Świda wg A.Aho,R.Sethi,J.Ullman
4
Przykłady zastosowań w parserach ●
Alternatywa rekurencyjnych
●
Zero lub więcej wystąpień
●
Wystąpienie opcjonalne
Mechanizm “panic mode” z zastosowaniem zbiorów FIRST i FOLLOW
Używamy zbiorów jako elementów synchronizujących przy pomijaniu symboli z wejścia
Przykłady dla rzeczywistych gramatyk
●
Dyskusja na temat innych metod odzyskiwania kontroli
●
O.Świda wg A.Aho,R.Sethi,J.Ullman
5
Budowa drzewa wywodu w analizatorze rekurencyjnym
Reprezentacja węzłów (programowanie strukturalne i obiektowe)
●
Poddrzewa instrukcji i deklaracji
●
Kolejność działań w wyrażeniach arytmetycznych
●
Reakcja na błędy
●
Dwa rodzaje drzew:
●
Syntax (parse) tree
●
Abstract Syntax Tree
●
O.Świda wg A.Aho,R.Sethi,J.Ullman
6

Podobne dokumenty