Formális nyelvek és fordítóprogramok http://www.ms.sapientia.ro/~kasa/formalis.htm Könyvészet 1. Csörnyei Zoltán, Kása Zoltán, Formális nyelvek és fordítóprogramok, Kolozsvári Egyetemi Kiadó, 2007. 2. Csörnyei Zoltán, Fordítóprogramok, Typotex Kiadó, Budapest, 2006. 3. Csörnyei Zoltán, Fordítási algoritmusok, Erdélyi Tankönyvtanács, Kolozsvár, 2000. 4. Demetrovics János, Denev, J., Pavlov, R., A számítástudomány matematikai alapjai, Nemzeti Tankönyvkiadó, Budapest, 1999. 5. Fülöp Zoltán, Formális nyelvek és szintaktikus elemzésük, Polygon, Szeged, 1999. 6. Livovschi, L., Popovici, C. P., eorgescu, H., Țăndăreanu, N., Bazele informaticii, Editura Didactica şi Pedagogică, Bucureşti, 1981. 7. Manna, Z., Programozáselmélet, Műszaki Könyvkiadó, Budapest, 1981. 8. Révész yörgy, Bevezetés a formális nyelvek elméletébe, Akadémiai Kiadó, Budapest, 1979. 9. Bach Iván, Formális nyelvek, Typotex, Budapest, 2005. http://mek.oszk.hu/05000/05099/ 1
Alapfogalmak ábécé: szimbólumok (jelek) egy nem üres, véges halmaza Például Σ = {a, b, c, d, 0, 1} ábécé betűi: a, b, c, d, 0, 1. a 1 a 2... a n szó, a 1, a 2,..., a n Σ, n 0, n 0 a szó hossza Ha w = a 1 a 2... a n, akkor w = n. n = 0, üres szó: ε (vagy λ) Σ = {a 1 a 2... a n n 0, a 1, a 2,..., a n Σ} Σ + = Σ \ {ε}, Σ n Σ = Σ 0 Σ 1... Σ n... és Σ + = Σ 1 Σ 2... Σ n... Ha u = a 1 a 2... a m és v = b 1 b 2... b n, akkor u = v, ha m = n, és a i = b i, i = 1, 2,..., n. Σ -ban: konkatenáció (illesztés, szorzat, összefűzés) u = a 1 a 2... a m, v = b 1 b 2... b n : = uv = a 1 a 2... a m b 1 b 2... b n uv = u + v asszociatív, nem kommutatív, van egységeleme = Σ monoid (egységelemes félcsoport) szavak hatványozása: Ha u Σ akkor u 0 = ε u n = u n 1 u, n 1 u = a 1 a 2... a n szó tükörképe u 1 = a n a n 1... a 1 (jelölések: u R, ũ) ( u 1 ) 1 = u és (uv) 1 = v 1 u 1. 2
v részszava u-nak, ha p, q szavak úgy, hogy u = pvq. Ha pq ε, akkor v valódi részszava u-nak. p az u kezdőszelete (prefixuma), q pedig végszelete (szufixuma) L Σ : Σ feletti nyelv (formális nyelv) üres nyelv, {ε} az üres szóból álló nyelv Műveletek nyelvekkel L, L 1, L 2 egy-egy Σ feletti nyelv egyesítés: L 1 L 2 = {u Σ u L 1 vagy u L 2 } metszet: L 1 L 2 = {u Σ u L 1 és u L 2 } különbség: L 1 \ L 2 = {u Σ u L 1 és u L 2 } komplementum (v. komplementer nyelv): L = Σ \L (szokásos jelölése még L ) szorzat: L 1 L 2 = {uv u L 1, v L 2 } nyelv hatványa: L 0 = {ε}, L n = L n 1 L, n 1 nyelv iteráltja: L = i=0 Li = L 0 L L 2... L i... L + = L \ {ε}, L + = L i. i=1 tükrözés: L 1 = {u 1 u L} ( L 1 ) 1 = L, ( L 1 ) n = (L n ) 1 reguláris műveletek: egyesítés, szorzás, iteráció 3
Nyelvek megadása Nyelvek megadása elemeik felsorolásával Nyelvek például: L 1 = {ε, 0, 1}, L 2 = {a, aa, aaa, ab, ba, aba}, L 3 = {ε, ab, aabb, aaabbb, aaaabbbb...} Nyelvek megadása tulajdonság segítségével L 4 = {a n b n n = 0, 1, 2,...} (tehát L 4 = L 3 ) L 5 = {uu 1 u Σ }, L 6 = {u {a, b} n a (u) = n b (u)}, ahol n a (u) az u szóban levő a betűk számát jelöli. Nyelvek megadása nyelvtannal generatív nyelvtan vagy nyelvtan (grammatika) eneratív nyelvtan a = (N, T, P, S) rendezett négyes, ahol N, a változók (nemterminális jelek) ábécéje, T, a terminális jelek ábécéje, ahol N T =, P (N T ) N(N T ) (N T ) véges halmaz, vagyis P az (u, v) alakú helyettesítési szabályok vagy produkciók véges halmaza, ahol u, v (N T ), és u tartalmaz legalább egy nemterminális jelet. (u, v) jelölés helyett u v is használható. S N a nyelvtan kezdőszimbóluma. Az u v, azaz (u, v) szabályban: u bal, v pedig jobb oldal. Rövidítés: u v 1, u v 2,..., u v r helyett u v 1 v 2... v r 4
(N T ) halmazban a közvetlen levezetés v. közvetlen deriváció reláció: u = v, ha u = p 1 pp 2, v = p 1 qp 2 és (p, q) P. Más jelek: vagy a =. = helyett lehet = A = reláció reflexív és tranzitív lezártját u = v, ha w 0, w 1,..., w n (N T ), n 0, = jelöli: levezetés vagy deriváció. u = w 0,, w 0 = w 1, w 1 = w 2,..., w n 1 = w n, w n = v vagy w 0 = w 1 = w 2 =... = w n 1 = w n u + = v, ahol n 1 (u = v esetében, ha n = 0, akkor u = v.) A = (N, T, P, S) nyelvtan által generált nyelv: L() = {u T S = u}. Példa. Legyen = (N, T, P, S), ahol N = {S}, T = {a, b}, P = {S ab, S asb}. L() = {a n b n n 1}, mivel vagy S S = asb = a 2 Sb 2 =... = a n 1 Sb n 1 = a n b n, = a n b n. 5
1 és 2 nyelvtanok ekvivalensek: 1 = 2, ha L( 1 ) = L( 2 ). Példa. 1. Adott a következő két nyelvtan, 1 = ({S}, {a, b}, {S asb, S ε}, S) és 2 = ({S}, {a, b}, {S asb, S ab}, S). Ekkor L( 1 ) \ {ε} = L( 2 ). A két nyelvtan nem ekvivalens. 2. A következő két nyelvtan ekvivalens, mivel mindegyik az {a n b n c n n 1} nyelvet generálja. 1 = (N 1, T, P 1, S 1 ), ahol N 1 = {S 1, X, Y }, T = {a, b, c}, P 1 = {S 1 abc, S 1 axbc, Xb bx, Xc Y bcc, by Y b, ay aax, ay aa}. 2 = (N 2, T, P 2, S 2 ), ahol N 2 = {S 2, A, B, C}, P 2 = {S 2 as 2 BC, S 2 abc, CB BC, ab ab, bb bb, bc bc, cc cc}. Tétel. Létezik olyan formális nyelv, amelyet nem lehet nyelvtannal megadni. A bizonyításhoz kódoljuk a nyelvtanokat. Egy adott = (N, T, P, S) nyelvtan esetében legyen N = {S 1, S 2,... S n }, T = {a 1, a 2,... a m } és S = S 1. A kódolás a következô: S i kódja 10 } 11.{{.. 11} 01, a i kódja 100 } 11.{{.. 11} 001 i-szer i-szer A kódolásban a jeleket 000 választja el, a nyíl jele 0000, a szabályokat pedig 00000 jelsorozattal választjuk el. Nyílván, elég csak a szabályokat kódolni. Példaként vegyük a következô nyelvtant: 6
= ({S}, {a, b}, {S asb, S ab}, S). S kódja 10101, a kódja 1001001, b kódja 10011001. A nyelvtan kódja: 10101 } {{ } 0000 } 1001001 {{ } 000 } 10101 {{ } 000 } 10011001 {{ } 00000 } 10101 {{ } 0000 } 1001001 {{ } 000 } 10011001 {{ } Ennek a kódolásnak az alapján a nyelvtanok sorba rendezhetôk, elôször a kód hossza szerint, majd az azonos hosszúságúak esetében ábécésorrendbe: 1, 2,..., k,.... Tekintsük most a T ábécé fölötti nyelvek halmazát: L T = {L L T }. A T halmaz megszámlálhatóan végtelen, hisz szavai sorrendbe írhatók hosszuk szerint, azon belül pedig ábécésorrendbe. Legyen ez a sorrend s 0, s 1, s 2,..., ahol természetesen s 0 = ε. Ekkor minden L T nyelvnek megfeleltethetünk egy b 0, b 1, b 2,... végtelen bináris sorozatot a következôképpen: { 1, ha si L b i = i = 0, 1, 2,... 0, ha s i L Könnyű belátni, hogy az így keletkezett bináris sorozatok halmaza megszámlálhatatlanul végtelen, hisz minden sorozat elképzelhetô úgy, mint egy 1-nél kisebb pozitív valós szám kettes számrendszerbeli ábrázolása (a tizedesvesszôt az elsô számjegy elé képzeljük). Fordítva is igaz, hogy minden 1-nél kisebb pozitív szám kettes számrendszerbeli ábrázolása megfelel egy ilyen sorozatnak, ha a tizedesvesszô utáni részt vesszük. Mivel a (0, 1) intervallum kontinuum számosságú, az lesz a végtelen bináris sorozatok halmaza is. Tehát L T is kontinuum számosságú. Mivel a formális nyelvek halmaza kontinuum számosságú, a nyelvtanok megszámlálhatóan végtelen halmaza és a nyelvek kontinuum számosságú halmaza között nem létezik kölcsönös és egyértelmž megfeleltetés. Tehát, létezik olyan formális nyelv, amelyet nem lehet nyelvtannal megadni. 7
Chomsky-féle nyelvosztályok Ha a helyettesítési szabályokra bizonyos megkötéseket teszünk, a következő négy nyelvtantípust különböztethetjük meg. A = (N, T, P, S) nyelvtan 0-típusú (általános vagy mondatstruktúrájú), ha semmilyen megkötést nem teszünk a helyettesítési szabályaira. 1-típusú (környezetfüggő), ha minden szabálya uxv uwv alakú, ahol X N, u, v (N T ), w (N T ) +. Ezenkívül megengedhető az S ε szabály is, ha S nem szerepel szabály jobb oldalán. 2-típusú (környezetfüggetlen), ha minden szabálya X w alakú, ahol X N, w (N T ) +. Ezenkívül megengedhető az S ε szabály is, ha S nem szerepel szabály jobb oldalán. 3-típusú (reguláris), ha szabályai X ay, X a alakúak, ahol a T és X, Y N. Ezenkívül megengedhető az S ε szabály is, ha S nem szerepel szabály jobb oldalán. Ha i-típusú nyelvtan, akkor az L() nyelvet szintén i-típusúnak (általánosnak, környezetfüggőnek, környezetfüggetlennek, regulárisnak) nevezzük. Egy L nyelv i-típusú (i = 0, 1, 2, 3), ha létezik egy i-típusú nyelvtan, amelyik az L nyelvet generálja, vagyis L = L(). Jelölje L i (i = 0, 1, 2, 3) az i-típusú nyelvek osztályát. Ekkor bizonyítható, hogy L 0 L 1 L 2 L 3. A nyelvtantípusok fenti értelmezése alapján a bennfoglalás ( ) nyilvánvaló, de a szigorú bennfoglalás ( ) bizonyításra szorul. Megjegyezzük, hogy a nyelvtantípusokat néhol kicsit másképpen értelmezik, a 2- és 3-típusoknál megengednek tetszőleges X ε szabályokat is. A regulási nyelvtant úgy is lehet értelmezi, hogy szabályai X uy, X u alakúak, ahol u T. 8
Példák. Környezetfüggő nyelvtan 1 = (N 1, T 1, P 1, S 1 ), ahol N 1 = {S 1, A, B, C}, T 1 = {a, 0, 1} P 1 elemei: S 1 ACA AC AACA ABa AaB B AB A A 0 1 Az L( 1 ) nyelv olyan uav szavakból áll, ahol u, v {0, 1} és u v. Környezetfüggetlen nyelvtan 2 = (N 2, T 2, P 2, K), ahol N 2 = {K, T, F }, T 2 = {+,, (, ), a} P 2 elemei: K K + T T T T F F F (K) a Az L( 2 ) olyan algebrai kifejezésekből áll, amelyek a T 2 halmaz elemeiből képezhetők. Reguláris nyelvtan 3 = (N 3, T 3, P 3, S 3 ), ahol N 3 = {S 3, A, B}, T 3 = {a, b} P 3 elemei: S 3 aa A ab a B ab bb a b Az L( 3 ) nyelv olyan, a és b betűkből képezhető szavakból áll, amelyek legalább két a-val kezdődnek. 9