Analiza leksykalna - Lex
Transkrypt
Analiza leksykalna - Lex
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Analiza leksykalna - Lex
PobieranieZnaków
Sposób działania Lex-a
Wyra enia regularne
Analizator
Leksykalny
Tekst ródłowy dla Lex-a
PobieranieSymboli
Gramatyka
regularna
Analizator
Składniowy
J zyki formalne i kompilatory, © by Michał miałek
Co to jest Lex?
Lex jest generatorem programów słu cych do analizy leksykalnej
strumieni wej ciowych.
Lex przyjmuje na wej ciu opis w formie serii wyra e regularnych;
Lex produkuje program w j zyku C, który z wyra e regularnych
tworzy automat sko czony;
Automat wyprodukowany przez Lex-a pozwala wykrywa w ci gu
wej ciowym sekwencje znaków zgodne z wzorcami okre lonymi
przez zadane wyra enia regularne;
Wygenerowany program mo e podejmowa zadane przez nas
działania po wykryciu stanu ko cowego automatu (zaakceptowaniu
okre lonego ci gu znaków);
Program wyprodukowany przez Lex-a mo na wł czy do swojego
programu jako moduł odpowiedzialny za wst pn analiz
leksykaln .
J zyki formalne i kompilatory
Analiza leksykalna - Lex
© by Michał miałek
1
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Jak działa Lex?
Program Lex przyjmuje specyfikacj w odpowiednim formacie.
Wyj ciem jest procedura „yylex” umo liwiaj ca przetwarzanie
strumienia wej ciowego w odpowiednio przetworzony strumie
wyj ciowy (ci g leksemów).
specyfikacja
Lex
strumie
wej ciowy
yylex()
yylex()
LekSem
J zyki formalne i kompilatory
© by Michał miałek
Lex a struktura kompilatora
Funkcja wygenerowana przez program Lex (yylex) zast puje klasy
stanowi ce struktur automatu sko czonego. Mo na j zatem u y
zamiast funkcji PodajSymbol!
«interface»
LekSem
PobieranieSymboli
+
+
PodajSymbol() : LekSem
Rozpocznij(nazwa :String) : void
-
typ: int
warto : String
+
utwórz(typ :int, warto
:String) : void
«realize»
yylex()
Zarz dcaAnalizatoraLeksykalnego
-pocz tkowy
Graf
1
+
+
PodajSymbol() : LekSem
Rozpocznij(nazwa :String) : void
+
+
od_pocz tku() : void
przejd (z :char) : int
1
-aktualny
W zełGrafu
-
1 +
1
typ: int
przejd (z :char) : int
+docelowy
1
1
-wychodz ce
0..*
+
+
J zyki formalne i kompilatory
Analiza leksykalna - Lex
«interface»
«interface»
PobieranieZnaków
TablicaSymboli
ustaw_plik(nazwa :String) : int
pobierz_znak() : char
+
+
wstaw(symbol :String, typ :int) : void
sprawd (symbol :String) : int
0..*
Kraw d Grafu
-
opis_kraw dzi: String
+
czy_mo na_przej (znak :char) : W zeł
© by Michał miałek
2
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Wyra enia regularne
Wyra enie regularne (ang. regular expression), to wyra enie
okre laj ce sposób wyszukiwania lub zast powania napisów,
zawieraj ce specjalne znaki i konteksty dopasowuj ce ci gi znaków
w przetwarzanym tek cie.
Wyra enie regularne to swego rodzaju wzorzec, reguła opisuj ca
pewien uogólniony napis (ci g znaków). Je eli znaki tworz ce dany
napis spełniaj reguły danego wyra enia regularnego, to mówimy
o tym wyra eniu, e pasuje do danego napisu.
Ka de wyra enie regularne mo na zamieni na odpowiadaj cy mu
automat sko czony (i odwrotnie).
Nast pne slajdy zawieraj przykłady wyra e regularnych (w
składni programu Lex) i odpowiadaj cych im automatów.
J zyki formalne i kompilatory
© by Michał miałek
Pojedyncze znaki
Wyra enie regularne: program
Akceptowane ci gi znaków: program
r
o
p
g
r
m
J zyki formalne i kompilatory
Analiza leksykalna - Lex
a
© by Michał miałek
3
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Zbiory znaków
Wyra enie regularne: [0123456789][0-9][^0-9]
Akceptowane ci gi znaków: 27a, 31%, 99a, 01c, 75g, 56t
...
0-9
^0-9
0-9
Uwaga: znak specjalny ^ oznacza „wszystko prócz”
J zyki formalne i kompilatory
© by Michał miałek
Alternatywne wyra enia
Wyra enie regularne: L(H[0-9,A-F]|O[0-7])
Akceptowane ci gi znaków: LH0, LH9, LO7, LO1, ...
H
[0-9,A-F]
L
[0-7]
O
Uwaga: wyra enia alternatywne najcz ciej
umieszczamy w nawiasach „()” (grupowanie)
J zyki formalne i kompilatory
Analiza leksykalna - Lex
© by Michał miałek
4
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Dowolne znaki i dowolnie długie ci gi znaków
Wyra enie regularne: A+(0|1)*K.
Akceptowane ci gi znaków: A11K%, AA001011Kf,
A00011111111Ku, AKh, ...
A
1
1
.
K
A
0
0
K
Uwaga: znak „.” oznacza dowolny znak widzialny (np.
oprócz znaku nowego wiersza)
J zyki formalne i kompilatory
© by Michał miałek
Ci gi alternatywne
Wyra enie regularne: "+"?0+B
Akceptowane ci gi znaków: 00B, +00B, 0B, +000B,
+000000B, ...
0
0
B
+
0
J zyki formalne i kompilatory
Analiza leksykalna - Lex
© by Michał miałek
5
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Wyra enia regularne a gramatyki regularne
Ka de wyrazenie regularne mo na zast pi automatem
sko czonym, a ka dy automat sko czony posiada odpowiadaj c
mu gramatyk regularn .
Wyra enie regularne z poprzedniego slajdu odpowiada nastepuj cej
gramatyce:
= {+, 0, B}
P = {S
= {S, X}
+X,
S
X,
X
0X,
X
0B}
J zyki formalne i kompilatory
© by Michał miałek
Schemat specyfikacji dla Lex-a
Specyfikacja (plik wej ciowy) dla programu Lex ma nastepuj cy
schemat ogólny:
definicje pomocnicze
%%
reguły przetwarzania
%%
podprogramy pomocnicze
Definicje pomocnicze – umo liwiaj nadawanie prostych nazw dla
zło onych wyra e regularnych u ywanych wielokrotnie
Reguły przetwarzania – przyporzadkowuj wyra eniom regularnym
operacje w j zyku C
Podprogramy pomocnicze – kod funkcji wykorzystywanych w
regułach przetwarzania (i nie tylko)
J zyki formalne i kompilatory
Analiza leksykalna - Lex
© by Michał miałek
6
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Definicje pomocnicze
Format definicji pomocniczej to:
nazwa tłumaczenie
„nazwa” stanowi identyfikator
„tłumaczenie” to wyra enie regularne, które jest zast powane przez
„nazw ”
Przykłady:
cyfra
[0-9]
litera
[a-zA-Z]
„nazwy” mo na stosowa w regułach przetwarzania w celu
skrócenia zapisu
J zyki formalne i kompilatory
© by Michał miałek
Reguły przetwarzania
Format reguły przetwarzania to:
wyra enieregularne
akcja
gdzie akcja to fragment programu w j zyku C. Najprostsza „akcja”
to „;” (instrukcja pusta), co oznacza zignorowanie
zaakceptowanych Operacja „ECHO;” powoduje kopiowanie znaków
na standardowe wyj cie. Akcje zło one z wi kszej liczby instrukcji
umieszczamy w nawiasach „{}”.
Przykład:
[a-z]+
{slowa++; printf("%d",yyleng);}
Po wykryciu identyfikatora składaj cego si z małych liter,
zwi kszany jest licznik słów i wyprowadzana na standardowe
wyj cie długo wykrytego identyfikatora.
J zyki formalne i kompilatory
Analiza leksykalna - Lex
© by Michał miałek
7
J zyki formalne i kompilatory
Modyfikacja:
2005-01-01
Przykładowa specyfikacja
n
[0-9]
1=liczba całkowita
%%
{n}+ { nowy_leksem.utwórz(1,yytext); }
[A-Za-z][A-Za-z0-9]+
0 – brak symbolu w tablicy
{ int ident;
ident = symbole.sprawd (yytext);
if (ident==0) ident = symbole.wstaw(yytext);
if (ident<128) nowy_leksem.utwórz(ident,””);
else nowy_leksem.utwórz(2,itoa(ident));
}
%%
<128 – słowa kluczowe
return nowy_leksem;
2 – identyfikator, nie b d cy
słowem kluczowym
J zyki formalne i kompilatory
Analiza leksykalna - Lex
© by Michał miałek
8