Semantic Error — dastur sintaktik jihatdan grammatika talablariga mos bo‘lsa ham, tilning ma’no va qo‘llanish qoidalarini buzadigan xato. E’lon qilinmagan identifikator, mos kelmaydigan turlar yoki noto‘g‘ri argument soni shunday xatolarga misol bo‘ladi.
Aniqlash bosqichi
Parser odatda semantic errorni topmaydi, chunki tokenlar qonuniy jumla hosil qiladi. Semantic analysis bosqichi symbol table, scope, type va declaration ma’lumotlarini bog‘laydi. Har identifier use tegishli declarationga resolve qilinadi; expression turi pastdan yuqoriga hisoblanadi va operator talablariga solishtiriladi.
Xato sinflari
int n = "olma"; ko‘p statik turlangan tillarda type mismatchdir. f(1, 2) chaqiruvi f faqat bitta parametr qabul qilsa arity xatosi bo‘ladi. break sikl yoki switch tashqarisida yozilishi ham grammar ruxsat bergan, ammo kontekst qoidasi taqiqlagan semantic error bo‘lishi mumkin.
Kichik misollar
Static semantics kompilyatsiya vaqtida tekshiriladigan qoidalarni anglatadi. Programmaning nolga bo‘lishi yoki null obyektga murojaati esa ko‘pincha faqat bajarilishda aniqlanadigan runtime errordir. Ba’zi tillarda implicit conversion bir holatni qonuniy qiladi, boshqa tilda esa ayni kod semantic error hisoblanadi; tashxis til spetsifikatsiyasiga bog‘liq.
Diagnostika dizayni
Sifatli diagnostika xato kodi, source range, kutilgan va topilgan tur hamda ehtimoliy tuzatishni beradi. Bitta ildiz xato yuzlab ikkilamchi xato tug‘dirmasligi uchun analizator error type yoki recovery symbol ishlatadi. Shu bilan keyingi operatorlar tekshiriladi, lekin avvalgi noaniqlikdan kelgan shovqin cheklanadi.
Nazorat sinovlari
Testlar scope shadowing, overload resolution, generic constraint, access control va control-flow qoidalarini alohida qamrab oladi. Negative test muvaffaqiyatsizlikni kutadi va faqat kompilyatorning exit code’ini emas, kerakli diagnostika kategoriyasini tekshiradi. Error message matni o‘zgaruvchan bo‘lsa, barqaror error identifier ma’qul.
Semantic Error bo‘yicha tahlil natijasi faqat yakuniy xulosa bilan emas, uni hosil qilgan IR versiyasi, target xususiyatlari va qo‘llangan taxminlar bilan birga saqlanadi. Compiler passlari ketma-ket o‘zgarganda oldingi natija avtomatik ravishda haqiqiy deb olinmaydi: tegishli dependencylar invalidatsiya qilinib, zarur qism qayta hisoblanadi. Debug rejimida asosiy invariant buzilgan nuqta va undan oldingi transformatsiya qayd etiladi; release rejimida esa tekshiruvlarning arzon qismi qoldiriladi. Shu yondashuv nazariy jihatdan qonuniy qoida implementatsiya xatosi yoki noto‘g‘ri cost model sabab zararli qarorga aylangan holatni ajratishga yordam beradi.
Kengaytirilgan jihatlar
Semantic analiz ko‘pincha bir necha passga ajraladi: avval declarationlar yig‘iladi, keyin nomlar bog‘lanadi, so‘ng type va control-flow cheklovlari tekshiriladi. Bu forward declaration va mutual recursionni qo‘llashni osonlashtiradi. IDE muhitida fayl tugallanmagan bo‘lishi tabiiy, shuning uchun analizator missing node va unknown type bilan davom eta olishi kerak. Biroq unknown qiymati haqiqiy Any turi bilan aralashtirilmaydi. Diagnostic deduplication bitta noto‘g‘ri declarationdan kelgan ko‘plab use xabarlarini birlashtiradi, source fix qo‘llangach esa incremental dependency graph faqat ta’sirlangan symbol va expressionlarni qayta tekshiradi.
Semantic checker symbol table scope’dan chiqqanda eski bindingni tiklaydi; shadowing qonuniy bo‘lsa ham diagnostika siyosati ogohlantirish berishi mumkin. Error node uchun type propagation cheklangan bo‘lib, u overload candidateni tasodifan yutib yubormaydi. Katta loyihada diagnostika soniga limit qo‘yiladi, ammo birinchi xatolarning source tartibi deterministik saqlanadi.
Bog‘liq tushunchalar
syntax error, type checking, semantic analysis, symbol table, static semantics, runtime error