Formális nyelvek
Széchenyi István Egyetem
1. előadás Matematikai és nyelvi alapok, Szintaktikai vizsgálat
Dr. Kallós Gábor
2013–2014 11
Formális nyelvek
Széchenyi István Egyetem
Tartalom Matematikai alapfogalmak Halmazok Relációk Függvények Homomorfizmusok
Nyelvi alapfogalmak Ábécé, szavak, nyelvek Műveletek szavakkal és nyelvekkel
Szintaktikai vizsgálat Kifejezés Köznapi nyelv Programozási nyelv
2
Formális nyelvek
Széchenyi István Egyetem
Matematikai alapfogalmak Halmazelmélet Halmaz és halmazhoz való hozzátartozás: nem definiált alapfogalom Tudjuk: a ∈ B és a ∉ B közül csak pontosan az egyik teljesül
Halmaz megadási módja Kapcsos zárójelben felsoroljuk az elemeit Megadjuk az elemeket jellemző tulajdonságo(ka)t (a módszer alkalmazhatóságát a részhalmaz axióma garantálja) { h | a h elem T tulajdonságú } Példa: { x ∈ R | 0 < x < 1}
A halmazelmélet (pontos matematikai) felépítése: axiómák, definíciók, állítások, tételek Meghatározottsági axióma Legyenek A és B halmazok. A akkor és csak akkor egyenlő B-vel, ha minden x ∈ A esetén x ∈ B, és minden y ∈ B esetén y ∈ A. Azaz: elemeik azonosak
Definíció Legyenek A és B halmazok. A része B-nek, ha minden x ∈ A-ra x ∈ B is teljesül (jelölés: A ⊂ B). Tétel (halmazok egyenlősége): A = B, ha A ⊂ B és B ⊂ A Üres halmaz axióma Létezik olyan halmaz, amelynek nincs eleme. Ez az üres halmaz, jelölése ∅. Állítás: Pontosan egy ilyen halmaz létezik 3
Formális nyelvek
Széchenyi István Egyetem
Matematikai alapfogalmak Halmazelmélet (folyt.) Definíciók (Legyenek A és B halmazok) Unió, metszet, különbséghalmaz értelmezése (tudjuk) Jelölések: A∪B, A ∩ B, A \ B Az unió axiómából Disztributivitási tulajdonság, De-Morgan azonosságok, egyéb összefüggések (igazolhatók)
A és B diszjunkt, ha nincs közös elemük Komplementer halmaz (H alaphalmazra vonatkozóan) H \ A, Jelölés: ¯
Hatványhalmaz axióma Legyen A halmaz. Létezik olyan halmaz, amely tartalmazza A minden egyes részhalmazát. Ezt a halmazt A hatványhalmazának nevezzük, P(A)-val jelöljük
Állítás: P(A) elemszáma 2|A| (ez indukcióval igazolható) Definíció: Legyenek A és B halmazok. A és B direkt (vagy Descartes-féle) szorzata az összes olyan rendezett (x, y) számpárból álló halmaz, amelyeknél x ∈ A és y ∈ B. A direkt szorzat jele: ×. A × B = {(x, y) | x ∈ A és y ∈ B} (Rendezett pár definíció) Általánosítható n darab halmazra
Feladat: Soroljuk fel A × B elemeit, ahol A = {1, 2} és B = {3, 4, 5} 4
Formális nyelvek
Széchenyi István Egyetem
Matematikai alapfogalmak Relációk Definíció: Legyenek M1, M2, …, Mn tetszőleges halmazok. Egy ρ ⊆ M1 × M2 × … × Mn halmazt relációnak nevezünk (rendezett szám n-es) Megj.: Az üres halmaz is reláció (mert nincs olyan eleme, ami nem rendezett szám n-es)
Ha n = 2, akkor ρ-t bináris relációnak nevezzük Elemei rendezett párok, jelölés: 〈a, b〉 vagy (a, b) Itt már beszélhetünk értelmezési tartományról és értékkészletről
Legyen a ∈ A és b ∈ B egy ρ ⊆ A × B bináris reláció esetén. Ha ekkor 〈a, b〉 ∈ ρ teljesül, akkor azt mondjuk, hogy „a ρ relációban van b-vel”. Jelölések: ρ(a, b), vagy ρ〈a, b〉, vagy a ρ b. Definíció: Legyenek ρ ⊆ A × B1 és σ ⊆ B2 × C bináris relációk. Két bináris reláció kompozíciójának (szorzatának) nevezzük azt a ρ ◦ σ relációt, ahol ρ ◦ σ ⊆ A × C, és ρ ◦ σ = {〈a, c〉 | ∃ b ∈ B1 ∩ B2 úgy, hogy 〈a, b〉 ∈ ρ és 〈b, c〉 ∈ σ}. A kompozícióképzés nem kommutatív művelet Feladat: Legyen ρ = { 〈n, n + 1〉 | n ∈ N} és σ = { 〈n, 3n〉 | n ∈ N}. Adjuk meg a ρ ◦ σ és σ ◦ ρ relációkat!
Egy ρ ⊆ M × M reláció k-adik (k ≥ 0) hatványát a következő módon értelmezzük: ρ0 = { (a, a) | a ∈ M}; ρk + 1 = ρk ◦ ρ, ha k ≥ 1 Nyilván ρ1 = ρ 5
Formális nyelvek
Széchenyi István Egyetem
Matematikai alapfogalmak Relációk (folyt.) Definíciók + 2 3 Egy ρ ⊆ M × M reláció tranzitív lezártja ρ = ρ U ρ U ρ U ... = Egy ρ ⊆ M × M reláció reflexív, tranzitív lezártja ρ* = ρ0 ∪ ρ+
∞
Uρ
k
k =1
ρ+ mindig tranzitív, és ez a legszűkebb olyan reláció, amely tranzitív, és tartalmazza ρ-t ρ* reflexív és tranzitív, és a legszűkebb az ilyen tulajdonságú ρ-t tartalmazó relációk közül
Definíció: Egy ρ ⊆ M × M (homogén) bináris reláció reflexív, ha minden x ∈ M-re fennáll x ρ x; szimmetrikus, ha minden x, y ∈ M-re x ρ y ⇒ y ρ x; antiszimmetrikus, ha minden x, y ∈ M-re x ρ y és y ρ x ⇒ x = y; tranzitív, ha minden x, y, z ∈ M-re x ρ y és y ρ z ⇒ x ρ z (Megj.: A homogén reláció meghatározása az, hogy értékkészlete része az értelmezési tartományának, de sokszor úgy használják, hogy a két halmaz megegyezik)
Speciális relációk Definíció: A ρ (homogén) bináris reláció ekvivalencia-reláció, ha reflexív, szimm. és tranzitív Ekvivalencia-reláció példák: egyenesek párhuzamossága, szakaszok egybevágósága, számhalmazok egyenlősége
Igazolható, hogy minden ekvivalencia-reláció M-et páronként diszjunkt, nem üres részhalmazokra bontja fel (ekvivalencia-osztályok), és a részhalmazokból reprezentáns elem választható (Egy A halmazrendszer az A halmaz osztályfelbontása, ha A elemeinek uniója A-t adja, és tetszőleges két A-beli elemre teljesül, hogy ha nem diszjunktak, akkor megegyeznek) Reprezentáns példák: egyenesek párhuzamossága – irány fogalom; szakaszok egybevágósága – hosszúság fogalom
6
Formális nyelvek
Széchenyi István Egyetem
Matematikai alapfogalmak Speciális relációk (folyt.) Definíció: A ρ (homogén) bináris reláció rendezési reláció, ha reflexív, antiszimmetrikus és tranzitív Ekkor (M, ρ)-t rendezett halmaznak nevezzük – olyan (rendezett) pár, amelynek első komponense egy nem üres halmaz, második komponense pedig egy, a halmazon értelmezett rendezési reláció Rendezett halmaz példák: (N N, ≤), és hasonlóan (Z Z, ≤), (Q Q, ≤), (R R, ≤); (P(H), ⊆) – ahol H tetszőleges halmaz, részhalmaz tulajdonsággal; (N N, | ), (Z Z, | ) – itt | az oszthatóság De: (N N, <) és (Z Z, <) nem rendezett halmaz, mert < nem reflexív!
Definíció: Egy f reláció függvény, ha minden 〈x, y〉 és 〈x, z〉 ∈ f esetén y = z Azaz ha nincs két olyan eleme, hogy az első komponensek megegyeznek, a másodikak pedig különbözők Jelölések függvény esetén: f(a, b) vagy a f b helyett b = f(a)
Függvényekkel kapcsolatos fontos fogalmak (itt eml., összefoglaló módon, részl. nélkül) Értelmezési tartomány (Df), értékkészlet (Rf), leképezés, helyettesítési érték (x-hez hozzárendelt elem) Függvényképző eljárások: függvény leszűkítése, függvények kompozíciója, függvény invertálása (invertálható kell, hogy legyen a függvény) Képhalmaz, X ⊂ Df halmaz képe, Y ⊂ Rf halmaz ősképe
Legyen f: A → B. Azt mondjuk, hogy …
… f az A-t B-be leképező injekció, ha f invertálható; … f az A-t B-re leképező szuperjekció (szürjekció), ha Rf = B; … f az A és B közti bijekció, ha injekció és szuperjekció is
Formális nyelvek
7
Széchenyi István Egyetem
Matematikai alapfogalmak Definíció: Az (A, F) párt algebrának nevezzük, ahol A nem üres halmaz, F pedig az An értelmezett műveletek halmaza Példák algebrákra: (N N, +), (N N, {+, ⋅})
Definíció: Legyen (A, ◦ ) és (B, •) két algebra. Egy h: A → B leképezést homomorfizmusnak nevezünk, ha … … injektív (monomorfizmus), azaz az értelmezési tartomány minden eleméhez az értékkészletnek pontosan egy eleme van hozzárendelve; … és művelettartó, azaz minden a, b ∈ A esetén érvényes, hogy h(a ◦ b) = h(a) • h(b). Ekkor A-t és h(A)-t homomorf(ak)nak nevezzük. A homomorfizmusok különös jelentősége az, hogy a definíciós halmaz struktúrájának típusát a képhalmazra viszik át (pl. csoportok) Egyes speciális struktúrák közötti homomorfizmusok (az algebrákon túl): csoportok, gyűrűk, vektorterek (köztük lineáris leképezések), rendezett halmazok
Ha a h: A → B függvény kölcsönösen egyértelmű (bijektív), és inverze is homomorfizmus, akkor izomorfizmusról beszélünk Az izomorf struktúrák algebrai nézőpont szerint megegyeznek Egyéb további speciális homomorfizmusok: Ha a leképezés szürjektív (epimorfizmus), illetve ha a leképzésnél B ⊂ A (endomorfizmus) (Homomorf és izomorf struktúrákkal részletesen foglalkozunk még a számtud. slide-okon is)
Félcsoport, monoid, csoport definíciója (számtud. slide-ok) 8
Formális nyelvek
Széchenyi István Egyetem
Nyelvi alapfogalmak Ábécé, szó Definíciók Ábécé: szimbólumok tetszőleges, nem üres, véges halmaza; jelölés: V (vagy Ʃ) A szimbólumokról feltesszük, hogy megkülönböztethetők és különböznek egymástól
Szó (mondat): V elemeiből képzett sorozat, azaz a1…ak, ahol k ≥ 0, és a1, …, ak ∈ V Üresszó (null szó): k = 0 eset, jele λ (néha ε) Összes szó halmaza V felett (benne az üres szó is); jelölés: V* Ha az üresszót nem engedjük meg: V + = V* – {λ} (Megj.: Nem üres V halmaz esetén V* megszámlálhatóan végtelen)
Szó hossza (V felett): szimbólumok száma benne, jelölés: |w| (w szóra) Rekurzív definíció is lehetséges Itt |λ| = 0
Példa Legyen Ʃ = {a, b} Néhány szó Ʃ felett: a, b, ab, bb, baa, aba, abba, baba, … (Hány szót tudunk felsorolni?) Szavak hossza Ʃ felett: |a| = 1, |ab| = 2, … Ʃ* = {λ, a, b, aa, ab, ba, bb, aaa, aab, aba, …} (Milyen rendezést célszerű itt alkalmazni? Hány darab n hosszú szót tudunk megadni?) 9
Formális nyelvek
Széchenyi István Egyetem
Nyelvi alapfogalmak Ábécé, szó (folyt.) Definíció Szavak egyenlősége: csak ha „betűről-betűre” megegyeznek, azaz valamely V*-beli p = a1…am és q = b1…bn szavakat pontosan akkor tekintünk egyenlőknek, ha m = n és ∀ i = 1, …, n-re ai = bi Tréfás példa Legyen V = {1, 2, +}. Ekkor V*-ban (persze nem matematikai értelemben…) fennáll, hogy 1+1 ≠ 2, mivel az 1+1 szó nem egyezik meg „betűről-betűre” a 2 szóval.
Definíció Szavak konkatenációja (egymás után írás, összefűzés, „szorzás”): u és v V*-beli szavakra uv ∈ V* Érvényes: |uv| = |u| + |v|
un: az u szó n-szer egymás után írva (hatványozás) Itt is megadható rekurzív definíció ∀ u ∈ V*-ra u0 = λ Igaz továbbá: xλ = λx = x
De: a konkatenáció általában nem kommutatív! (azaz általában uv ≠ vu) Példa Legyen Ʃ = {a, b}. Ekkor az abba Ʃ*-beli szó baba szóval való szorzata abbababa, ami nem egyezik meg a babaabba szóval.
10
Formális nyelvek
Széchenyi István Egyetem
Nyelvi alapfogalmak: szóműveletek Ábécé, szó (folyt.) Igazolható, hogy V* a konkatenáció művelettel egységelemes félcsoportot, monoidot alkot A művelet asszociatív, és az üresszó egység
Definíció Legyenek x és w V*-beli szavak. Azt mondjuk, hogy x prefixe (kezdőszelete) w-nek, ha van olyan y V*-beli szó, hogy w = xy. Ha x, y ≠ λ, akkor valódi prefixről beszélünk Valódi prefixre: |x| = k a prefix hossza Hasonlóan értelmezhető egy szó szuffixe (végződése)
Definíció Legyenek x és w V*-beli szavak. Azt mondjuk, hogy x részszava w-nek, ha van olyan y, z ∈ V*, hogy w = yxz (itt y és z lehet üresszó). Valódi részszó is hasonlóan értelmezhető Használatos az alszó, kezdő alszó, és befejező alszó megnevezés is
Feladat: Adjunk meg részszót, prefixet és szuffixet az abbababa szónál! Hány különböző prefix lehetséges?
(Szó tükörképe is definiálható, jelölés: w–1)
11
Formális nyelvek
Széchenyi István Egyetem
Nyelvi alapfogalmak Nyelv (vagy: V feletti nyelv, formális nyelv): V* tetszőleges L részhalmaza; azaz L ⊂ V* Adott formális elem adott nyelvbe való tartozása egyértelműen eldönthető Egy nyelv lehet üres, véges vagy végtelen Üres nyelv: L = ∅ Csak az üres szót tartalmazó nyelv: L = {λ} (ennek van egy eleme) Egyszerű alapnyelvek: L = {a} típusúak A véges nyelvek – elvileg – elemeik felsorolásával megadhatók
Teljes nyelv: L = V* (minden lehetséges szót tartalmaz)
Megjegyzések Egy adott Ʃ ábécé feletti összes lehetséges nyelvek halmaza a Ʃ* összes részhalmazából alkotott halmaz, vagyis Ʃ* hatványhalmaza. Mivel Ʃ* számossága megszámlálhatóan végtelen, így egy véges, de nem üres Ʃ ábécé felett kontinuum sok (különböző) nyelv létezik. A hagyományos nyelvek (pl. magyar nyelv) nem tekinthetők formális nyelvnek abban az értelemben, hogy a nyelv „halmaza” nem „tiszta”, nem véglegesen lezárt, ill. részben szubjektív is; továbbá ugyanazon szónak lehet több jelentése Példa: Word helyesírás ellenőrzője (esettanulmányok) Feladat: Nézzük meg, hogy egyes, köznapinak tekinthető szavakat nem ismer fel, máskor számunkra teljesen „magyartalan”, ismeretlen szavakat elfogad 12
Formális nyelvek
Széchenyi István Egyetem
Nyelvi alapfogalmak Példa: nyelvek V = {0, 1, …, 9} felett A magyar történelmi évszámok halmaza ekkor egy véges nyelv V felett Lehet persze szubjektív, de biztosan véges
A páratlan számok halmaza (tízes számrendszer) egy V feletti végtelen nyelv
Példa: néhány nyelv Ʃ = {a, b} felett Véges nyelvek {λ, a, aa, aab} {x ∈ Ʃ* | |x| ≤ 7} Végtelen nyelvek {x ∈ Ʃ* | |x| páratlan} {x ∈ Ʃ* | |x| prím} {λ, ab, aabb, aaabbb, …} = {anbn | n ≥ 0} Adjunk meg néhány további véges és végtelen nyelv példát! (Legyen például V = {0, 1} vagy V = {a, b})
(Megj.: Szükségünk lesz olyan eszközökre, amelyekkel az eddigieknél lényegesen bonyolultabb nyelveket is megadhatunk – generatív nyelvtannal történő megadás, lásd később) 13
Formális nyelvek
Széchenyi István Egyetem
Műveletek nyelvekkel A nyelvek halmazok és jelsorozatok is egyben. Így a rajtuk értelmezett műveletek is kétféle típusúak. Boole műveletek (∪, ∩, \, ¯ ) Reguláris műveletek (+, •, *)
Tetszőleges L1, L2 ⊆ V* nyelvek esetén értelmezhető a nyelvek (mint halmazok) uniója, metszete, különbsége, illetve L1-nek a V*-ra vonatkozó komplementere, és ezek szintén V*-beliek A jelölések a megszokottak (∪, ∩, \, ¯ ) Egy formális definíció (a többi hasonlóan) L1 ∩ L2 = {p | p ∈ L1 és p ∈ L2 }
A komplementer képzésnél nagyon vigyázni kell az alaphalmaz megadására (!) Példa: Az L = {λ, a, aa, aab} nyelv komplementere teljesen más a Ʃ = {a, b}, illetve a Ʃ' = {a, b, c} felett
A konkatenációt is értelmezzük nyelvekre (ez a művelet halmazokra nincs értelmezve, itt a jelsorozat tulajdonság él!) L1L2 = {uv | u ∈ L1, v ∈ L2 } Általában L1 L2 ≠ L2 L1 Egy L1L2-beli szó nem feltétlenül csak egyféle módon bontható fel L1-beli és L2-beli elemekre
A konkatenáció segítségével egy nyelv önmagával vett konkatenáltját (szorzatát) is értelmezhetjük 14
Formális nyelvek
Széchenyi István Egyetem
Műveletek nyelvekkel Nyelv i-edik hatványa Lk = LL…L Itt L0 = {λ} (megállapodás szerint), L1 = L Itt is lehetséges rekurzív definíció Ugyanúgy mint szavakra, használatos Vk = VV…V is (Az ábécé is nyelv, hiszen V ⊂ V*. Így az ábécére is értelmezett minden nyelvművelet, esetleg triviális eredménnyel.)
Kleene-iteráció, a konkatenáció lezárása ∞ L* = {λ} ∪ L ∪ LL ∪ LLL ∪ … (Kleene-csillag), vagy L∗ = U Li + illetve: L = L ∪ LL ∪ LLL ∪ … (Kleene-plusz) i =0 Azaz: az L*-beli elemek azok a jelsorozatok, amelyeket fel lehet úgy darabolni, hogy minden darab a nyelv mondata legyen (a darabok számára nincs megkötés) Itt L+ = L* is előfordulhat, pontosan akkor, ha λ ∈ L ∞ Hasonlóan: i ∗ V* = {λ} ∪ V ∪ VV ∪ VVV ∪ …, vagy V = V (Kérdés: Konzekvens ez az előző definícióval?) i =0
U
Természetes kérdés: zártak-e különböző nyelvosztályok ezekre a műveletekre? Az L nyelvosztály zárt a ◦ műveletre, ha tetszőleges L1, L2 ∈ L-re mindig L1 ◦ L2 ∈ L is teljesül (Hasonlóan definiálható az egyváltozós műveletre való zártság is) Később az ilyen típusú vizsgálatok fontosak lesznek
15
Formális nyelvek
Széchenyi István Egyetem
Műveletek nyelvekkel Legyen V egy rögzített ábécé. Ekkor tetszőleges L, L1, L2, L3 ⊆ V* esetén érvényesek a következő összefüggések: L1 ∪ L2 = L2 ∪ L1 (az unió kommutatív) (L1 ∪ L2) ∪ L3 = L1 ∪ (L2 ∪ L3) (az unió asszociatív) L ∪ L = L (az unió idempotens) L ∪ ∅ = ∅ ∪ L = L (az unióra nézve létezik egységelem, a ∅ üres nyelv) L1 ∩ L2 = L2 ∩ L1 (a metszet kommutatív) (L1 ∩ L2) ∩ L3 = L1 ∩ (L2 ∩ L3) (a metszet asszociatív) L ∩ L = L (a metszet idempotens) L ∩ V* = V* ∩ L = L (a metszetre nézve létezik egységelem, a V* univerzális nyelv) (L1L2)L3 = L1(L2L3) (a konkatenáció asszociatív) L{λ} = {λ}L = L (a konkatenációra nézve létezik egységelem, és ez {λ}) L ∅ = ∅ L = ∅ (a konkatenációra nézve létezik nullelem, és ez ∅; nem lehet szópárokat készíteni) L+ = LL* = L*L L* = L+ ∪ {λ} (L*)* = L* (az iteráció idempotens) (L+)+ = L+ (a + művelet idempotens) 16
Formális nyelvek
Széchenyi István Egyetem
Műveletek nyelvekkel Nyelvekre vonatkozó összefüggések (folyt.) (L*)+ = (L+)* = L*
L1 = L1 (a komplementerképzés involúciós tulajdonságú)
Megjegyzések A műveletek asszociativitása miatt általában nem is szoktuk zárójelekkel jelezni a(z elméleti) sorrendjüket További zárójelek hagyhatók el az egyértelmű precedencia következtében, sorrend: az egyargumentumú műveletek (komplementer, Kleene-csillag és Kleene-plusz) precedenciája nagyobb, mint a kétargumentumúaké; a konkatenációé nagyobb, mint az unióé és metszeté Disztributivitási tulajdonságok is megfogalmazhatók
Feladat: hagyjuk el a felesleges zárójeleket a következő kifejezésekből, ill. hozzuk egyszerűbb alakra a kifejezéseket (L1*) ∩ L2 ((L1 ∪ L2) ∪ L3) (L*L) (L ∩ L) ∪ ∅ ∪( L ∪ L)
Feladat (önálló gyakorlásra) Szemléltessük a fenti összefüggéseket konkrét nyelv példákkal (fontosabb esetek)!
17
Formális nyelvek
Széchenyi István Egyetem
Műveletek nyelvekkel Egyszerű nyelvműveleti példák {ab} ∪ {cd} = {ab, cd} {a, bx}{c, d} = {ac, ad, bxc, bxd} {c, d}{a, bx} = {ca, da, cbx, dbx} {ab}3 = {ababab} {ab}+ = {ab, abab, ababab, …} {ab}* = {λ, ab, abab, ababab, …}
Nyelvműveletek – feladatok (D. P. 9–10.) Legyen V = {a, b, c}, L1 = {a, c, bb, aba}, L2 = {a, abba, baba, caba, abbaba, babaabba}. Adjuk meg az L1 ∪ L2, L1 ∩ L2, L1 L2, L1 L1 halmazokat. Adjunk példát olyan V ábécé feletti L1 és L2 nyelvekre, amelyekre L1 L2 = L2 L1. (Próbáljunk nem triviális megoldást is megadni.) Adottak L1 és L2 véges nyelvek V ábécé felett úgy, hogy | L1 | = n és | L2 | = m. Mennyi lehet a számossága az L1 ∪ L2, L1 ∩ L2 és L1 L2 nyelveknek? Adjunk meg alsó és felső korlátot, továbbá példákat is. Igazoljuk vagy cáfoljuk, hogy (L1 ∪ L2)* = (L1)* ∪ (L2)* Segítség: az állítás hamis, például L1 = {a}, L2 = {b}-re látható
Mivel egyenlő L2, ha L = {anbn | n > 0}
18
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat Példa: Egy aritmetikai kifejezés szintaxisának megadása (Minden programozási nyelvben előfordul) Adott egy rögzített elemekből felépített kifejezés. Feladatunk eldönteni, hogy szintaktikusan helyes-e (nem „ránézésre” vagy „megérzéssel”, hanem algoritmussal). Ehhez formalizálni kell a rendszert! Milyen szimbólumok, számok, műveleti jelek szerepelhetnek a kifejezésben? Rögzítünk egy megfelelő halmazt (ebben az egyszerű példában): változók (A, B, C), konstansok (0, 1), műveleti jelek (+, ∗) és zárójelek Példa kifejezések: A + B ∗ C, AB ++ (C∗)
Milyen szabályok alapján épülhet fel a kifejezés a már rögzített szimbólumokból? Rekurzív definíció: a kifejezés állhat egy tagból, vagy lehet több tag összege; azaz a kifejezés lehet egy kifejezés és egy tag összege Nyilván definiálni kell majd a tagot is (és a többi részegységet is) Tömör és egyértelmű megfogalmazás kell!
Formális leírás elemei kifejezés = 〈kif.〉, tag = 〈tag〉, vagy művelet = |, „lehet” = → (vagy: ::=, Backus–Naur jelölés)
Kifejezés definíciója Így tehát 〈kif.〉 → 〈tag〉 | 〈kif.〉 + 〈tag〉 19
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat Példa: Egy aritmetikai kifejezés szintaxisának megadása (folyt.) Tag definíciója Lehet egy tényezőből álló szorzat (faktor), vagy több tényező szorzata (szintén rekurzív definícióval) 〈tag〉 → 〈fakt.〉 | 〈 fakt.〉 ∗ 〈fakt.〉
Faktor definíciója Lehet egy zárójelbe tett kifejezés, vagy változó, vagy konstans 〈fakt.〉 → (〈kif.〉) | 〈vált.〉 | 〈konst.〉 A kifejezésből kaphatunk majd újra tagot Itt teljes zárójelezést használunk, ami esetleg egyébként elhagyható lenne, de ezt nem tudjuk könnyen formalizálni – a prioritás kezelésére: lengyel-forma vagy valami hasonló eszköz kellene
Változók és konstansok (ebben a példában)
〈vált.〉 → A | B | C 〈konst.〉 → 0 | 1
Azaz: aritmetikai kifejezésnek az A, B, és C változó jelekből, a 0 és 1 konstans jelekből, a + és ∗ műveleti jelekből a „(” és „)” csoportosító jelekből a 〈kif.〉 → 〈tag〉 | 〈kif.〉 + 〈tag〉 〈tag〉 → 〈fakt.〉 | 〈 fakt.〉 ∗ 〈fakt.〉 〈fakt.〉 → (〈kif.〉) | 〈vált.〉 | 〈konst.〉 〈vált.〉 → A | B | C 〈konst.〉 → 0 | 1
… szabályok alkalmazásával felépíthető jelsorozatokat (szavakat/mondatokat) nevezzük
20
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat Példa: Egy aritmetikai kifejezés szintaxisának megadása (folyt.) Hogyan építhető fel egy szó a fenti szabályok alkalmazásával? 〈kif.〉-ből indulunk Egy jelsorozat (szó) esetén helyettesítsük a részegységek megnevezésére szolgáló szimbólumot az őt definiáló szintaktikai szabály jobb oldalának valamely lehetséges változatával (alternatíva) Helyettesítés (jelölés): ⇒
A ∗ (B + 1) levezetése 〈kif.〉 ⇒ 〈tag〉 ⇒ 〈 fakt.〉 ∗ 〈fakt.〉 ⇒ 〈 fakt.〉 ∗ (〈kif.〉) ⇒ 〈 fakt.〉 ∗ (〈kif.〉 + 〈tag〉) ⇒ 〈fakt.〉 ∗ (〈tag〉 + 〈tag〉) ⇒ … ⇒ 〈fakt.〉 ∗ (〈fakt.〉 + 〈fakt.〉) ⇒ 〈vált.〉 ∗ (〈fakt.〉 + 〈fakt.〉) ⇒ … ⇒ 〈vált.〉 ∗ (〈vált.〉 + 〈konst.〉) ⇒ A ∗ (〈vált.〉 + 〈konst.〉) ⇒ … ⇒ A ∗ (B + 1) Szintaktikailag hibás kifejezést nem tudunk így levezetni, például: + ∗ (B + 1), )B + 1(
Ilyen következtetési mód: levezetés Persze a gyakorlatban bonyolultabb aritmetikai kifejezések jönnek elő (ez a példa nagyon egyszerű), de azok is ugyanilyen módon kezelhetők
Szintaxis ezen megadási módja: generatív nyelvtannal való szintaxis megadás (Ez a leggyakoribb) 21
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat és generatív nyelvtanok (Eddigi tapasztalataink alapján…) Mit kell tartalmaznia egy generatív nyelvtan definíciójának? Azon szimbólumok (betűk) megadását, amelyekből a nyelvtannal definiálandó nyelv szavai állhatnak (terminális szimbólumok, nyelvi szimbólumok) Azon további szimbólumok megadását, amelyek nem szerepelnek (!) a nyelv szavaiban (mondataiban), de szükség van rájuk a szintaktikai szabályok megfogalmazásához (nemterminális szimbólumok, grammatikai szimbólumok) A szintaktikai (levezetési) szabályokat Azt a nemterminális szimbólumot (kezdő szimbólum), amelyből levezetés alkalmazásával a definiálandó nyelv valamennyi szavát megkapjuk A levezetés pontos definícióját
Szokásos jelölés szimbólum = terminális szimbólum 〈szimbólum〉 = nemterminális szimbólum
22
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat Példa: Köznapi nyelv (leszűkített részhalmaz, „minimagyar”) Szabályok 〈mondat〉 ::= 〈alanyi rész〉 〈állítmányi rész〉 〈alanyi rész〉 ::= 〈főnévi rész〉 〈határozó〉 〈állítmányi rész〉 ::= 〈tárgyi rész〉 〈igei rész〉 〈főnévi rész〉 ::= 〈névelő〉 〈jelzők〉 〈főnév〉 〈jelzők〉 ::= 〈jelző〉 | 〈jelző〉 〈jelzők〉 〈tárgyi rész〉 ::= 〈főnévi rész〉t 〈névelő〉 ::= λ | a | az | egy 〈jelző〉 ::= λ | hideg | meleg | fehér | fekete | nagy | kis 〈főnév〉 ::= kutya | macska | hús | egér | sajt | tej | víz 〈határozó〉 ::= λ | nappal | éjjel | reggel | este 〈igei rész〉 ::= eszik | iszik
Megjegyzések A szavak itt terminális szimbólumok (de most nem dőlten írtuk őket) A mondat végére írhatnánk pontot (de ekkor is gond lenne abból, hogy a nagybetűs kezdést nem tudnánk egyszerűen biztosítani Látható már most is, hogy nem tudunk minden valós nyelvtani szabályt alkalmazni (tárgyi rész: sajt, sajtot, víz, vizet, tej, tejet) 23
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat Példa: „Minimagyar” (folyt.) Levezetés példa 〈mondat〉 ⇒ 〈alanyi rész〉 〈állítmányi rész〉 ⇒ 〈főnévi rész〉 〈határozó〉 〈állítmányi rész〉 ⇒ 〈névelő〉 〈jelzők〉 〈főnév〉 〈határozó〉 〈állítmányi rész〉 ⇒ a 〈jelzők〉 〈főnév〉 〈határozó〉 〈állítmányi rész〉 ⇒ a 〈jelző〉 〈jelzők〉 〈főnév〉 〈határozó〉 〈állítmányi rész〉 ⇒ … a nagy fehér 〈főnév〉 〈határozó〉 〈állítmányi rész〉 ⇒ a nagy fehér kutya 〈határozó〉 〈állítmányi rész〉 ⇒ a nagy fehér kutya reggel 〈állítmányi rész〉 ⇒ a nagy fehér kutya reggel 〈tárgyi rész〉 〈igei rész〉 ⇒ a nagy fehér kutya reggel 〈főnévi rész〉t 〈igei rész〉 ⇒ a nagy fehér kutya reggel 〈névelő〉 〈jelzők〉 〈főnév〉t 〈igei rész〉 ⇒ … a nagy fehér kutya reggel 〈jelző〉 〈főnév〉t 〈igei rész〉 ⇒ … a nagy fehér kutya reggel meleg húst 〈igei rész〉 ⇒ a nagy fehér kutya reggel meleg húst eszik
Ez normális magyar mondat, de persze sok – a mi szintaktikánk szerint helyes – „normális magyarul” mégis szintaktikailag hibás mondatot is le tudunk így vezetni „az fehér egér hideg sajtt eszik” „az kis fekete macska meleg tejt iszik”
Hasonlóan levezethető több, „normális magyarul” szemantikailag is támadható mondat „a fehér tej macskat iszik”
És persze léteznek „minimagyarul” is szintaktikailag helytelen (levezethetetlen) mondatok „hús kutya reggel fekete eszik víz az”
24
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat Példa: Egy programozási nyelv szintaxisának megadása Szándékosan egyszerű programozási nyelvet választunk (PÉLDA) Kezdőszimbólum: 〈program〉
Szabályok 〈program〉 → 〈ut. lista〉. 〈ut. lista〉 → 〈ut.〉 | 〈ut.〉; 〈ut. lista〉 〈ut.〉 → 〈ért. adó〉 | 〈if ut.〉 | 〈while ut.〉 | 〈blokk〉 〈ért. adó〉 → 〈vált〉 := 〈kif.〉 〈if ut.〉 → if 〈reláció〉 then 〈ut.〉 else 〈ut.〉 〈while ut.〉 → while 〈reláció〉 do 〈ut.〉 〈blokk〉 → begin 〈ut. lista〉 end 〈reláció〉 → 〈kif.〉 〈relációjel〉 〈kif.〉 〈relációjel〉 → < | > | = | ≠ 〈kif.〉 → 〈tag〉 | 〈kif.〉 + 〈tag〉 〈tag〉 → 〈fakt.〉 | 〈 fakt.〉 ∗ 〈fakt.〉 〈fakt.〉 → (〈kif.〉) | 〈vált.〉 | 〈konst.〉 〈vált.〉 → A | B | C 〈konst.〉 → 0 | 1
Egy jelsorozat akkor és csak akkor szintaktikusan helyes PÉLDA nyelvű program, ha levezethető a 〈program〉 nemterminális szimbólumból a fenti szabályok alkalmazásával Feladat: Adjunk meg szintaktikusan helyes és helytelen PÉLDA nyelvű programot! 25
Formális nyelvek
Széchenyi István Egyetem
Szintaktikai vizsgálat Egyszerű programok esetében (viszonylag) könnyű eldönteni, hogy szintaktikusan helyesek-e [A szintaktikusan helyesnek bizonyult kódokat utána még természetesen szemantikusan is elemezni kell! (Ezzel egyelőre nem foglalkozunk.) Időnként beépítenek bizonyos szemantikai ellenőrzést a szintaktikába, pl. szám és – szám típusú – szöveg összeadása, Excelben megengedett, C-ben/Java-ban nem Beadható feladat: Készítsünk szintaktikailag helyes, de szemantikailag helytelen kódot Cben, Java-ban Ugyanakkor még a szemantikai helyesség sem garantálja feltétlenül az értelmes/céljainknak megfelelő működést]
Probléma hosszú programoknál
A levezetés során sok konfliktus adódik (több lehetőség a helyettesítésre, melyik a jó/melyiket válasszuk?) Intuitív módon: Az a cél, hogy közelebb kerüljünk a kívánt végeredményhez Algoritmikusan: Valami módon sorba rakjuk a szabályokat, ebben a sorrendben alkalmazzuk őket a helyettesítésnél Lehet, hogy rossz szabályt választottunk! (Backtrack technikákat is be kell vetni, ez viszont magával vonja a rekurzív működést és az exponenciális típusú kimenetelt…)
Mennyi sikertelen levezetési kísérlet után lehet kimondani, hogy a program szintaktikusan helytelen?
Ezekre a (nehéz) kérdésekre választ adnak az elemzési algoritmusok A jó elemzési algoritmus legfeljebb az input hosszának konstansszorosa számú lépést hajt végre, és utána megadja a választ Ez persze nehezen biztosítható…
26
Formális nyelvek
Széchenyi István Egyetem
Ajánlott irodalom Fülöp Zoltán: Formális nyelvek és szintaktikus elemzésük, Polygon, Szeged, 2001 Dömösi Pál és társai: Formális nyelvek és automaták, Elektronikus jegyzet, 2011 Bach Iván: Formális nyelvek, Typotex kiadó, Budapest, 2002 Katona Gyula, Recski András, Szabó Csaba: A számítástudomány alapjai, Typotex Kiadó, Budapest, 2003
27