Bosh sahifa Wiki Syntax

Syntax

Syntaxdasturlash 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.

Parser:

  • 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