A feladat: (a) Készíts LR(0) elemzőt az , , nyelvtanhoz! (b) Elemezd az előbb kapott elemzővel az aabb szót!
Először nézzük, hogy a halmazok hogyan jönnek ki:
Magyarázat a halmazokhoz: T0: Az belekerül mindenképpen. Mivel ebben S áll a pont mögött, a lezáráskor beletesszük a 2. szabályt is. T0-ból úgy lépünk tovább, hogy megnézzük, hogy milyen szimbólumok állnak a pont mögött T0-beli szabályban (most ez a és S) és képezzük a T0 + adott szimbólum alakú újabb halmazokat, ez most T0S=T1 és T0a=T2. Ezen halmazok elemeit majd később kiszámoljuk. T1: Mivel T1=T0S, az alapító (és egyben egyetlen) elemet úgy kapjuk, hogy a T0-beli 1. szabályban átemeljük a pontot az S-en. T2: Mivel ez a halmaz T0-ból jön a-val, az alapító eleme az 1. elem lesz. Ebből lezárással jön a 2. és a 3., végül mind a 2. mind a 3. szabályból jöhet lezárással a szabály (de persze csak egyszer írjuk ki), ami a -nak felel meg, de az -t nem írjuk, csak a -t. T1-ből nem tudunk újabb halmazt származtatni, mert nincs benne olyan szabály, ahol pont után bármi lenne. T2-ből jön a T3 (P-vel) és a T4 (Q-val). T3: Csak egy elem van, az alpító elem, amit T2-ből kapunk. T4: Alapítóként bekerül az első két szabály, aztán a 2. miatt még a 3. is. T5=T4b és T6=T4S: Csak egy-egy elemük van, az egy-egy alapító elem, melyeket T4-ből kapunk. T4a=T2: Mert ugyanazok a szabályok jelennek meg, mint T2-ben. Az elemzőtábla:
Magyarázat az elemzőtáblához: Az ugrórészt aszerint töltjük ki, hogy hogyan származnak egymásból a Ti halmazok. Például, mivel T0a=T2, ezért a T0-s sorba az a-s oszlopba azt írjuk, hogy T2. Az action rész: Ha van elem egy halmzaban (ilyen a T1, akkor A). Ha van valami más befejeződő szabály (mint például T2-ben a ), akkor a szabály száma (ami itt most a 4). Ha van pont után terminális valahol, akkor meg S(hift). (Például T0-ban a 2. szabályban.) Ha ütközés lenne valahol (két különböző dolgot akarnánk ugyanoda suvasztani, akkor nem LR(0) elemezhető a nyelvtan, de most itt ilyen nincsen). (b) Az elemzés: Accept. Pici magyarázat az elemzéshez: Mindig aszerint cselekszünk, hogy milyen T van a verem tetején (azaz a verem milyen állapotban van). Ha Ti van a verem tetején, akkor a Ti-nek megfelelő sor action része játszik. Ha ez S(hift) (pl. 1. sor, ahol a T0-ban shiftelni kell), akkor berakjuk a következő szimbólumot az inputról a verembe, és az ugrótábla alapján kiszámítjuk az új veremállapotot (T0-hoz és a-hoz T2 az új állapot). Ha az action egy letörés (mint például a 6. sorban, a T5 állapotban), akkor megkeressük a verem tetején a T-k között annak a szabálynak a jobboldalát ami szerint le akarunk törni (ez most a 2. szabály jobboldala, vagyis aP), ezt kivesszük a veremből és visszaírjuk a szabály baloldalát (ez most az S). Ezután kiszámítjuk, hogy mi lesz az új állapot. Úgy tesszük ezt, hogy megnézzük, hogy milyen állapotba került a verem, amikor kivettük a jobboldalt (ez most T4) és megnézzük, hogy a baloldal hatására (S) mi lesz az új állapot (az ugrótábla mutatja, hogy T6). Ha Accept a tennivaló, akkor befejezzük az elemzést és megállunk. Még egy nehezebb pont: amikor a 4. szabály szerint törünk le (pl. 2. sor), akkor a semmit, ami most a szabály jobboldala a verem legtetején keressük, és helyettesítjük Q-val, a szabály baloldalával. Ez tehát olyan, mintha csak beraknánk egy Q-t a verem tetejére.
|