Kitap: Windows Internals, Siber Güvenlik ve Modern C++ ile Ustalık
Bölüm: 1.2 — Sözcüksel Analiz (Lexical Analysis / Tokenization)
Yazar: Berkehan Arda ÖZDEMİR
Bu proje, bir C++ derleyicisinin ilk aşaması olan lexer (tokenizer)'ın minimal bir implementasyonudur. Verilen kaynak kodu metnini boşluklara göre parçalara böler ve her parçayı bir token tipine sınıflandırır.
Amaç, gerçek bir derleyicinin "lexical analysis" aşamasında neler olduğunu pratik olarak anlamaktır.
| Token Tipi | Örnek |
|---|---|
KEYWORD |
int, return, class, namespace |
IDENTIFIER |
sayi, myFunc, Player |
INTEGER_LITERAL |
42, 100, 7 |
FLOAT_LITERAL |
3.14f, 0.5f |
DOUBLE_LITERAL |
3.14, 0.001 |
OCTAL_LITERAL |
017, 0755 |
HEX_LITERAL |
0xFF, 0x1A3B |
STRING_LITERAL |
"hello" |
OPERATOR |
+, -, =, <, > |
PUNCTUATOR |
{, }, (, ), ;, , |
END_OF_FILE |
(otomatik eklenir) |
UNKNOWN |
Tanımlanamayan token |
- Windows 10/11 (x64)
- Visual Studio 2022 (v145 toolset)
- C++20
Visual Studio ile Lexer.slnx solution dosyasını açıp Debug x64 veya Release x64 konfigürasyonunda derleyin.
MSVC CLI ile:
cl /EHsc /W3 /std:c++20 main.cpp /o CH1_2_LEXER.exemain() içindeki tokenSentence() çağrısını düzenleyerek farklı girdiler test edebilirsiniz:
myLexer.tokenSentence("int sayi = 5 ;");
// Çıktı: KEYWORD IDENTIFIER OPERATOR INTEGER_LITERAL PUNCTUATOR END_OF_FILEmain.cpp
├── enum class TokenType — Token sınıflandırma enum'u
├── ifContains<T>() — Generic arama yardımcısı
├── tokenToString() — TokenType → string dönüşümü
├── operators[] — Operatör karakter listesi
├── punctuators[] — Noktalama karakter listesi
├── keywords[] — C++20 anahtar kelime listesi (tam liste)
└── class Phrase
├── tokenize(string) — Tek token'ı sınıflandırır
└── tokenSentence(string) — Cümleyi boşluğa göre böler, tokenize eder
Bu bir atölye projesidir; üretim kalitesinde bir lexer değildir.
- Token ayrıştırması yalnızca boşluk karakterine göre yapılır.
int x=5;gibi bitişik yazılan ifadeler doğru tokenize edilmez;int x = 5 ;şeklinde yazılmalıdır. - Çok karakterli operatörler (
==,!=,<=,++,->) desteklenmez; her karakter bağımsız değerlendirilir. "hello world"gibi içinde boşluk olan string literal'lar iki ayrı token olarak işlenir.- Yorum satırları (
//,/* */) işlenmez.
Bu atölyeyi tamamlayarak şunlar anlaşılmıştır:
- Bir derleyicinin lexer aşamasının ne işe yaradığı ve derleme pipeline'ındaki yeri
- C++ token kategorileri ve aralarındaki sınırlar
enum classile tip güvenli sınıflandırma- Template fonksiyonlarla generic yardımcı yazımı
- Sayı literal türleri: decimal, octal, hex, float, double ayrımı
"Derleyici, kodunu anlayan ilk okuyucudur."