CodeBlanks Logo Icon CodeBlanks

Derleyici bileşeni

Lexer ve parser ile küçük bir dil yazarsın.

Derleyici bileşeni

Üçüncü derste derleyici bileşenini eklersin. parse_command fonksiyonu, bir komut dizesini alır ve tanırsa bir kod döndürür. Bu, bir derleyicinin sözcük çözümleyici (lexer) ve çözümleyici (parser) adımlarının basitleştirilmiş birleşimidir.

Gerçek bir derleyici, kaynak kodu önce belirteçlere (token) ayırır, sonra bir sözdizimi ağacı (AST) üretir. Burada strcmp ile komut dizesini karşılaştırır ve bir tamsayı döndürürürüz: "help" için 1, "exit" için 2, bilinmeyen için 0. Bu, komut tabanlı arayüzlerin temelidir. Önceki dersin çözümü başlangıç koduna dahildir.

strcmp ile komut tanıma

strcmp(a, b) fonksiyonu, iki dizeyi karşılaştırır: eşitse 0 döndürür. Komut tanıma için: if (strcmp(cmd, "help") == 0) return 1;. Bu desen, komut tabanlı arayüzlerin temelidir.

Birden fazla komut için zincirleme if yazılır: her komut ayrı bir strcmp ile kontrol edilir. Eşleşme yoksa varsayılan dönüş (0) verilir. Bu, bir derleyicinin anahtar sözcük tanıma adımına benzer. string.h başlığı strcmp'i sağlar. parse_command sonucu main'de kullanılır; örneğin bir switch ile farklı komutları işler.

Uygulama parse_command fonksiyonunu ekle

Var olan tanımların altına int parse_command(const char *cmd) yaz. strcmp(cmd, "help") == 0 ise return 1;, strcmp(cmd, "exit") == 0 ise return 2;, değilse return 0;. main içinde printf("Komut: %d\n", parse_command("help")) çağır.

Başlangıç kodu

main.c
#include <stdio.h>
#include <string.h>

void kernel_init(void);
int parse_command(const char *cmd);
int security_check(const char *buf, int len);

void kernel_init(void) {
    printf("Çekirdek başladı\n");
}

int syscall(int num) {
    return num * 2;
}

int main(void) {
    printf("Proje başladı\n");
    kernel_init();
    return 0;
}

// parse_command fonksiyonunu yaz: "help" -> 1, "exit" -> 2, else 0
// main'de parse_command("help") çağır ve yazdır

Örnek çözüm

main.c
#include <stdio.h>
#include <string.h>

void kernel_init(void);
int parse_command(const char *cmd);
int security_check(const char *buf, int len);

void kernel_init(void) {
    printf("Çekirdek başladı\n");
}

int syscall(int num) {
    return num * 2;
}

int parse_command(const char *cmd) {
    if (strcmp(cmd, "help") == 0) return 1;
    if (strcmp(cmd, "exit") == 0) return 2;
    return 0;
}

int main(void) {
    printf("Proje başladı\n");
    kernel_init();
    printf("Komut: %d\n", parse_command("help"));
    return 0;
}

Beklenen çıktı

Proje başladı
Çekirdek başladı
Komut: 1

Soru ve cevaplar

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

1 Çözümleyici kavramını eşle

Kavram Anlamı
strcmp Dize karşılaştır
parse_command Komut tanı
"help" 1 döndür
"exit" 2 döndür

2 strcmp çağrısını tamamla

Soru
if (strcmp(cmd, ____) == 0) return 1;
Cevap
if (strcmp(cmd, "help") == 0) return 1;

Açıklama: strcmp(cmd, "help") == 0 ise komut 'help' tanınmış olur.

3 parse_command("help") ne döndürür?

  • 1 Doğru cevap
  • 0
  • 2
  • -1

Açıklama: parse_command "help" için 1 döndürür.

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