Syntax error — source code yoki boshqa formal matnning dasturlash tili grammatikasiga mos kelmasligi sabab parser uni to‘g‘ri tuzilishga ajrata olmaydigan xatodir. Yopilmagan qavs, noto‘g‘ri token tartibi yoki yetishmagan ajratgich keng tarqalgan misollardir. Syntax jihatdan to‘g‘ri dastur ham type, mantiq yoki runtime xatosiga ega bo‘lishi mumkin.
Aniqlash bosqichi
Lexer belgilarni keyword, identifier, literal va operator tokenlariga ajratadi. Noto‘g‘ri escape yoki tanilmagan belgi lexical error berishi mumkin. Parser tokenlar ketma-ketligini grammar qoidalari bo‘yicha parse tree yoki abstract syntax treega aylantiradi; qoidaga mos yo‘l topilmasa syntax diagnostic chiqaradi.
Compiled tilda xato odatda build vaqtida, interpreted tilda esa fayl parse qilinganda aniqlanadi. Interpreter faqat bajarilgan branchni parse qiladimi yoki butun modulni oldindan parse qiladimi implementatsiyaga bog‘liq.
Xato joylashuvi
Parser muammoni ko‘rgan token haqiqiy sabab joyidan keyin bo‘lishi mumkin. Masalan, oldingi qatorda qavs yopilmasa, parser keyingi else tokenida xato beradi. Diagnostic line va column bilan birga “expected” tokenlar ro‘yxatini ko‘rsatishi foydali, ammo bu ro‘yxat grammar holatining taxmini hisoblanadi.
Tab va Unicode belgilar column hisobini murakkablashtiradi. Editor protocol byte offset, UTF-16 unit yoki Unicode scalar ishlatishi mumkin. Compiler va editor bir xil position mappingga kelishmasa belgi noto‘g‘ri joyda chiziladi.
Error recovery
Parser birinchi xatoda to‘xtashi yoki synchronization tokenigacha o‘tib, qolgan fayldagi boshqa xatolarni ham ko‘rsatishi mumkin. Recovery juda agressiv bo‘lsa bitta sababdan o‘nlab soxta diagnostic chiqadi. IDE uchun parser incomplete code va yozish jarayonidagi vaqtinchalik xatoga chidamli bo‘lishi kerak.
Semicolon, closing brace yoki statement boundary recovery nuqtasi bo‘lishi mumkin. Parser qo‘shilgan yoki o‘chirilgan virtual tokenni diagnosticda bildiradi; u source’ni yashirin o‘zgartirmaydi.
Tuzatish vositalari
Syntax highlighting, delimiter matching va formatter xatoni yozish paytida ko‘rsatadi. Linter grammar’dan yuqori style va ehtimoliy mantiqiy muammolarni tekshiradi. Auto-fix faqat ma’nosi aniq bo‘lgan holatda xavfsiz; noto‘g‘ri qavsni qayerga qo‘yish har doim avtomatik aniqlanmaydi.
Generated code’da syntax error ko‘rinsa outputni qo‘lda tuzatish o‘rniga template, schema yoki generator xatosi tuzatiladi. Build log generator versioni va minimal reproduksiya bilan saqlanadi.
Boshqa xatolardan farqi
x + true grammar bo‘yicha to‘g‘ri, ammo type system uni rad etishi mumkin. Mavjud bo‘lmagan nom ham syntax emas, name resolution xatosidir. Nolga bo‘lish ayrim tillarda runtime exception. Xato turini aniq ajratish diagnostic va o‘quvchi tushunchasini yaxshilaydi.
Parser security boundary bo‘lsa, yaroqsiz input crash, cheksiz recursion yoki katta xotira sarfiga olib kelmasligi kerak. Fuzz testing malformed token ketma-ketliklari bilan recovery yo‘llarini sinaydi.
Til dizaynidagi ta’sir
Grammar haddan tashqari kontekstga bog‘liq bo‘lsa diagnostic va tooling murakkablashadi. Ajratgich, indentation yoki keyword tanlovi xatoni qanchalik erta aniqlashga ta’sir qiladi. Bir token uzoq konstruksiyani yopsa missing token joyi noaniq bo‘lishi mumkin.
Til serveri parser bilan bir xil grammar versiyasini ishlatmasa editor yashil ko‘rsatgan kod compilerda yiqiladi. Toolchain versioni loyiha bilan mahkamlanadi. Syntax extension yoki feature flag yoqilganda file mode ham diagnosticga kiradi. Minimal reproduksiya keraksiz kodni olib tashlab, aynan grammar muammosini ko‘rsatadi va compiler bug reportini aniq qiladi.
Bog‘liq tushunchalar
Parser, Lexer, Grammar, Parse tree, Static semantics, Error recovery, Compiler diagnostic