Bir programlama diliyle çalışırken çoğunlukla kelimeler görürüz: let, print, değişken adları. Bilgisayarın elinde başlangıçta yalnızca karakterler vardır. Bu karakterleri anlamlı parçalara dönüştürmek, bir dili çalıştırmanın ilk adımlarından biridir.
Önce küçük bir örnek
let cevap = 42;
Bu satırı karakter karakter okuyabilirsin: l, e, t, boşluk… Fakat sonraki aşama için daha yararlı bir temsil şudur:
LET let
IDENT cevap
EQUAL =
NUMBER 42
SEMICOLON ;
Bu parçaların her birine token diyoruz. Tokenlara ayıran bileşenin adı lexer veya scanner. Burada LET bir token türü, let ise kaynakta görünen metin, yani lexeme.
Lexer neyi bilir?
Lexer hangi karakterlerin bir sayı oluşturduğunu, bir adın nerede bittiğini ve let kelimesinin özel bir anahtar sözcük olduğunu bilir. Boşlukları, dilin kurallarına göre atlayabilir veya ayrıca işleyebilir. Bu küçük deneyde boşluklar ve // yorumları atlanır.
Ama lexer henüz cevap değişkeninin daha önce tanımlanıp tanımlanmadığına karar vermez. 2 + * 3 gibi bir token dizisi üretebilir; bu dizinin dilin gramerine uygun olup olmadığı parser’ın sorusudur.
İlk ayrım: Lexer “Bunlar hangi parçalar?” diye sorar. Parser “Bu parçalar nasıl bir yapı oluşturuyor?” diye sorar.
Sadece türü saklamak yeterli mi?
Bir sayı tokenında NUMBER türünü saklamak, sayının 42 mi yoksa 900 mü olduğunu söylemez. Kaynaktaki metne de ihtiyacımız var. Üstelik iyi bir hata mesajı için konum bilgisi gerekir.
struct Token<'a> {
kind: TokenKind,
lexeme: &'a str,
start: usize,
}
Bu tasarımda token metni, kaynak koddan ödünç alınır. Kaynak metnin tokenlardan uzun yaşaması gerekir. Rust’ta lifetime kavramını tekrar etmek için güzel, somut bir bağlantı.
Kendin dene
let cevap = 2 + 3 * 4; satırını kâğıda yazıp tokenlarına ayır. Ardından cevap adını değiştir, bir boşluk ekle ve @ gibi tanınmayan bir simge dene. Hangi değişiklik token sayısını etkiler? Hangisi lexer hatası gerektirir?
İngilizce köşesi
Token: dilin anlamlı bir birimi. Lexeme: bu birimin kaynak metindeki yazılışı.
A lexer groups characters into tokens. The parser gives those tokens a structure.
Kaynak okuma: Crafting Interpreters — Scanning. Bu yazı bağımsız bir başlangıç notudur; kitabın çevirisi değildir.