Makrolar
- Rust makroları, kod tekrarını ortadan kaldırmak ve yinelemeyi azaltmak için kullanılır.
sqleibniz içindeki ifade düğümleri Node trait'ini uygulamak zorundadır ve bu da çok fazla kod tekrarına yol açar.
- Makrolar kullanılarak struct tanımları ve
Node trait'i uygulamaları otomatikleştirilebilir.
Kod tekrarını azaltan makrolar
- Makrolar struct tanımlar, belge yorumları ekler ve
Node trait'ini karşılayan fonksiyonları uygular.
- Makrolar, yinelenen metavariable tanımları aracılığıyla çeşitli alanlar ekleyebilir.
Testler
- Rust'ta, Go'daki tablo tabanlı testlere benzer bir yaklaşım uygulanabilir.
test_group_pass_assert! ve test_group_fail! makroları kullanılarak çeşitli girdi ve beklenen çıktı çiftleri test edilebilir.
Ayrıştırıcı testleri
- Parser modülünde de benzer makrolar kullanılarak SQL ifadelerinin sonuçları test edilir.
EXPLAIN SQL ifadesini test etmek için sql_stmt_prefix fonksiyonu kullanılır.
Makroların dezavantajları
rust-analyzer, makroların içinde iyi çalışmaz ve dokümantasyon yetersizdir.
Karakter eşleştirme
- Rust'ın
matches! makrosu kullanılarak karakterler kolayca karşılaştırılabilir.
- Verilen bir karakterin SQLite sayısı olup olmadığını kontrol eden bir örnek vardır.
Token eşleştirme
- Lexer, karakter akışını bir token akışına dönüştürdükten sonra parser bunu kullanarak sözdizimi ağacını oluşturur.
- Token türlerini tanımak için
match ifadesi kullanılır.
Hata gösterimi
- Hata işleme sayesinde kullanıcıya net hata mesajları sunulur.
İsteğe bağlı özellikler
- Rust'ın
Option tipi, bir değerin var olup olmadığını kontrol etmek, koşulları sınamak veya varsayılan değer sağlamak için kullanılabilir.
is_some_and, map, map_or gibi metotlar kullanılarak kodun okunabilirliği artırılır.
Yineleyiciler
- Rust yineleyicileri kullanılarak karakterler filtrelenir ve SQLite'ın sayı ayrıştırma kurallarına uygun şekilde işlenir.
1 yorum
Hacker News yorumları
Rust'ın borrow checker'ı ve bellek yönetiminin zorlukları nedeniyle Rust kullanmakta zorlandı. Rust'ın fonksiyonel programlama (FP) unsurlarını sevdi, ancak başka bir dil aramaya karar verdi. OCaml'ı keşfetti ve bundan memnun kaldı
Rust ve PL fikirleri konusunda deneyim eksikliği var gibi görünüyor. AST'yi cebirsel veri tipleri olarak tanımlamanın daha basit olacağını düşünüyor. Makrolar çoğu dilde farklı çalışır, ancak esas olarak kod tekrarını kaldırmak ve yinelemeyi azaltmak için kullanılır
Haskell ile yazılmış bir parser, sadelik ve okunabilirlik açısından üstün. Neredeyse BNF gibi okunur ve teknik prosedür neredeyse hiç olmadığı için asıl dilbilgisine odaklanılabilir
Ragel, Go, Java, C++, C ile parser yazma deneyimi var. C ile JSON parser yazmak, Rust kodundan daha basit olabilir. Parser altyapısı, eBNF ile parser üretilebilecek doyum noktasına ulaşana kadar gelişti
Rust ile bir eBPF disassembler ve emulator yazdı ve Rust'ın parsing işleri için uygun olduğunu düşünüyor. Ancak makro kullanımı, dilin içinde çalışmaktan farklı hissettiriyor
Rob Pike'ın Go'da lexical scanning üzerine konuşmasını seviyor. Eğitici ve zarif bir yaklaşım
Parser combinator kütüphaneleri kullanılarak yüksek performanslı protocol parser'ları gömülü ortamlara dağıtılabilir. Aynı kütüphaneler gömülü protocol parser'ları yazmak için de kullanılabilir
Rust'ta tam bir AST parser'ı yazarken, somut AST tiplerinin hiyerarşisini ifade etmek zordu. Garip type trick'ler ve makrolar kullanmak zorunda kaldı
sqlitesözdizimini parse etmek zor bir iş.sqliteilham verici bir kaynak. Railroad diagram'ları çok faydalı ve Lemon parser generator yeterince takdir edilmiyorCebirsel veri tiplerine sahip diller,
sqlitesözdizimini parse etmek için uygun. TypeScript de iyi bir seçenek olabilir. Rust ile parser yazmanın nasıl yapılacağına dair kısa bir giriş yazdı