< terminal bo'lmagan >::=< tushuncha 1 >…< tushuncha n>
Tushuncha terminal
aniqlanishi kerak bo'lmagan quyi darajadagi tushunchalar
noterminal
Masalan :
<формула>::=<выражение> #
<выражение>::=<слагаемое>
<выражение>::=<слагаемое> + <выражение>
<выражение>::=<слагаемое> - <выражение>
Noterminallar odatda burchakli qavslar ichida yoziladi
Ifodalar grammatikasini yasash tamoyillari
Qavslarsiz qo'shish va ayirish amallari daraxtning yuqori darajasida bajariladi, shuning uchun yig'indi tushunchasini birinchi bo'lib aniqlaydi.
Ko'paytirish va ayirish amallari daraxtning pastki sathlarida bajariladi, shuning uchun ko'paytiruvchi tushunchasi keyingi bosqichda aniqlanadi.
Hatto pastki amallar ham qavs ichida bajariladi - ular o'z navbatida atamalar va ko'paytmalar, ya'ni butun ifodalar bo'lishi mumkin.
cheksiz qoidalar o’rniga rekursiv munosabatlardan foydalaniladi
(x+2)*7-1
#
formula (x+2)*7-1 #
ifoda
(x+2)*7
-
(x+2)
*
1
7
(
x+2
)
1
7
1
x
+
2
Ko’paytmalar
Ko’shiluvchilar
Ifoda
Ko’shiluvchilar
Grammatika daraxti
Ifodalar grammatikasi
<formula> ::= #
<ifoda >
::=
<ko’shiluvchi>
<ifoda>
::=
<ko’shiluvchi>
+
<ifoda>
<ifoda>
::=
<ko’shiluvchi>
-
<ifoda>
<ko’shiluvchi>
::=
<ko’paytuvchi>
<ko’shiluvchi>
::=
<ko’paytuvchi>
*
<ko’shiluvchi>
<ko’shiluvchi>
::=
<ko’paytuvchi>
/
<ko’shiluvchi>
<ko’paytuvchi>
::=
<o’zgaruvchi>
<ko’paytuvchi>
::=
<son>
<ko’paytuvchi>
::=
( <ifoda >
)
O'ng va chap rekursiya
Qoidaning ko’rinishi:
:: = o'ng-rekursiya deyiladi
Qoidaning ko’rinishi:
:: = chap rekursiya deyiladi
Bizning iboralar grammatikamiz o'ng-rekursivdir.
Sintaktik tahlil qilish algoritmlari
LL parser - biz jumladan boshlaymiz, uni so'zlarga to'g'ri ajratishga harakat qilamiz, bizga o'ng-rekursiv grammatika kerak
LL-парсер
Oshib boruvchi parser - keling, so'zlardan boshlaylik, ushbu jumlani to'g'ri tuzishga harakat qiling, sizga chap qo'l grammatikasi kerak
LR-парсер, SLR-парсер
LALR-парсер, GLR-парсер
Rekursiv tahlil qiluvchi
Noterminallarning har biriga biz uni tahlil qiluvchi funktsiyani tayinlaymiz
Terminal bo'lmagan tahlil qilish funktsiyasi qoidalarning qaysi biri qo'llanilishi kerakligini aniqlashi kerak (agar bir nechta bo'lsa)
Keyin jumladan terminallarni o'qing va / yoki terminal bo'lmaganlarni tahlil qilish uchun funktsiyalarni chaqiring
Bunday funktsiyalar o'zlarini - rekursiya deb atashlari yoki o'z navbatida ularni keltirib chiqaradigan boshqa funktsiyalarni keltirib chiqarishi mumkin - o'zaro rekursiya