02 - jezici automati gramatike

80
Jezici, regularni izrazi, automati i gramatike

Upload: dragica-petrovic

Post on 25-Oct-2014

55 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 02 - Jezici Automati Gramatike

Jezici, regularni izrazi, automati i gramatike

Page 2: 02 - Jezici Automati 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?

Page 3: 02 - Jezici Automati Gramatike

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)

Page 4: 02 - Jezici Automati Gramatike

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

Page 5: 02 - Jezici Automati Gramatike

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

Page 6: 02 - Jezici Automati Gramatike

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

Page 7: 02 - Jezici Automati Gramatike

7

Skener u akciji

f o r v a r 1 = 1 0 v a r 1 < =

Page 8: 02 - Jezici Automati Gramatike

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

Page 9: 02 - Jezici Automati Gramatike

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?

Page 10: 02 - Jezici Automati Gramatike

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*.

Page 11: 02 - Jezici Automati Gramatike

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

Page 12: 02 - Jezici Automati Gramatike

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

Page 13: 02 - Jezici Automati Gramatike

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)

Page 14: 02 - Jezici Automati Gramatike

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

Page 15: 02 - Jezici Automati Gramatike

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

Page 16: 02 - Jezici Automati Gramatike

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

Page 17: 02 - Jezici Automati Gramatike

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

Page 18: 02 - Jezici Automati Gramatike

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

Page 19: 02 - Jezici Automati Gramatike

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)*

Page 20: 02 - Jezici Automati Gramatike

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.

Page 21: 02 - Jezici Automati Gramatike

21

1

0

1

0

1 1 . 0

. Početno stanje

Završno stanje

Tekuće slovo

Tekuće stanje

Primjer

Page 22: 02 - Jezici Automati Gramatike

22

Primjer

1

0

1

0

1 1 . 0

. Početno stanje

Završno stanje

Tekuće slovo

Tekuće stanje

Page 23: 02 - Jezici Automati Gramatike

23

Primjer

1

0

1

0

1 1 . 0

. Početno stanje

Završno stanje

Tekuće slovo

Tekuće stanje

Page 24: 02 - Jezici Automati Gramatike

24

Primjer

1

0

1

0

1 1 . 0

. Početno stanje

Završno stanje

Tekuće slovo

Tekuće stanje

Page 25: 02 - Jezici Automati Gramatike

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!

Page 26: 02 - Jezici Automati Gramatike

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

Page 27: 02 - Jezici Automati Gramatike

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

Page 28: 02 - Jezici Automati Gramatike

28

RE Automati

aa

Završno stanje

Početno stanje

Page 29: 02 - Jezici Automati Gramatike

29

Konkatenacija

r1r2

Završno stanje

Početno stanje

r1 r2

Page 30: 02 - Jezici Automati Gramatike

30

Konkatenacija

r1r2

Završno stanje

Početno stanje

r1 r2

Staro završno stanje

Staro početno stanje

Page 31: 02 - Jezici Automati Gramatike

31

Konkatenacija

r1r2 r1 r2

Završno stanje

Početno stanje

Staro završno stanje

Staro početno stanje

Page 32: 02 - Jezici Automati Gramatike

32

Konkatenacija

r1r2

r1 r2

Završno stanje

Početno stanje

Staro završno stanje

Staro početno stanje

Page 33: 02 - Jezici Automati Gramatike

33

Konkatenacija

r1r2

r1 r2

Završno stanje

Početno stanje

Staro završno stanje

Staro početno stanje

Page 34: 02 - Jezici Automati Gramatike

34

Alternacija

r1|r2

r1

r2

Završno stanje

Početno stanje

Page 35: 02 - Jezici Automati Gramatike

35

Alternacija

r1|r2

r1

r2

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 36: 02 - Jezici Automati Gramatike

36

Alternacija

r1|r2

r1

r2

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 37: 02 - Jezici Automati Gramatike

37

Alternacija

r1|r2

r1

r2

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 38: 02 - Jezici Automati Gramatike

38

Zatvorenje (Kleene *)

r* r

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 39: 02 - Jezici Automati Gramatike

39

Zatvorenje

r* r

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 40: 02 - Jezici Automati Gramatike

40

Zatvorenje

r* r

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 41: 02 - Jezici Automati Gramatike

41

Zatvorenje

r* r

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 42: 02 - Jezici Automati Gramatike

42

Zatvorenje

r* r

Staro završno stanje

Staro početno stanje

Završno stanje

Početno stanje

Page 43: 02 - Jezici Automati Gramatike

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

Page 44: 02 - Jezici Automati Gramatike

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)

Page 45: 02 - Jezici Automati Gramatike

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

Page 46: 02 - Jezici Automati Gramatike

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.

Page 47: 02 - Jezici Automati Gramatike

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

Page 48: 02 - Jezici Automati Gramatike

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

Page 49: 02 - Jezici Automati Gramatike

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

Page 50: 02 - Jezici Automati Gramatike

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!

Page 51: 02 - Jezici Automati Gramatike

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

Page 52: 02 - Jezici Automati Gramatike

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

Page 53: 02 - Jezici Automati Gramatike

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)

Page 54: 02 - Jezici Automati Gramatike

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

Page 55: 02 - Jezici Automati Gramatike

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

Page 56: 02 - Jezici Automati Gramatike

56

Drvo parsiranja

• unutrašnji čvorovi: neterminali• listovi: terminali• grane: individualna izvođenja

Page 57: 02 - Jezici Automati Gramatike

57

Drvo parsiranja za <2-1>+1

Start

Expr

ExprExprOp

+Open<

Close>

ExprInt1

Op -

Expr

Int2

Expr

Int1

Page 58: 02 - Jezici Automati Gramatike

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

Page 59: 02 - Jezici Automati Gramatike

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

Page 60: 02 - Jezici Automati Gramatike

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

Page 61: 02 - Jezici Automati Gramatike

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

Page 62: 02 - Jezici Automati Gramatike

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

|

Page 63: 02 - Jezici Automati Gramatike

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

|

Page 64: 02 - Jezici Automati Gramatike

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

Page 65: 02 - Jezici Automati Gramatike

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

Page 66: 02 - Jezici Automati Gramatike

66

Start

Parse Tree

Rečenična forma

Preostali dio ulaza

2-2*2

Start

Trenutna pozicija u drvetu

Primjer parsiranja

Page 67: 02 - Jezici Automati Gramatike

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

Page 68: 02 - Jezici Automati Gramatike

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

Page 69: 02 - Jezici Automati Gramatike

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

Page 70: 02 - Jezici Automati Gramatike

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

Page 71: 02 - Jezici Automati Gramatike

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

Page 72: 02 - Jezici Automati Gramatike

72

Start

Parse Tree

Rečenična forma

Preostali dio ulaza

-2*2

2 - Term

Expr

TermExpr -

Term

MatchInput Token!

Int 2

Primjer parsiranja

Page 73: 02 - Jezici Automati Gramatike

73

Start

Parse Tree

Rečenična forma

Preostali dio ulaza

2*2

2 - Term

Expr

TermExpr -

Term

MatchInput Token!

Int 2

Primjer parsiranja

Page 74: 02 - Jezici Automati Gramatike

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

Page 75: 02 - Jezici Automati Gramatike

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

Page 76: 02 - Jezici Automati Gramatike

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

Page 77: 02 - Jezici Automati Gramatike

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

Page 78: 02 - Jezici Automati Gramatike

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

Page 79: 02 - Jezici Automati Gramatike

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!

Page 80: 02 - Jezici Automati Gramatike

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!