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