02 - jezici automati gramatike

Post on 25-Oct-2014

56 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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!

top related