A feladat: (a) Mutasd meg, hogy az , nyelvtan nem LR(0) elemezhető! (b) Készíts a fenti nyelvtanhoz LR(1) elemzőt! (c) Elemezd az előbb kapott LR(1) elemzővel a bab szót! A megoldás: (a) Próbáljunk meg LR(0) elemzőt csinálni és majd látjuk, hogy nem lehet. Így derül ki, hogy a nyelvtan nem LR(0) elemezhető.
Az első táblába, a T0-ba bekerül mindenképpen az . Aztán emiatt, amikor a lezárást csináljuk, bekerül a 2. és 3. szabály. Az utolsó kettő szabály pedig a 3 szabály miatt kerül be. Ebben a táblában még nincs konfliktus, a szabályok alapján az egyetlen tennivaló a shiftelés. A második táblába alapítóként bekerül az első két szabály. Az utolsó kettő a 2. szabályból jön, az A kifejtésével. Ebben a halmazban már konfliktus van: az miatt Accept lenne, de az és az miatt meg shift. Tehát nem megy az LR(0) elemzés, tovább nem is érdemes csinálni a halmazokat. (b) Az LR(1) elemző:
Magyarázat a halmazok kiszámításához: T0: kerül bele először, a követő nyelv azért lesz , mert amikor eszeint a szabály szerint akarunk letörni, azaz amikor a pont már a jobboldal után áll majd, vagyis S lesz csak a veremben, akkor az inputon nem lesz már semmi. Ezen elem lezárásaként bevesszük a következő két elemet, mindkettő követőnyelve az , mert ezekben a jobboldalakat majd egy olyan S-sé törjük majd le, amelyik az 1. szabályban szerepel, de amikor az az S a veremben lesz, akkor az input már üres. A 2. szabályban is áll azonban S a pont mögött, így újra bevesszük az és szabályokat, de a követő nyelv ekkor már az lesz. Azért, mert ezekben a szabályokkal azt a helyzetet írjuk le, amikor majd a jobboldalakat egy olyan S-sé törjük le, amilyen a 2. szabályban van, vagyis egy olyanná, ami mögött A áll. A letöréskor az inputon az ezen A-ból keletkező első terminálist látjuk majd, ami a vagy b. A 3. szabály miatt bevesszük a 6. és 7. szabályokat, a követő nyelv azért az mert a jobboldalakat olyan A-vá törjük majd le, amilyen a 3. szabályban van, az meg olyan, hogy amikor már ő kerül a verem tetejére, akkor az inputon látszik. A 4. szabály miatt újra a 4. és az 5. szabályt kéne bevennünk, de mégegyszer nem tesszük ezt, mivel ha egy olyan elem jönne, ami mindenben (szabály és követő nyelv is) megegyezik egy korábbival, akkor azt nem vesszük be újra.
Az 5. szabály miatt a 8. és 9. szabályokat vesszük be, a követő nyelv
azért az, ami, mert ezen elemek jelentése az, hogy a jobboldalakat
majd egy olyan A-vá törjük le, (5. szabály) amiről tudjuk, hogy
megjelenésekor az inputon a vagy b jön.
Magyarázat a táblához: Ugrórész: A halmazoknál talált átmenetet kódoljuk bele: ha például T0S=T1, akkor a T0 sorában az S-es oszlopba T1-t írunk. Action: 1. Ha van kezdetű elem egy halmazban (pl. T1), akkor azon előretekintésnek megfelelő oszlopba, ami ehhez az elemhez tartozik (most ) A-t írunk, azaz Accept. 2. Ha van olyan nem -s szabály, ami éppen befejeződött, azaz van kezdetű elem egy halmazban (pl. T2), akkor a szabálynak a számát (amit az elején kiosztottunk neki) beírjuk az összes olyan oszlopba, aminek megfelelő előretekintés az adott elemhez tartozik a halmazban (T2-nél ez a szabály az , a szám a 2, az előretekintés pedig vagy a vagy b). 3. Ha van olyan szabály valami halmazban, ahol terminális áll a pont mögött, akkor shiftelünk azokra az előretekintésekre, amilyen terminális a pont mögött áll. Például T1-ben van a meg b a pont után, ezért ezen két előretekintésre shift lesz. Vigyázat! LR(1)-nél shifteléskor az elemben felírt követő nyelv semmi szerepet nem játszik. (c) Az elemzés (elöl a veremtartalom, a veremtető a jobboldalon, aztán az input, aztán az output): Accept. Magyarázat az elemzés egy pontjához: A 4. sor után azért nem Accept van, hanem shift, mert az előretekintés nem , hanem a.
|