Oddiy LR tahlilchisi - Simple LR parser

Yilda Kompyuter fanlari, a Oddiy LR yoki SLR tahlilchisi ning bir turi LR tahlilchisi kichik bilan jadvallarni tahlil qilish va nisbatan oddiy tahlil qiluvchi generator algoritmi. Boshqa LR (1) analizatorida bo'lgani kabi, SLR tahlilchisi ham bitta to'g'ri topishda juda samarali pastdan yuqoriga qarab tahlil qilish taxminiy va orqaga qaytmasdan, kirish oqimi bo'ylab bitta chapdan o'ngga skanerlashda. Tahlilchi mexanik ravishda til uchun rasmiy grammatikadan hosil bo'ladi.

SLR va umumiy usullar LALR tahlilchisi va Kanonik LR tahlilchisi tahlil paytida bir xil usullarga va shunga o'xshash jadvallarga ega bo'lish; ular faqat ajratuvchi generator vositasi tomonidan ishlatiladigan matematik grammatik tahlil algoritmlarida farqlanadi. SLR va LALR generatorlari bir xil o'lchamdagi jadvallarni va bir xil ajralish holatlarini yaratadilar. SLR generatorlari LALR generatorlariga qaraganda kamroq grammatikalarni qabul qiladi yakk va Bizon. Ko'pgina kompyuter tillari SLR cheklovlariga mos kelmaydi. Tilning tabiiy grammatikasini bukish SLR grammatikasi shakl ko'proq kelishuvlarni va grammatik xakerlikni talab qiladi. Shunday qilib, LALR generatorlari ancha murakkab vositalar bo'lishiga qaramay, SLR generatorlariga qaraganda ancha keng qo'llanila boshlandi. SLR usullari kollej darslarida kompilyator nazariyasi bo'yicha foydali o'quv bosqichi bo'lib qolmoqda.

SLR va LALR ikkalasi tomonidan ishlab chiqilgan Frank DeRemer ning birinchi amaliy ishlatilishi sifatida Donald Knuth LR tahlil qiluvchi nazariyasi.[iqtibos kerak ] Haqiqiy grammatikalar uchun to'liq LR usullari bilan yaratilgan jadvallar amaliy jihatdan juda katta, o'sha o'n yillikdagi kompyuter xotiralarining ko'pchiligidan kattaroq edi, SLR va LALR usullariga qaraganda 100 marta yoki undan ko'p ajralish holatlari mavjud edi.[iqtibos kerak ].

Lookahead to'plamlari

SLR va LALR o'rtasidagi farqlarni tushunish uchun ularning ko'p o'xshashliklarini va ikkalasi ham smenani qisqartirish bo'yicha qarorlar qabul qilishini tushunish muhimdir. (Maqolaga qarang LR tahlilchisi Endi bu fon uchun, qisqartirish bo'limiga qadar ' bosh to'plamlari.)

SLR va LALR o'rtasidagi farq shundaki, ularning generatorlari ba'zi tugallangandan keyin paydo bo'lishi kerak bo'lgan kirish belgilarining to'plamlarini qanday hisoblashadi? ishlab chiqarish qoidasi topilgan va kamaytirilgan.

SLR generatorlari ushbu ko'rinishni to'g'ridan-to'g'ri grammatikaga asoslangan holda osonlikcha taxminiy usul bilan hisoblab chiqadilar va alohida tahlil qiluvchi holatlar va o'tishlarning tafsilotlariga e'tibor bermaydilar. Bu mavjud tahlil qiluvchi holatning o'ziga xos kontekstiga e'tibor bermaydi. Agar ba'zi bir noaniq belgi bo'lsa S grammatikada bir nechta joylarda qo'llaniladi, SLR bu joylarga alohida ishlov berish o'rniga bir xilda muomala qiladi. SLR generatori ishlaydi Izlash (S), ba'zi bir hodisalarni darhol bajarishi mumkin bo'lgan barcha terminal belgilar to'plami S. Tahlil jadvalida har bir kamayish S LR (1) tashqi ko'rinish to'plami sifatida Follow (S) dan foydalanadi. Bunday quyidagi to'plamlar generatorlar tomonidan LL yuqoridan pastga ajratgichlar uchun ishlatiladi. Quyidagi to'plamlardan foydalanganda hech qanday siljish / kamaytiruvchi yoki kamaytiruvchi / kamaytirmaydigan grammatika an deb nomlanadi SLR grammatikasi.

LALR generatorlari tashqi ko'rinishdagi to'plamlarni tahlil qiluvchi holatlar grafigi va ularning o'tish vaqtlarini o'rganishga asoslangan holda aniqroq usul bilan hisoblashadi. Ushbu usul mavjud parser holatining o'ziga xos kontekstini ko'rib chiqadi. Ba'zi bir non-terminali S.ning har bir grammatikasi bilan ishlashini moslashtiradi. Maqolaga qarang LALR tahlilchisi ushbu hisob-kitobning tafsilotlari uchun. LALR generatorlari tomonidan hisoblangan tashqi ko'rinish to'plamlari SLR generatorlari tomonidan hisoblangan taxminiy to'plamlarning bir qismidir (va shuning uchun yaxshiroq). Agar grammatika SLR quyidagi to'plamlardan foydalanganda jadval ziddiyatlariga ega bo'lsa, lekin LALR keyingi to'plamlardan foydalanganda ziddiyatli bo'lsa, u LALR grammatikasi deb ataladi.

Misol

SLR tahlilchisi tomonidan tahlil qilinishi mumkin bo'lgan, lekin LR (0) tahlilchisi tomonidan tahlil qilinmaydigan grammatika quyidagicha:

(0) S → E
(1) E → 1 E
(2) E → 1

LR (0) ajraluvchilar uchun bajarilganidek, harakat va goto jadvalini qurish quyidagi element to'plamlari va jadvallarni beradi:

Mahsulot to'plami 0
S → • E
+ E → • 1 E
+ E → • 1
1-to'plam
E → 1 • E
E → 1 •
+ E → • 1 E
+ E → • 1
2-band
S → E •
3-to'plam
E → 1 E •

Harakatlar va jadvallar:

harakatbordi
davlat1$E
0s12
1s1 / r2r23
2acc
3r1r1

Ko'rinib turibdiki, 1-holat va '1' terminali uchun smenani qisqartirish mojarosi mavjud. Buning sababi shundaki, LR (0) ajraluvchisi uchun harakatlar jadvali yaratilganda, har bir satr bo'yicha qisqartirish amallari kiritiladi. Biroq, amal qilish to'plamidan foydalanib, kamaytirish harakatlarini yanada nozik tanelilik bilan qo'shish mumkin. Ushbu grammatika uchun quyidagi to'plam:

belgiSE1
quyidagi$$1,$

Kamaytirish faqat ma'lum bir harakat ustuniga qo'shilishi kerak, agar bu harakat ushbu kamayish bilan bog'liq quyidagi to'plamda bo'lsa. Ushbu algoritm qisqartirish amalini harakat ustuniga qo'shilishi kerakligini tavsiflaydi:

mustBeAdded funktsiyasi (reducAction, action) {ruleNumber = багасгахAction.value; ruleSymbol = qoidalar [ruleNumber] .leftHandSide; Qaytish (followSet-dagi harakat (ruleSymbol))}

masalan, mustBeAdded (r2, "1") noto'g'ri, chunki 2-qoidaning chap tomoni "E", 1 esa E-ning keyingi to'plamida emas. mustBeAdded (r2, "$") to'g'ri, chunki "$" E-ning keyingi to'plamida.

Harakatlar jadvalidagi har bir qisqartirish harakatlarida mustBeAdded-dan foydalanib, natija nizosiz harakatlar jadvaliga ega:

harakatbordi
davlat1$E
0s12
1s1r23
2acc
3r1

Shuningdek qarang