Concrete Syntax Tree (CST) — manba matnining grammatik tuzilishini tokenlar, tinish belgilari va qavslar kabi sintaktik tafsilotlar bilan birga daraxt ko‘rinishida saqlaydigan tasvir. U parse tree deb ham ataladi va odatda parser qo‘llagan hosila qoidalariga juda yaqin bo‘ladi.
Tuzilishi va mazmuni
CST ildizi grammatikaning boshlang‘ich belgisiga mos keladi; ichki tugunlar nonterminal, barglar esa token yoki terminaldir. Masalan, a + b * c ifodasida ko‘paytirish ustuvorligi alohida subtree orqali ko‘rinadi. Qavslar va operator tokenlari ham yo‘qolmaydi. Shu sabab daraxt asl matnni deyarli yo‘qotishsiz qayta tiklashga yaroqli.
Chegaralar va aniqlik
Parser turi daraxt shakliga ta’sir qiladi. Ambiguous grammatika bitta token oqimi uchun bir nechta CST berishi mumkin; precedence va associativity qoidalari bu noaniqlikni bartaraf etadi. Error-recovery qo‘shgan sun’iy tokenlar haqiqiy manba tokenlaridan ajratib belgilanishi kerak. Aks holda formatter xatoli kodni o‘zgartirib yuborishi mumkin.
Amaliy misol
Masalan, x = (y + 1); uchun CST ;, =, ( va ) belgilarini ham saqlaydi. AST esa odatda Assignment va Add tugunlarini qoldirib, qavs hamda nuqtali vergulni tashlaydi. Refactoring vositasi semantik o‘zgarish uchun ASTdan, komment va formatni saqlash uchun CST yoki tokenlardan foydalanishi mumkin.
Qo‘llanish sohasi
CST formatter, syntax highlighter, kodni qayta yozish, IDE navigatsiyasi va source-to-source translatorlarda muhim. Daraxt tuguniga byte yoki Unicode offsetlari, leading/trailing trivia va original token bog‘lanadi. Incremental parser faqat tahrirlangan hudud subtree’larini qayta qurib, katta faylda kechikishni kamaytiradi.
Tekshirish usuli
Tekshiruvda tokenlarni barglardan yig‘ish natijasi original token oqimiga teng bo‘lishi, har child oralig‘i parent oralig‘iga kirishi va grammar production aritysi saqlanishi nazorat qilinadi. Parse–print–parse sinovi ikkinchi daraxtning sintaktik ekvivalentligini ko‘rsatadi; xatoli kirishlar uchun recovery tugunlari alohida sinov qilinadi.
Concrete Syntax Tree 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
Lossless syntax modelda whitespace va kommentlar ko‘pincha trivia sifatida token oldi yoki ketiga biriktiriladi. Bu tanlov node oralig‘i bilan trivia oralig‘i to‘qnashmasligini talab qiladi. Green/red tree arxitekturasida immutable, parent pointersiz green node’lar structural sharing uchun, red wrapperlar esa parent va absolute position uchun ishlatiladi. Incremental tahrirda hash yoki identity orqali o‘zgarmagan subtree qayta ishlatiladi. Xotira sarfi ASTdan yuqori bo‘lishi tabiiy, chunki barcha grammatik qatlam va token saqlanadi. Shu sabab production tizim node interning, compact child array va lazy position hisoblashdan foydalanishi mumkin.
CST API versiyalanganda node kind, child tartibi va trivia ownershipi compatibility shartlari sifatida hujjatlashtiriladi. Grammar o‘zgargach eski serialized daraxtni ko‘r-ko‘rona ochish o‘rniga schema version tekshiriladi. Telemetriyada parse va incremental reuse foizi, daraxt tugunlari soni hamda peak memory o‘lchanadi; foydalanuvchi kodi yoki token matni jurnalga yozilmaydi.
Bog‘liq tushunchalar
abstract syntax tree, parse tree, grammar, parser, token, syntax