AST
- C kursu
- Uzman
- Ders 15/47
- 5 dk
Soyut sözdizim ağacı (AST) oluşturmayı öğrenirsin.
AST nedir?
AST (soyut sözdizim ağacı), kaynak kodun yapısını gösteren ağaçtır. Her düğüm bir işlemi, yaprağı da değerleri temsil eder. Parser'ın ana çıktısıdır.
Örneğin 2 + 3 * 4 ifadesi üç düğüme indirgenir: kök +, sol çocuk 2, sağ çocuk *. *'in çocukları 3 ve 4'tür. AST öncelik sırasını yapısal olarak kodlar; parentezlere gerek kalmaz. Derleyicinin sonraki aşamaları bu ağaçta dolaşır. Her düğüm bir struct ile temsil edilir; tür, değer ve çocuk işaretçileri taşır.
Ağaçta dolaşma
AST'yi işlemek için üç yaygın dolaşma sırası vardır: preorder (önce kök), inorder (kök ortada) ve postorder (kök sonda). Her sıra farklı amaçlara uyar.
Preorder, kod üretiminde ifadeleri yukarıdan aşağı çözümlemek için uygundur. Postorder, önce çocukları hesaplamak isteyen yorumlayıcılarda kullanılır. Inorder, matematiksel ifadeleri insan okur gibi basar. Dolaşma özyinelemeli yazılır: fonksiyon önce kökü işler, sonra çocukları çağırır (preorder). Her düğümün türüne göre farklı işlem yapılır; bu yüzden dolaşma kodu bir switch içerir.
Uygulama AST düğümlerini yazdır
struct ast_node { const char *op; int value; } tanımla. void print_ast(struct ast_node n) fonksiyonu tanımla; gövdesi printf("[%s]%d\n", n.op, n.value); olsun. main içinde üç düğüm tanımla: {"+", 0}, {"num", 42}, {"num", 7} ve her birini print_ast ile yazdır.
Başlangıç kodu
#include <stdio.h>
// ast_node yapısını tanımla
// print_ast fonksiyonunu tanımla ve üç düğüm için çağır
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
struct ast_node { const char *op; int value; };
void print_ast(struct ast_node n) {
printf("[%s]%d\n", n.op, n.value);
}
int main(void) {
struct ast_node root = {"+", 0};
struct ast_node left = {"num", 42};
struct ast_node right = {"num", 7};
print_ast(root);
print_ast(left);
print_ast(right);
return 0;
}Beklenen çıktı
[+]0 [num]42 [num]7
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 AST çocuk erişimini tamamla
struct ast_node *left = node->____;
struct ast_node *left = node->left;
Açıklama: node->left sol çocuğu verir.
2 Dolaşma sıralarını eşle
| Kavram | Anlamı |
|---|---|
preorder |
Önce kök |
inorder |
Kök ortada |
postorder |
Kök sonda |
level-order |
Katman katman |
3 Bir AST düğümü tipik olarak ne içerir?
- Yalnız değer
- Yalnız tür
- Tür ve alt düğümler Doğru cevap
- Yalnız metin
Açıklama: Düğüm türü ve çocuk işaretçileri AST'nin temelidir.