Syntax — dasturlash yoki formal tildagi belgilar, so‘zlar va konstruksiyalar qanday tartibda yozilishini belgilaydigan qoidalar to‘plami.
Syntax kodning grammatik jihatdan to‘g‘ri shaklini aniqlaydi. Kod syntaxga mos bo‘lishi uning mantiqan to‘g‘ri yoki foydali ekanini kafolatlamaydi.
Masalan, 2 + 3 syntactically to‘g‘ri ifoda. 2 + esa operand yetishmagani sabab syntax xato bo‘lishi mumkin.
Lexical syntax
Tilning eng kichik elementlari qanday yozilishi lexical qoidalar bilan belgilanadi.
Ularga:
- identifier;
- keyword;
- number literal;
- string literal;
- operator;
- whitespace;
- comment
kiradi.
Masalan, identifier raqam bilan boshlanishi mumkin yoki mumkin emasligi lexical syntax qismidir.
Grammar
Tokenlar qanday birikishi grammar orqali ifodalanadi.
Soddalashtirilgan qoida:
expression → expression "+" term
expression → term
Bu a + b ifodasining tuzilishini belgilaydi.
Grammar BNF, EBNF yoki boshqa formal notationda yozilishi mumkin.
Statement va expression
Expression qiymat hosil qiladi.
a + b
Statement amal yoki control flowni ifodalaydi.
return a + b
Ba’zi tillarda deyarli barcha konstruksiya expression, boshqalarida statement va expression qat’iy ajratiladi.
Block syntax
Code block turli tillarda turlicha belgilanadi.
Qavsli:
if (ready) {
run();
}
Indentatsiyali:
if ready:
run()
Keyword bilan yopiladigan:
if ready then
run
end
Block chegarasi til syntaxining muhim qismi.
Whitespace
Ko‘p tillarda qo‘shimcha whitespace semantikani o‘zgartirmaydi.
Boshqa tillarda indentatsiya block tuzilmasini belgilaydi.
Whitespace string literal, token ajratish va preprocessor directive’da ham muhim bo‘lishi mumkin.
Formatter syntax tree’ni tushunib whitespace’ni xavfsiz o‘zgartiradi.
Semicolon
Semicolon statement tugashini ko‘rsatishi mumkin.
Ba’zi tillarda majburiy, boshqalarida optional yoki automatic insertion mavjud.
Automatic semicolon insertion edge case’larda kutilmagan parse natijasi berishi mumkin.
Precedence
Operator precedence qavs yo‘q holatda qaysi amal oldin bajarilishini belgilaydi.
2 + 3 * 4
Ko‘p tilda multiplication additiondan oldin:
2 + (3 * 4)
sifatida parse qilinadi.
Associativity
Bir xil precedence’dagi operatorlar qaysi yo‘nalishda guruhlanishini bildiradi.
a - b - c
Left-associative bo‘lsa:
(a - b) - c
Assignment ko‘pincha right-associative:
a = (b = c)
Ambiguous grammar
Bitta token ketma-ketligi bir nechta parse tree berishi mumkin bo‘lsa grammar ambiguous.
Parser generator conflict ko‘rsatishi mumkin.
Precedence, associativity yoki grammarni qayta yozish ambiguity’ni yo‘qotadi.
Syntax error
Parser grammar qoidalariga mos tuzilma topa olmasa syntax error qaytaradi.
Xabar quyidagilarni ko‘rsatishi mumkin:
Asl xato ko‘rsatilgan qatordan oldin bo‘lishi mumkin. Masalan, yopilmagan qavs parserni keyingi qatorda adashtiradi.
Error recovery
Compiler birinchi syntax xatoda to‘liq to‘xtamasdan keyingi xatolarni topishga urinadi.
- semicolongacha o‘tish;
- token qo‘shilgan deb taxmin qilish;
- noto‘g‘ri tokenni tashlash;
- block oxirini topish
usullaridan foydalanadi.
Recovery noto‘g‘ri davom etsa, bitta real xato ko‘p qo‘shimcha xato chiqarishi mumkin.
Concrete syntax tree
Concrete Syntax Tree grammar’dagi barcha token va qoidalarni, jumladan qavs va ayrim punctuationni saqlaydi.
Formatter va source transformation uchun foydali.
Abstract Syntax Tree
AST keraksiz syntax detallarini olib tashlab, semantik tuzilmani saqlaydi.
Masalan, qavs va semicolon node sifatida qolmasligi mumkin.
Compiler keyingi tahlilni AST ustida bajaradi.
Syntax sugar
Til qulay yozuv beradi, compiler uni sodda asosiy konstruksiyaga aylantiradi.
Masalan:
- list comprehension;
for each;- optional chaining;
- async/await;
- property.
Bu syntactic sugar deb ataladi.
Sugar yangi semantika qo‘shishi yoki mavjud primitive’ni qulay ifodalashi mumkin.
Desugaring
Syntactic sugar asosiy core syntaxga aylantiriladi.
Desugaring parserdan keyin AST transformatsiyasi sifatida bajarilishi mumkin.
Generated kodni tushunish debugging va performance tahlilida foydali.
Syntax highlighting
Editor lexical va semantic tokenlarni rang bilan ajratadi.
Faqat regex asosidagi highlighting nested syntax va string ichidagi kodda xato qilishi mumkin.
Parser yoki language server aniqroq natija beradi.
DSL syntax
Domain-Specific Language ma’lum soha uchun maxsus syntax yaratadi.
Misollar:
Qisqa syntax soha mutaxassisiga qulay, ammo parser va tooling talab qiladi.
Syntax compatibility
Tilning yangi versiyasi eski syntaxni saqlashi yoki olib tashlashi mumkin.
Yangi keyword oldin identifier sifatida ishlatilgan kodni buzishi mumkin.
Transpiler yoki migration tool eski syntaxni yangi shaklga o‘tkazadi.
Context-sensitive qoidalar
Ba’zi til qoidalarini faqat context-free grammar bilan to‘liq tekshirib bo‘lmaydi. Masalan, type nomi bilan variable nomini ajratish symbol table ma’lumotini talab qilishi mumkin. Parser dastlab umumiy node yaratib, keyingi semantic bosqichda ma’noni aniqlaydi.
Grammar evolution
Yangi syntax qo‘shilganda eski code qanday parse bo‘lishi tekshiriladi. Yangi operator precedence yoki yangi keyword oldingi valid kodning daraxtini o‘zgartirishi mumkin.
Syntax test
Language implementation valid va invalid misollar to‘plami bilan sinovdan o‘tadi. Test faqat qabul qilinadigan kodni emas, xato joyi va recovery natijasini ham tekshiradi.
Dialect
Bir tilning turli dialectlari asosiy syntaxga extension yoki cheklov qo‘shishi mumkin. SQL dialectlari, shell variantlari va compiler extensionlari bunga misol. Portable source qaysi standart va extensionlarga tayanganini aniq ko‘rsatadi.
Bog‘liq tushunchalar
Grammar, Token, Lexer, Parser, Syntax error, AST, Operator precedence, Associativity, Syntactic sugar, Semantics