Upload
dragica-petrovic
View
46
Download
1
Embed Size (px)
Citation preview
Jezici, regularni izrazi, automati i gramatike
2
Definicija jezika
• Šta je jezik?• Šta je računarski jezik?• Šta je programski jezik?• Šta čini jezik dobrim?• Kako definisati jezik?• Postoji li definicija jezika?• Može li jezik definisati samog sebe?• Postoji li univerzalni jezik?
Pregled
• Leksička analiza– Regularni izrazi (Regular Expressions)– Konačni automati (Finite State Automata)
• deterministički (DKA, engl. DFA) • nedeterministički (NKA, engl. NFA)
– DFSA NFSA RE konverzija
• Sintaksna analiza– Beskontekstni jezici (Context Free
Languages)– Parsiranje (sljedeće lekcije)
4
Opisivanje jezika
•Slojevita struktura definicije jezika
– alfabet (azbuka) - osnovni simboli
– leksička struktura - riječi
– sintaksna struktura - rečenice
– semantika - značenje
– u ovoj lekciji: leksička i sintaksna struktura
5
Formalni jezici
• Jezik je skup stringova (nizova karaktera)
• Dualni pristup– Generisanje jezika (gramatika)– Prepoznavanje riječi jezika (parser)
• Formalna veza i mehanička koverzija
6
Leksička analiza (LA)
• Primjeri tokena• Operatori = + - > ( { := ==
<>• Ključne riječi if while for int double• Numeriki literali 43 6.035 -3.6e10 0x13F3A• Karakter-literali ‘a’ ‘~’ ‘\’’• String-literali “6.891” “Fall 98” “\”\” =
empty”
• Primjeri šta nisu tokeni• Bjeline (White space)space(‘ ‘) tab(‘\t’) end-of-line(‘\
n’)• Komentari /*this is not a token*/
• Source program text Tokene
5
7
Skener u akciji
f o r v a r 1 = 1 0 v a r 1 < =
8
Skener u akciji
for ID(“var1”) eq_op Num(10) ID(“var1”) leq_op
f o r v a r 1 = 1 0 v a r 1 < =
• Grupiše nizove karaktera u tokene
• Dodaje atribute tokenima
• Eliminiše bjeline i komentare
9
LA treba da ….
• Identifikuje tip tokena• 6036 Num(6035)• X6035 ID(“X6035”)
• Tokeni u različitim jezicima• FORTRAN DO I=1,10 • C++ for(int i=1; i<= 10; i++)• R/S-plus for (i in 1:10)
• Mogu li se ovi jezici opisati jednim jezikom?
10
Regularni izrazi
• Alfabet (azbuka) = skup “slova”• Regularni izrazi nad alfabetom :
je regularan izraz koji označava skup { }– Ako je a, tada je a regularan izraz koji
označava skup {a}– Ako su r i s regularni izrazi koji označavaju
skupove R i S, tada: • (r)|(s) je regularan izraz koji označava skup
RS• (r)(s) je regularan izraz koji označava skup RS• (r)* je regularan izraz koji označava skup R*.
11
Proces keriranja stringaPrimjer 2
(0|1)*.(0|1)*(0|1)(0|1)*.(0|1)*0(0|1)*.(0|1)*0.(0|1)*0.(0|1)(0|1)*0.(0|1)0.1
Primjer 1(0|1)*.(0|1)*(0|1)(0|1)*.(0|1)*1(0|1)*.(0|1)*1.(0|1)*1.(0|1)(0|1)*1.(0|1)1.0
12
Regularni jezici
• Skup svih stringova generisanih regularnim izrazom
• Može biti (prebrojivo) beskonačan• Primjeri nad alfabetom {0,1}:1. RE: (0|1)0 Skup = {00, 10} 2. RE: 1(0|1)(0|1) Skup = {100, 101,
110, 111}3. RE: 0* Skup = {, 0, 00, 000, 0000…}4. RE: (0|1)* Skup = svi binarni brojevi
13
Primjeri regularnih jezika
= { 0, 1, . }– (0|1)*.(0|1)* - binarni realni brojevi– (00)* - nizovi nula parne dužine– 1*(01*01*)* - stringovi sa parnim brojem
nula = { a,b,c, 0, 1, 2 }
– (a|b|c)(a|b|c|0|1|2)* - alfanumerički identifikatori
– (0|1|2)* - ternarni brojevi (osnova 3)
14
Spojite stringove sa izrazima
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
• Svi stringovi nula i jedinica koji NE sadrže podstring 011
a. 000000b. 01010c. 010101d. 101010e. 001100
15
Spojite stringove sa izrazima
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
• Svi stringovi nula i jedinica koji NE sadrže podstring 011
a. 000000b. 01010c. 010101d. 101010e. 001100
16
Spojite stringove sa izrazima
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
• Svi stringovi nula i jedinica koji NE sadrže podstring 011
a. 000000b. 01010c. 010101d. 101010e. 001100
17
Spojite stringove sa izrazima
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
• Svi stringovi nula i jedinica koji NE sadrže podstring 011
a. 000000b. 01010c. 010101d. 101010e. 001100
18
Spojite stringove sa izrazima
1. 0(0|1)*0
2. ((ε|0)1*)*
3. ((0|1)0(0|1))*
• Svi stringovi nula i jedinica koji NE sadrže podstring 011– 1*((010)*0*)*(ε|1)
a. 000000b. 01010c. 010101d. 101010e. 001100
19
Konačni automati
• Alfabet • Skup stanja, uključujući početno i završna stanja• Prelazak između stanja, označen slovima alfabeta
1 Zeleno stanje
Plavo stanje0
1
0
.
(0|1)*.(0|1)*
20
Prepoznavanje
• Prepoznavanje stringova– Počnite sa startnim stanjem i prvim slovom
stringa
– U svakom koraku, tražite poklapanje tekućeg slova sa oznakom grane prelaska
– Ponavljati do kraja stringa ili nepoklapanja
– Ako ste u završnom stanju i došli ste do kraja stringa, automat prihvata datu riječ
• Jezik automata je skup svih stringova koje prihvata.
21
1
0
1
0
1 1 . 0
. Početno stanje
Završno stanje
Tekuće slovo
Tekuće stanje
Primjer
22
Primjer
1
0
1
0
1 1 . 0
. Početno stanje
Završno stanje
Tekuće slovo
Tekuće stanje
23
Primjer
1
0
1
0
1 1 . 0
. Početno stanje
Završno stanje
Tekuće slovo
Tekuće stanje
24
Primjer
1
0
1
0
1 1 . 0
. Početno stanje
Završno stanje
Tekuće slovo
Tekuće stanje
25
Primjer
1
0
1
0
1 1 . 0
. Početno stanje
Završno stanje
Tekuće slovo
Tekuće stanje
String je prihvaćen!
26
Generisanje vs. prepoznavanje
• Sintaksno posmtrano, jezik je skup• Regularni izrazi
– Definišu jezik kompozicijom
• Automati– Definišu jezik implementacijom
• Određuju da li je string u jeziku ili nije
– Teoretski su ekvivalentni
27
RE Automati
• Konstrukcija primjenom strukturne indukcije
• Dat je proizvoljan regularni izraz r• Konvertujemo ga u automat sa
– Jednim početnim stanjem– Jednim završnim stanjem
28
RE Automati
aa
Završno stanje
Početno stanje
29
Konkatenacija
r1r2
Završno stanje
Početno stanje
r1 r2
30
Konkatenacija
r1r2
Završno stanje
Početno stanje
r1 r2
Staro završno stanje
Staro početno stanje
31
Konkatenacija
r1r2 r1 r2
Završno stanje
Početno stanje
Staro završno stanje
Staro početno stanje
32
Konkatenacija
r1r2
r1 r2
Završno stanje
Početno stanje
Staro završno stanje
Staro početno stanje
33
Konkatenacija
r1r2
r1 r2
Završno stanje
Početno stanje
Staro završno stanje
Staro početno stanje
34
Alternacija
r1|r2
r1
r2
Završno stanje
Početno stanje
35
Alternacija
r1|r2
r1
r2
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
36
Alternacija
r1|r2
r1
r2
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
37
Alternacija
r1|r2
r1
r2
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
38
Zatvorenje (Kleene *)
r* r
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
39
Zatvorenje
r* r
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
40
Zatvorenje
r* r
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
41
Zatvorenje
r* r
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
42
Zatvorenje
r* r
Staro završno stanje
Staro početno stanje
Završno stanje
Početno stanje
43
NFA vs. DFA
• DFA– Nema prelazaka– Naviše jedna prelaz iz svakog stanja
za svako slovo
• NFA – može oboje
a
b
OKa
a
NOTOK
44
Konverzija
• Prevođenje RE u automat kreira NKA• Želimo da imamo DKA jer je algoritam
prepoznavanja jednostavniji• Možemo konvertovati NKA u DKA (ali
DKA može biti ekponencijalno veći od odgovarajućeg DKA)– Algoritam prevođenja postoji (pogladjete
knjigu i posebnu prezentaciju za još primjera)
45
NKA DKA
• Stanje DKA je podskup skupa stanja NKA– Početno stanje DKA odgovara skupu stanja u koja
možemo preći iz početnog stanja NKA prateći prelaske
– Stanje DKA je završno ako se bar jedno završno stanje NFA nalazi u skupu stanja koje predstavalja stanje DKA
• Prelasci iz stanja D DKA na slovo a– Neka je S prazan skup– Naći skup N stanja NKA koja su u D
• Za svako stanje n iz N– Naći skup stanja N’ u koje se može preći na slovo a– S S union N’
– Ako je S neprazan, tada postoji prelazak iz stanja D u ono stanje DKA koje ima S kao skup stanja
– U suprotnom, nema prelaska iz D na slovo a
46
NKADKA primjer za (a|b)*.(a|b)*
1 2
3
4
5
6
a
b
7
8
9 10
11
12
13
14
a
b
15
16
.
1,2,3,4,8
5,7,2,3,4,8
6,7,2,3,4,8
9,10,11,12,16
13,15,10,11,12,16
14,15,10,11,12,16
a
b
.
.
a
b
a
b
a
b
bb
a a.
47
NKADKA primjer za (a|b)*.(a|b)*
-closure({1}) = {1,2,3,4,8} = A – početno stanje DKA
• Trans(A,a)={5}, jer imamo prelazak iz stanja 3 u stanje 5 na slovo A
-closure({5}) = {5,7,2,3,4,8} = B
• U DKA imamo Trans(A,a) = B
48
Leksička struktura jezika
• Svaki programski jezik ima više kategorija rječi. Tipične kategorije su:– Ključne riječi (if, while)– Aritmetičke operacije (+, -, *, /)– Cijeli brojevi (1, 2, 45, 67)– Realni brojevi (1.0, .2, 3.337)– Identifikatori (abc, i, j, ab345)
• Uobičajeno je da imamo leksičku kategoriju za svaku ključnu riječ i/ili svaku kategoriju
• Svaka leksička kategorija definiše se regulranim izrazom
49
Leksičke kategorije - primjer
• IfKeyword = if• WhileKeyword = while• Operator = +|-|*|/• Integer = [0-9] [0-9]*• Float = [0-9]*. [0-9]*• Identifier = [a-z]([a-z]|[0-9])*• Note that [0-9] = (0|1|2|3|4|5|6|7|8|
9)[a-z] = (a|b|c|…|y|z)
• Sljedeća faza kompajlera koristi leksičke kategorije
50
Pišemo regularne izraze
• Svi stringovi nad alfabetom { <, > }– (<|>)*
• Stringovi gdje iza otvorenih zagrada slijede zatvorene zagrade– <*>*
• Stringovi sa odgovarajućim brojem otvorenih i zatvorenih zagrada– Ne može se napisati regularni izraz!
51
Ugnježedeni izrazi
• Možemo li regularnim izrazima opisati sintaksu?
• Probajte sljedeće:– (a+(b-c))*(d-(x-(y-z)))– if (x < y) if (y < z) a = 5 else a = 6 else a
= 7
52
Beskontekstne gramatike (Context-Free Grammar)
• Skup terminalnih simbola{ Op, Int, Open, Close }Svaki terminal je definisanregularnim izrazom
• Skup neterminala{ Start, Expr }
• Skup pravila (produkcija)– jedan neterminal sa lijeva– niz terminala ineterminala sa desne strane pravila
Op = +|-|*|/Int = [0-9] [0-9]*Open = <Close = >
Start ExprExpr Expr Op ExprExpr IntExpr Open Expr
Close
53
Generisanje
Počinjemo sa neterminalom Start (ili onom koji je označen kao početni neterminal)
loop until (nema neterminala u stringu)izaberi neterminal izaberi produkciju sa tim netrminalom sa
lijeve strane zamijeni neterminal sa desnom stranom
produkcije
• Ovo je proces izvođenja (derivacije)
54
Primjer izvođenja
Start
Expr
Expr Op Expr
Open Expr Close Op Expr
Open Expr Op Expr Close Op Expr
Open Int Op Expr Close Op Expr
Open Int Op Expr Close Op Int
Open Int Op Int Close Op Int
Op = +|-|*|/Int = [0-9] [0-9]*Open = <Close = >
1) Start Expr2) Expr Expr Op Expr3) Expr Int4) Expr Open Expr
Close
55
Primjer izvođenja
Open Int Op Int Close Op Int< Int Op Int Close Op Int< [0-9][0-9]* Op Int Close Op
Int< 2 Op Int Close Op Int< 2 +|-|*|/ Int Close Op Int< 2 - Int Close Op Int< 2 - [0-9][0-9]* Close Op Int< 2 - 1 Close Op Int< 2 - 1 > Op Int< 2 - 1 > +|-|*|/ Int< 2 - 1 > + Int< 2 - 1 > + [0-9][0-9]* < 2 - 1 > + 1
Op = +|-|*|/Int = [0-9] [0-9]*Open = <Close = >
1) Start Expr2) Expr Expr Op Expr3) Expr Int4) Expr Open Expr
Close
56
Drvo parsiranja
• unutrašnji čvorovi: neterminali• listovi: terminali• grane: individualna izvođenja
57
Drvo parsiranja za <2-1>+1
Start
Expr
ExprExprOp
+Open<
Close>
ExprInt1
Op -
Expr
Int2
Expr
Int1
58
Parsiranje
< 2 - 1 > + 1Open 2 - 1 > + 1Open Int - 1 > + 1Open Int Op 1 > + 1Open Int Op Int > + 1Open Int Op Int Close + 1Open Int Op Int Close Op
1Open Int Op Int Close Op
Int
Op = +|-|*|/Int = [0-9] [0-9]*Open = <Close = >
1) Start Expr2) Expr Expr Op Expr3) Expr Int4) Expr Open Expr
Close
59
Parsiranje
Open Int Op Int Close Op Int
Open Expr Op Int Close Op Int
Open Expr Op Expr Close Op Int
Open Expr Close Op Int
Expr Op Int
Expr Op Expr
Expr
Start
Op = +|-|*|/Int = [0-9] [0-9]*Open = <Close = >
1) Start Expr2) Expr Expr Op Expr3) Expr Int4) Expr Open Expr
Close
60
Primjer
Start SS ( L )S aL L , SL S
Drvo parsiranja za
(a, (a, a)) ( a , ( a , a ) )
S S S
L L
L
S
L
S
61
Definisanje KSG
KSG je struktura {S, P, N, T} S = startno stanjeP = produkcije (pravila)N = neterminaliT = terminali
V = NTp P ima oblik X -> W1 W2 …Wn
X N
Wi V, i=1,...,n
62
KSG primjer 1Palindromi
e.g. “dennis sinned”, “abba”T = {a, b} N = { E } S = EP = { E -> aEa | bEb | }
Derivacija Pravilo1. E aEa E -> aEa2. E abEba E -> bEb3. E abba E-> 4. E abba
E/ | \a E a/ | \b E b
|
63
KSG primjer 1
T = {a, b} N = { E } S = EP = { E -> aEa | bEb | }
Parse stabloFrontier
– Pre-order obilazak– Prikaz rečenice
E/ | \
a E a/ | \b E b
|
64
KSG primjer 2
T = {a, b} N = { S } S = S, S = { S -> | aSbS | bSaS }Stringovi sa jednakim brojem slova a i b.
b a
S
SS
SS ba
S
SS ba
a b SS
65
KSG primjer 3
Start ExprExpr Expr +
TermExpr Expr - TermExpr TermTerm Term * IntTerm Term / IntTerm Int
• Skup tokena je { +, -, *, /, Int }, gdje Int = [0-9][0-9]*
• Svaki Int n token predstavljamo samo sa n
66
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2-2*2
Start
Trenutna pozicija u drvetu
Primjer parsiranja
67
Primijenjeno pravilo
Start Expr
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2-2*2
Expr
Expr
Trenutna pozicija u drvetu
Primjer parsiranja
68
Primijenjeno pravilo
Expr Expr - Term
Parse Tree
Rečenična forma
Preostali dio ulaza
2-2*2
Expr - Term
Start
Expr
TermExpr -
Primjer parsiranja
Expr Expr + Term
Expr Expr - Term
Expr Term
69
Primijenjeno pravilo
Expr Term
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2-2*2
Term - Term
Expr
TermExpr -
Term
Primjer parsiranja
Expr Expr + Term
Expr Expr - Term
Expr Term
70
Primijenjeno pravilo
Term Int
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2-2*2
Expr
TermExpr -
Term
Int
Int - Term
Primjer parsiranja
71
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2-2*2
2 - Term
Expr
TermExpr -
Term
MatchInput Token!
Int 2
Primjer parsiranja
72
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
-2*2
2 - Term
Expr
TermExpr -
Term
MatchInput Token!
Int 2
Primjer parsiranja
73
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2*2
2 - Term
Expr
TermExpr -
Term
MatchInput Token!
Int 2
Primjer parsiranja
74
Primijenjeno pravilo
Term Term * Int
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2*2
2 - Term*Int
Expr
TermExpr -
TermTerm Int*
Int 2
Primjer parsiranja
75
Primijenjeno pravilo
Term Int
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2*2
2 - Int * Int
Expr
TermExpr -
TermTerm Int*
Int 2Int
Primjer parsiranja
76
MatchInput Token!
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2*2
2 - 2* Int
Expr
TermExpr -
TermTerm Int*
Int 2Int 2
Primjer parsiranja
77
MatchInput Token!
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
*2
2 - 2* Int
Expr
TermExpr -
TermTerm Int*
Int 2Int 2
Primjer parsiranja
78
MatchInput Token!
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2
2 - 2* Int
Expr
TermExpr -
TermTerm Int*
Int 2Int 2
Primjer parsiranja
79
Primjer parsiranja
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2
2 - 2* 2
Expr
TermExpr -
TermTerm Int 2*
Int 2Int 2
ParseComplete!
80
Primjer parsiranja
Start
Parse Tree
Rečenična forma
Preostali dio ulaza
2 - 2* 2
Expr
TermExpr -
TermTerm Int 2*
Int 2Int 2
ParseComplete!