WFiIS 10 Analiza skladniowa


Automat ze stosem
Analiza syntaktyczna
Dr in\. Janusz Majewski
Katedra Informatyki
Przypomnienie: struktura
kompilatora
KOMPILATOR
ANALIZA SYNTEZA
Analizator Analizator Analizator Generator Optymali - Generator
kod zrodlowy
leksykalny syntak- seman- kodu zator kodu kod wynikowy
tyczny pośred- kodu -
tyczny ostatecz
pośred - nego
niego
SKANER PARSER niego
Tablica symboli (zmiennych, stałych, etykiet, nazw,
podprogramów)
Tył kompilatora
Przód kompilatora (front-end)
(back-end)
zale\ny od języka zródłowego
zale\ny od platformy
systemowo-sprzętowej
Współpraca parsera
z innymi analizatorami
Analizator składniowy (parser) jest modułem wykonującym
analizę syntaktyczną oraz zarządzającym całym przodem
kompilatora, a w szczególności całym blokiem analizy. W takt
pracy parsera działa zarówno analizator leksykalny (dostarczając
parserowi kolejne tokeny), jak i analizator semantyczny
(analizując np. poprawność typów) oraz generator kodu
pośredniego (tłumacząc zanalizowane fragmenty programu do
kodu pośredniego).
Zadanie analizy syntaktycznej
Analizator syntaktyczny (parser) ma za zadanie dokonać rozbioru
gramatycznego tekstu zródłowego analizowanego programu.
Analizator leksykalny (skaner) dokonuje zamiany tekstu
wejściowego na ciąg tokenów. Parser pracuje na podstawie
gramatyki syntaktycznej. Buduje on drzewo rozbioru analizowanego
ciągu tokenów, czyli przeprowadza wyprowadzenie łańcucha
tokenów w gramatyce składniowej. Od parsera oczekujemy jakiegoś
zanotowania tego wywodu. Najczęściej stosowanym sposobem
notowania wyprowadzenia jest podanie ciągu numerów produkcji, na
podstawie którego mo\na odtworzyć drzewo rozbioru.
Analiza składniowa
Analizowane słowo: (id+id)*id
E
Gramatyka składniowa:
Do zbudowania drzewa rozbioru syntakt.
(podstawa konstrukcji kodu wynikowego)
" EE+T
niezbędna jest wiadomość, \e ciąg numerów
T
produkcji związany jest z wywodem (tutaj)
" ET
lewostronnym tworzonym metodą top-down
T F
*
" TT*F
E
!
" TF (2) ! T
!
!
F id
(3) ! T*F
!
!
!
" F(E)
(4) ! F*F
!
!
!
( E )
(5) ! (E)*F
!
!
!
" Fid
(1) ! (E+T)*F
!
!
!
(2) ! (T+T)*F
!
!
E + T !
(4) ! (F+T)*F
!
!
!
(6) ! (id+T)*F
!
!
!
T F
(4) ! (id+F)*F
!
!
!
(6) ! (id+id)*F
!
!
!
(id+id)* id ! acc
F
(6) !
!
!
!
ciąg numerów produkcji
id
jest wyjściem z parsera
Gramatyki LL i LR
LL(k)
Na ogół stosowane są
gramatyki:
liczba symboli, które
przeglądanie
" LL(1)
trzeba podglądać na
wejścia
wejściu, aby
od lewej do prawej
" LR(1)  oraz jej
jednoznacznie określić
odtwarzanie numer produkcji, którą
podklasy: SLR(1) lub
wywodu nale\y zastosować
LALR(1), dające
lewostronnego
metodą top-down
mo\liwość znacznego
uproszczenia
algorytmu parsingu
przy niewielkim
ograniczeniu
 mo\liwości
gramatyki.
Usuwanie lewostronnej
rekurencji
Mówimy, \e gramatyka jest lewostronnie rekurencyjna, jeśli ma taki nieterminal A,
\e istnieje wyprowadzenie A !+ Aą dla pewnego niepustego łańcucha ą.
Jeśli mamy produkcje: To mo\emy je zastąpić przez:
A Aą |  A  A
ą  
ą  
ą  
A ą A | 
ą 
ą 
ą 
Przykład
A Aą |  A  A
ą  
ą  
ą  
A ą A | 
ą 
ą 
ą 
_____________________________________________________
1) E E+T 1) E TE
2) E T 2) E +TE
3) E 
3) TT*F 4) T FT
4) TF 5) T *FT
6) T 
5) F(E) 7) F (E)
6) Fid 8) F id
Zbiory FIRSTk i FOLLOWk
" Zbiór FIRSTk(ą) jest zbiorem wszystkich
terminalnych przedrostków długości k (lub
mniejszej, je\eli z ą wyprowadza się łańcuch
terminalny krótszy ni\ k) łańcuchów, które mogą
być wyprowadzalne z ą
" Zbiór FOLLOWk() zawiera terminalne łańcuchy
o długości k (lub mniejszej patrz powy\ej),
które mogą pojawić się w wyprowadzeniach jako
następniki . Uwaga: jeśli FOLLOWk() zawiera
x, |x|gdzie $ prawy ogranicznik słowa (dla wygody).
Przykład (1)
1) E TE
2) E +TE
3) E 
4) T FT
5) T *FT
6) T 
7) F (E)
}FIRST1(F)={(, id}
8) F id
Przykład (2)
1) E TE
2) E +TE
3) E 
4) T FT FIRST1(T)=FIRST1(F)={(, id}
5) T *FT
6) T 
7) F (E)
}FIRST1(F)={(, id}
8) F id
Przykład (3)
1) E TE
FIRST1(E)=FIRST1(T)={(, id}
2) E +TE
3) E 
4) T FT FIRST1(T)=FIRST1(F)={(, id}
5) T *FT
6) T 
7) F (E)
}FIRST1(F)={(, id}
8) F id
Przykład (4)
1) E TE
FIRST1(E)=FIRST1(T)={(, id}
2) E +TE
}FIRST1(E )={+, }
3) E 
4) T FT FIRST1(T)=FIRST1(F)={(, id}
5) T *FT
}FIRST1(T )={*, }
6) T 
7) F (E)
}FIRST1(F)={(, id}
8) F id
Wyznaczanie zbiorów
FOLLOW1
Wyznaczenie FOLLOW1 dla wszystkich A"V
Stosować poni\sze reguły (1), (2), (3) dopóty nic
nowego nie mo\e ju\ zostać dodane do \adnego
zbioru FOLLOW1.
1) FOLLOW1(S) := FOLLOW1(S) *" {$}
2) if (AąB)"P then
FOLLOW1(B) := FOLLOW1(B) *" (FIRST1() % {})
3) if (AąB)"P or ((AąB)"P and ("FIRST1()))
then
FOLLOW1(B) := FOLLOW1(B) *" FOLLOW1(A);
Przykład (5)
FOLLOW1(E) " {$}
1) E TE
2) E +TE
3) E 
4) T FT
5) T *FT
6) T 
7) F (E)
8) F id
Przykład (6)
1) E TE
FOLLOW1(E) " {$}
2) E +TE
FOLLOW1(T) " {+}
3) E 
4) T FT
FOLLOW1(F) " {*}
5) T *FT
6) T 
FOLLOW1(E) " {)}
7) F (E)
Czyli w tej chwili:
8) F id
FOLLOW1(E)={$, )}
FOLLOW1(T)={+}
FOLLOW1(F)={*}
Przykład (7)
1) E TE
FOLLOW1(E ) ! FOLLOW1(E)
2) E +TE
FOLLOW1(T) ! FOLLOW1(E)
3) E 
FOLLOW1(T ) ! FOLLOW1(T)
4) T FT
FOLLOW1(F) ! FOLLOW1(T)
5) T *FT
6) T 
Ostatecznie:
7) F (E)
FOLLOW1(E)={$, )}
Poprzednio:
FOLLOW1(E )={$, )}
8) F id
FOLLOW1(E)={$, )}
FOLLOW1(T)={+, $, )}
FOLLOW1(T)={+}
FOLLOW1(T )={+, $, )}
FOLLOW1(F)={*}
FOLLOW1(F)={*, +, $, )}
Lewostronna faktoryzacja
Je\eli produkcje gramatyki mające ten sam symbol
po lewej stronie posiadają prawe strony
rozpoczynające się od tego samego przedrostka,
to mo\na dla nich wykonać przekształcenie zwane
lewostronną faktoryzacją. Polega ona na zamianie
produkcji postaci:
A ą1 | ... | ąk
ą ą
ą ą
ą ą
na produkcje:
A ąA2
ą 2
ą 2
ą 2
A2 1 | ... | k
2  
2  
2  


Wyszukiwarka

Podobne podstrony:
Analiza składnikowa
Autodesk Inventor Professional 10 Analiza naprężeń Pierwsze kroki
10 Analiza fin Analiza fundamentalna
terminy analiza skladnikow
Pyt 10 Analiza przeżycia
10 2 DC Analiza dyskryminacyjnaid278
Analiza Wykład 3 (21 10 10)
27 12 10H egzamin analiza 09 1
Analiza Wykład 10 (09 12 10) ogarnijtemat com
Analiza Wykład 8 (25 11 10)
j Folia 10 plan Solomona analiza wynikw (A)
Analiza Wykład 5 (04 11 10) ogarnijtemat com

więcej podobnych podstron