CodeBlanks Logo Icon CodeBlanks

Parser

Parser (sözdizim analizci) yazmayı öğrenirsin.

Parser ve dilbilgisi

Parser (sözdizim çözümleyici), token akışını bir ağaç yapısına dönüştürür. Lexer'ın aksine sözdizimsel yapıya bakar; bu yapı dilbilgisi (grammar) olarak yazılır.

Yaygın yöntem özyinelemeli iniş (recursive descent) tür. Her dilbilgisi öğesi için bir C fonksiyonu yazılır; fonksiyon tokenleri tüketir ve alt öğeleri çağırır. Örneğin expr öğesi term + term biçimindeyse, parse_expr önce parse_term çağırır, sonra + bekler. Hata durumunda parser beklenen tokeni söyler. Çıktı genellikle AST'dir.

Özyinelemeli iniş

Özyinelemeli iniş, her dilbilgisi öğesini bir C fonksiyonuyla modeller. Fonksiyon tokenleri sırayla tüketir ve alt öğeleri çağırır. Yapı kodu okunaklı ve hata iletilerini anlamlı kılar.

Tipik bir hesap makinesi şöyle başlar: parse_expr, parse_term çağırır; ardından + veya - bekler. parse_term benzer şekilde * ve / işler. parse_factor sayı veya parantezli ifadeyi döndürür. Her fonksiyon bir AST düğümü döndürür. Öncelik sırası doğal olarak ortaya çıkar: çarpma daha derin düzeyde olduğu için önce işlenir.

Uygulama Parser düğümlerini yazdır

enum node_type { NUM_NODE, BINOP_NODE } tanımla. void print_node(int type, const char *op) fonksiyonu tanımla; gövdesi printf("node%d:%s\n", type, op); olsun. main içinde dört düğüm için çağır: (NUM_NODE, "42"), (BINOP_NODE, "+"), (BINOP_NODE, "*"), (NUM_NODE, "7").

Başlangıç kodu

main.c
#include <stdio.h>

// node_type enum'unu tanımla
// print_node fonksiyonunu tanımla ve dört düğüm için çağır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>

enum node_type { NUM_NODE, BINOP_NODE };

void print_node(int type, const char *op) {
    printf("node%d:%s\n", type, op);
}

int main(void) {
    print_node(NUM_NODE, "42");
    print_node(BINOP_NODE, "+");
    print_node(BINOP_NODE, "*");
    print_node(NUM_NODE, "7");
    return 0;
}

Beklenen çıktı

node0:42
node1:+
node1:*
node0:7

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Parser kavramlarını eşle

Kavram Anlamı
grammar Sözdizim yapısı
recursive descent Özyinelemeli yöntem
parse_expr İfade öğesi
expected token Hata iletisi

2 Parser ne üretir?

  • Token
  • AST Doğru cevap
  • Lexer durumu
  • Sembol tablosu

Açıklama: Parser token akışından bir AST kurar.

3 parse çağrısını tamamla

Soru
ast_t *node = parse_____();
Cevap
ast_t *node = parse_expr();

Açıklama: parse_expr bir ifade çözümler.

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