• Nem Talált Eredményt

A levezetési fa

In document Formális nyelvek (Pldal 79-86)

3. Környezetfüggetlen nyelvek

3.1. A levezetési fa

Megjegyzem, hogy pontosan a fenti mintára be lehetne vezetni a −, / és ↑ operátorokat a kivonás, osztás és hatványozás műveletére, de nem okozna számottevő nehézséget a + és − monadikus operátorok, előjelek bevezetése sem.

Természetesen egy igazi számítástechnikai nyelv aritmetikai kifejezéseket generáló CF nyelvtana tartalmazza mindezeket. Mondanivalónk demonstrálására azonban elegendő, ha a nyelv összesen két különböző precedenciájú operátort tartalmaz, és lehetőség van a precedencia zárójelezés útján való megtörésére.

Éppen ezért részben az áttekinthetőség növelése érdekében, részben papírtakaré-kossági okokból megelégszünk a (3.2.) nyelvtannal.

A nyelvnek nyilvánvalóan eleme az a+a∗a jelsorozat. Ezt az alábbi levezetés igazolja:

E ⇒ E+T ⇒ T+T ⇒ F+T ⇒ a+T ⇒ a+T∗F ⇒ a+F∗F ⇒ a+a∗F ⇒ a+a∗a Ez tehát a mondat levezetése. Pontosabban egy levezetése, hiszen a mon-datot másképpen is le lehet vezetni. Demonstráljuk ezt ennek a mondatnak egy másik levezetésével.

E ⇒ E+T ⇒ E+T∗F ⇒ E+T∗a ⇒ E+F∗a ⇒ E+a∗a ⇒ T+a∗a ⇒F+a∗a ⇒ a+a∗a Amennyiben egy mondatszerű formában egynél több nemterminális szim-bólum van, akkor szükségszerűen egynél több levezetés létezik, hiszen a következő mondatszerű formát különböző nemterminálisokat helyettesítve kaphatjuk meg.

Rögtön felmerül a kérdés, okoz-e zavart, és ha igen mikor az a tény, hogy egy mondatnak egynél több levezetése van. Erre a választ a levezetési fák bevezetése adja meg.

Ábrázoljuk a levezetést egy rendezett, irányított fával. A rendezettség itt annyit jelent, hogy az egy csomópontból kiinduló élek sorrendje kötött, és nem változtatható meg. Így például a 3.1. ábrán feltüntetett két gráf nem egyenértékű.

c b

a a c b

3.1. ábra

Mint említettük a levezetési gráf fa lesz, innen a levezetési fa elnevezés. A fa csomópontjainak a nemterminális, leveleinek pedig a terminális szimbólumok felelnek meg. A fa gyökere, – irányított gráfról van szó, – a mondatszimbólum.

Minden csomópontból annyi él és abban a sorrendben fut ki, amennyi a szabály jobboldalán található szimbólumok száma és a kifutó élek végén sorban a jobboldal megfelelő szimbólumai helyezkednek el.

Minden levezetésnek egy és csakis egy levezetési fa felel meg, ugyanak-kor egy levezetési fához egynél több levezetés is tartozhat.

Vegyük például nyelvtanunkat és mondatunkat. A 3.2. ábra tünteti fel a levezetési fát, amely mindkét levezetésre azonos.

+

a a

*

a

E

E T

T T

F F

F

3.2. ábra

A levezetési fában az egyes csomópontokhoz tartozó részfákat szintaktikai egységeknek nevezzük. Minden levél, minden terminális szimbólum önmagában szintaktikai egységet alkot.

Azokat a levezetéseket, amelyek levezetési fája azonos, tehát ahol a jel-sorozat felbontása szintaktikai egységekre megegyező, nem tekintjük lényegesen különböző levezetéseknek.

Vegyük észre, hogy a fenti nyelvtan ismeri az operátorok precedenciáját.

Előbb kell ugyanis a szorzást elvégezni, az alkot egy szintaktikai egységet, és a szorzatot kell az első terminális szimbólumhoz hozzáadni, pontosan úgy, ahogy azt az iskolai tanulmányainkban tanultuk.

Azonos precedenciájú operátorok esetében a nyelvtan az úgynevezett balról-jobbra szabályt alkalmazza. Ez annyit jelent, hogy két azonos preceden-ciájú, tehát adott esetben két + vagy két * operátor esetében először mindig a baloldali operátorral meghatározott műveletet „hajtja végre”.

Fentiekből következik, hogy amennyiben az aritmetikai kifejezéseket a (3.2.) nyelvtannal illetve annak kibővített változatával generáljuk, akkor a

szintaktikai egységek minden külön beavatkozás nélkül követik a precedenciákat, és a balról-jobbra szabályt.

Az olyan nyelvtanokat, ahol minden mondathoz egy és csakis egy levezetési fa tartozik, egyértelmű nyelvtanoknak mondjuk. Természetesen ez nem zárja ki, hogy egy mondatnak több levezetése legyen, ezek azonban nem lehetnek lényegesen különbözőek.

Egyértelmű nyelvtanok esetében, minthogy a levezetési fa unikális, a szintaktikai felbontás egyértelmű.

A (3.2.) nyelvtan egyértelmű nyelvtan. Mint említettük, és mint a példa is mutatja, egy mondatnak egyértelmű nyelvtanok esetében is lehet több levezetése.

A levezetések között vannak nevezetesek. Amikor a levezetés során mindig a mondatszerű forma legbaloldalibb nemterminális szimbólumát helyette-sítjük, baloldali levezetésről beszélünk. Ugyanígy a jobboldali levezetés esetében mindig a mondatszerű forma legjobboldalibb nemterminális szimbólumát bontjuk fel a következő lépésben.

A példánkban éppen a baloldali és jobboldali levezetéseket demonstráltuk.

Egyszerűsítsük most kissé nyelvtanunkat:

E → E+E  E∗E  (E)  a (3.3.) Ez a nyelvtan ugyanazt a nyelvet generálja, mint a (3.2.) szabályokkal megadott nyelvtan. Így a példaként megadott mondatot ezzel a nyelvtannal is lehet generálni:

E ⇒ E+E ⇒ E+E∗E ⇒ a+E∗E ⇒ a+a∗E ⇒ a+a∗a Próbálkozzunk most, mint előbb, egy másik levezetéssel:

E ⇒ E∗E ⇒ E∗a ⇒ E+E∗a ⇒ E+a∗a ⇒ a+aa

A 3.3. ábrán megrajzoltuk a két levezetés levezetési fáit. Mind a két fát, ugyanis itt a fák nem azonosak, a két levezetés lényegesen különbözik.

+

a

a a

* E

E E

E E

+

a

E

E E

* E

a

E

a

3.3. ábra

Amennyiben csak a tartalmazás problémájára szorítkozunk, vagyis csak azt vizsgáljuk, generálható-e valamely jelsorozat egy adott nyelvtannal, akkor a (3.2.) és (3.3.) nyelvtanok egyenértékűek.

Lényegében ez a matematikai nyelvészet megközelítése. A számítástech-nikai nyelvészeté szükségképpen más.

A számítástechnikai nyelvészet szempontjából messzemenően nem közömbös, milyen szintaktikai egységeken keresztül jutottunk el a levezetés során a mondathoz. Példánkra gondolva létkérdés tudnunk, melyik műveletet kell előbb elvégeznünk, az összeadást vagy a szorzást.

Éppen ezért a számítástechnika szempontjából a nem egyértelmű nyelvtanok használhatatlanok. Az eddigi tapasztalatokat összegezve egy sereg a számítástechnika szempontjából nézve alapvetőnek tekinthető kérdés vetődik fel.

Az egy- illetve többértelműséget nyelvtanhoz és nem nyelvhez kap-csoltuk. Példánkban ez nyilván helyes volt, hiszen ugyanannak a nyelvnek egy egyértelmű és egy többértelmű nyelvtanáról volt szó.

Vajon mindig ez a helyzet, vagy lehet-e a többértelműség nyelvi tulaj-donság is? Ki lehet-e mutatni, hogy egy nyelvtan egyértelmű-e, és ha nem, meg lehet-e állapítani, hogy létezik-e a nyelvnek egyértelmű nyelvtana.

Az első kérdésre a válasz megadható.

Léteznek olyan nyelvek, amelyről bizonyítható, hogy nem lehet egyértel-mű nyelvtannal generálni. Ez esetben tehát a többértelműség nyelvi tulajdonság.

Más szóval nincsen minden környezetfüggetlen nyelvnek egyértelmű nyelvtana.

Ugyanakkor példánkra gondolva, ahol a többértelműség nyelvtanhoz volt kötve, rögzíthető, hogy a többértelműség egyszer nyelvhez másszor nyelvtanhoz kapcsolható tulajdonság.

Lássunk példát nem egyértelmű nyelvre.

S → aAbX  YbCc A → aAb  ab C → bCc  bc X → cX  c Y → aY  a

Ez a nyelvtan az

L = aibicj ∪ ajbici nyelvet generálja.

Az triviális, hogy az adott nyelvtan az aibici alakú mondatot két lényegesen különböző levezetéssel állíthatja elő. Ezen túlmenően igazolható, hogy nincsen olyan egyértelmű környezetfüggetlen nyelvtan, amely a szóban forgó nyelvet generálná. Itt tehát a többértelműség nyelvhez kapcsolható tulajdonság.

A második kérdéscsoportra a válasz negatív. Sajnos nincs olyan módszer, amelynek segítségével általánosan, minden esetben alkalmazhatóan meg lehetne állapítani egy nyelv vagy egy nyelvtan egyértelmű voltát. Ez is az algoritmikusan eldönthetetlen problémák sorába tartozik.

Mint említettük, az a tény, hogy egy kérdés algoritmikusan eldönthetetlen, vagyis a probléma megoldására nincs általános módszer, nem jelenti azt, hogy egyes konkrét, ebbe a feladatosztályba tartozó feladatra ne lehetne adott esetben választ adni. Persze nem minden egyedi feladatra, hiszen akkor a probléma algorit-mikusan eldönthető lenne.

Példaképpen igazoljuk, hogy a (3.2.) nyelvtan egyértelmű.

A mondatot alkotó jelsorozatot szintaktikai egységekre osztjuk, majd ezeket újabb, kisebb egységekre mindaddig, amíg a szintaktikai egységek egyetlen terminális szimbólumból nem állanak. Be kell látnunk, hogy ez a felosztás egyértelmű.

Induláskor a teljes jelsorozatot tekintjük szintaktikai egységnek, amelyet az E mondatszimbólumnak le kell generálnia. Két lehetőségünk van, vagy az

E → E+T vagy az E → T

szabályt alkalmazhatjuk. Amennyiben a jelsorozat tartalmaz zárójelen kívüli additív operátort, + szimbólumot nyilván az első szabályt kell alkalmaznunk.

Ellenkező esetben ugyanis a T nemterminális szimbólumot kapnánk, amely nem tud + operátort tartalmazó jelsorozatot generálni.

Ha a jelsorozat nem tartalmaz + operátort akkor viszont a második szabály a helyes, hiszen az elsőt alkalmazva nem tudnánk mit kezdeni a generált + terminálissal.

Tételezzük fel, hogy az első szabály kellett felhasználnunk. Ilyenkor a szabály + terminális szimbólumát megfeleltetjük a jelsorozat egyik + operátorának, az operátor előtti jelsorozat alkot egy szintaktikus egységet, amelyet a szabály E nemterminálisa generál majd, az operátort követő rész másik szintaktikus egység lesz, amelyet viszont a szabály T nemterminális szimbóluma állít elő. Ezt vázolja a 3.4. ábra.

~~~~~~

+

~~~~~~

+

~~~

+

~~~~~~~~~~

E

E T

3.4. ábra

Amennyiben jelsorozatban több zárójelen kívüli + operátor található szükségszerű, hogy a szabály + szimbólumát az utolsó + operátorral azonosítsuk, hiszen ellenkező esetben a megfeleltetett + operátortól jobbra is maradna még + operátor, amit viszont a T nemterminális nem képes generálni. Így tehát csak egyetlen megfeleltetési lehetőségünk van a jelsorozat levezetésében.

A baloldali szintaktikus egység felbontásánál, amelyet az E nemterminális generál, és amely tartalmazhat + operátorokat, az előbbi gondolatmenet rekurzív alkalmazásával érünk célt. Végül sikerül a jelsorozatot olyan szintaktikus egysé-gekre bontani, amelyek már nem tartalmaznak zárójelen kívüli additív operátort, és amelyeket a T nemterminális szimbólumok generálnak.

Itt a multiplikatív operátorok játszzák ugyanazt a szerepet, amelyet az előbb az additívak játszottak. Ha van zárójelen kívüli * operátor, akkor a T → T *F szabályt kell alkalmaznunk, mégpedig úgy, hogy a szabály * terminá-lisát a szintaktikus egység utolsó * operátorának feleltetjük meg. Ellenkező esetben a T → F szabály kerül sorra.

Ezután csak olyan szintaktikus egységek maradnak, amelyek vagy záró-jeles kifejezések, vagy egyedül az a terminális szimbólumból állanak. Az előbbi esetben az F → (E) szabály után a zárójelen belüli kifejezésre alkalmazzuk a fenti algoritmust, az utóbbiban az F → a szabállyal befejezzük az elemzést.

A fentiekből kitűnik, hogy a (3.2.) nyelvtan alapján minden mondatot egyértelműen lehet csak felbontani, így csak egy levezetési fa tartozik hozzá, a nyelvtan egyértelmű.

A másik (3.3.) nyelvtan esetében találtunk olyan mondatot, és a mondathoz két különböző levezetést, amelyhez két különböző levezetési fa tartozik. Ezzel a nyelvtan többértelműségét demonstráltuk.

Sajnos a gyakorlatban nem mindig sikerül vagy a nyelvtan egyedi tulajdonságait, vagy egy szerencsés ötletet felhasználva a nyelvtan egy- vagy többértelműségét bizonyítanunk. Ilyenkor a kérdés megválaszolatlan marad.

Tekintsünk most egy pillanatra vissza, és vizsgáljuk meg, vajon felmerül-e egyáltalában az egyértelműség többértelműség kérdése reguláris nyelveknél!

A levezetési fát természetesen reguláris nyelveknél is megrajzolhatjuk. Itt ez a fa nagyon egyszerű lesz. Csupán egy szárból áll, amelynek jobb- vagy balolda-lán vannak levelei attól függően, hogy bal- vagy jobbreguláris nyelvtanról van szó.

Egy levezetési fához itt csak egy levezetés tartozik, ami abból nyilvánvaló, hogy minden mondatszerű formában csak egyetlen nemterminális szimbólum szerepel.

Nemdeterminisztikus nyelvtanok esetében előfordulhat, hogy egy mon-datnak több, szükségszerűen lényegesen eltérő, különböző levezetési fája van.

Korábban igazoltuk, hogy minden reguláris nemdeterminisztikus nyelvtanhoz található egy vele egyenértékű, determinisztikus nyelvtan. Algoritmust is adtunk, amely a nemdeterminisztikus véges automata alapján megszerkeszti ezt a determinisztikus automatát.

Ennek alapján rögzíthetjük, hogy minden reguláris nyelv egyértelmű, és szerkeszthető hozzá egyértelmű nyelvtan.

In document Formális nyelvek (Pldal 79-86)