Makro
- Makro di Rust digunakan untuk menghilangkan duplikasi kode dan mengurangi pengulangan.
- Node kalimat di
sqleibniz harus mengimplementasikan trait Node, yang menyebabkan banyak duplikasi kode.
- Dengan menggunakan makro, definisi struct dan implementasi trait
Node dapat diotomatisasi.
Makro untuk Menghilangkan Duplikasi Kode
- Makro mendefinisikan struct, menambahkan komentar dokumentasi, dan mengimplementasikan fungsi yang memenuhi trait
Node.
- Makro dapat menambahkan berbagai field melalui definisi metavariabel yang berulang.
Pengujian
- Di Rust, pendekatan yang mirip dengan table-driven test di Go dapat diimplementasikan.
- Dengan menggunakan makro
test_group_pass_assert! dan test_group_fail!, berbagai pasangan input dan output yang diharapkan dapat diuji.
Pengujian Parser
- Di modul parser juga digunakan makro serupa untuk menguji hasil pernyataan SQL.
- Fungsi
sql_stmt_prefix digunakan untuk menguji pernyataan SQL EXPLAIN.
Kekurangan Makro
rust-analyzer tidak bekerja dengan baik di dalam makro, dan dokumentasinya kurang memadai.
Pencocokan Karakter
- Makro
matches! di Rust dapat digunakan untuk membandingkan karakter dengan mudah.
- Ada contoh untuk memeriksa apakah karakter tertentu merupakan angka SQLite.
Pencocokan Token
- Setelah lexer mengubah aliran karakter menjadi aliran token, parser menggunakan hasil itu untuk membangun pohon sintaks.
- Pernyataan
match digunakan untuk mengenali jenis token.
Menampilkan Kesalahan
- Penanganan kesalahan digunakan untuk memberikan pesan kesalahan yang jelas kepada pengguna.
Fitur Opsional
- Tipe
Option di Rust digunakan untuk memeriksa apakah suatu nilai ada, mengecek kondisi, atau menyediakan nilai default.
- Metode seperti
is_some_and, map, dan map_or digunakan untuk meningkatkan keterbacaan kode.
Iterator
- Iterator di Rust digunakan untuk memfilter karakter dan memprosesnya sesuai aturan parsing angka SQLite.
1 komentar
Komentar Hacker News
Kesulitan menggunakan Rust karena
borrow checkerdan rumitnya manajemen memori. Menyukai elemen pemrograman fungsional (FP) di Rust, tetapi memutuskan mencari bahasa lain. Menemukan OCaml dan merasa puasTampaknya kurang memiliki pengalaman dengan Rust dan ide-ide PL. AST kemungkinan akan lebih sederhana jika didefinisikan sebagai tipe data aljabar. Makro bekerja berbeda di sebagian besar bahasa, tetapi umumnya digunakan untuk menghilangkan duplikasi kode dan mengurangi pengulangan
Parser yang ditulis dengan Haskell unggul dalam hal kesederhanaan dan keterbacaan. Hampir terbaca seperti BNF, dengan sangat sedikit prosedur teknis sehingga bisa fokus pada tata bahasa yang sebenarnya
Memiliki pengalaman menulis parser dengan Ragel, Go, Java, C++, dan C. Menulis parser JSON dalam C bisa lebih sederhana daripada kode Rust. Infrastruktur parser telah berkembang hingga mencapai titik jenuh di mana parser dapat dibuat dengan eBNF
Menulis disassembler dan emulator eBPF dengan Rust, dan menganggap Rust cocok untuk pekerjaan parsing. Namun, penggunaan makro terasa berbeda dari bekerja di dalam bahasa itu sendiri
Menyukai presentasi Rob Pike tentang pemindaian leksikal di Go. Pendekatannya edukatif dan elegan
Dengan menggunakan library parser combinator, parser protokol berperforma tinggi dapat dideploy ke lingkungan embedded. Library yang sama juga dapat digunakan untuk menulis parser protokol embedded
Saat menulis parser AST lengkap di Rust, sulit untuk mengekspresikan hierarki tipe AST yang konkret. Harus menggunakan trik tipe yang aneh dan makro
Mem-parsing sintaks sqlite adalah pekerjaan yang sulit. sqlite adalah sumber inspirasi. Diagram railroad sangat berguna, dan generator parser Lemon belum mendapat pengakuan yang layak
Bahasa dengan tipe data aljabar cocok untuk parsing sintaks sqlite. TypeScript juga bisa menjadi pilihan yang baik. Menulis pengantar singkat tentang cara menulis parser di Rust