CodeBlanks Logo Icon CodeBlanks

AST

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

main.c
#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

main.c
#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

Soru
struct ast_node *left = node->____;
Cevap
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.

Uzman bölümündeki tüm dersler