Derleyici bileşeni
- C kursu
- Uzman
- Ders 45/47
- 6 dk
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
#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
#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
if (strcmp(cmd, ____) == 0) return 1;
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.