Parser
- C kursu
- Uzman
- Ders 14/47
- 5 dk
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
#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
#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
ast_t *node = parse_____();
ast_t *node = parse_expr();
Açıklama: parse_expr bir ifade çözümler.