Tokay adalah bahasa pemrograman yang dirancang untuk parsing ad-hoc.
Penting
Tokay sedang dalam pengembangan dan belum dipertimbangkan untuk penggunaan produksi. Jadilah bagian dari pengembangan berkelanjutan Tokay, dan berkontribusi!
Tokay dimaksudkan untuk menjadi bahasa pemrograman yang dapat digunakan untuk mengimplementasikan solusi masalah pemrosesan teks dengan cepat. Hal ini dapat melibatkan ekstraksi data sederhana, tetapi juga penguraian struktur sintaksis atau bagiannya dan konversi informasi menjadi pohon penguraian terstruktur atau pohon sintaksis abstrak untuk diproses lebih lanjut.
Oleh karena itu, Tokay tidak hanya menjadi alat praktis untuk one-liner sederhana seperti matcher atau recognition, namun juga bahasa yang dapat digunakan untuk mengimplementasikan penganalisis kode, alat refactoring, interpreter, compiler, atau transpiler. Sebenarnya parser bahasa Tokay sendiri diimplementasikan di Tokay sendiri.
Tokay terinspirasi oleh awk, memiliki cita rasa sintaksis dan semantik dari Python dan Rust, tetapi juga mengikuti filosofi, ide, dan prinsip desainnya sendiri. Oleh karena itu, Tokay tidak dapat dibandingkan secara langsung dengan bahasa atau proyek lain, dan berdiri sendiri. Ini adalah bahasa pemrograman yang benar-benar baru.
Tokay masih merupakan proyek yang sangat muda dan mempunyai banyak potensi. Relawan dipersilakan!
Dengan menggunakan manajer ketergantungan Rusts dan build-tool cargo
, cukup instal Tokay dengan
$ cargo install tokay
Untuk distro berbasis Arch Linux juga terdapat paket tokay
dan tokay-git
di Arch Linux AUR.
"Hello World" versi Tokay cukup jelas.
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay juga dapat menyapa kata apa pun yang dimasukkan ke dalamnya. Program berikutnya mencetak "Hello Venus", "Hello Earth" atau "Hello" diikuti dengan nama lain yang sebelumnya diurai oleh token Word
bawaan. Masukan apa pun selain kata secara otomatis dihilangkan.
print("Hello", Word)
$ tokay 'print("Hello", Word)' -- "World 1337 Venus Mars 42 Max" Hello World Hello Venus Hello Mars Hello Max
Sebuah program sederhana untuk menghitung kata dan angka dan mencetak totalnya setelahnya dapat diimplementasikan seperti ini:
Word words += 1
Number numbers += 1
end print(words || 0, "words,", numbers || 0, "numbers")
$ tokay 'Word words += 1; Number numbers += 1; end print(words || 0, "words,", numbers || 0, "numbers")' -- "this is just the 1st stage of 42.5 or .1 others" 9 words, 3 numbers
Secara desain, Tokay membuat pohon sintaksis dari informasi yang dikonsumsi secara otomatis.
Program selanjutnya mengimplementasikan parser dan interpreter untuk ekspresi matematika sederhana, seperti 1 + 2 + 3
atau 7 * (8 + 2) / 5
. Hasil dari setiap ekspresi dicetak setelahnya.
Memproses rekursi kiri langsung dan tidak langsung tanpa berakhir pada loop tak terbatas adalah salah satu fitur inti Tokay.
_ : Char< t>+ # redefine whitespace to just tab and space
Factor : @{
Int _ # built-in 64-bit signed integer token
'(' _ Expr ')' _
}
Term : @{
Term '*' _ Factor $1 * $4
Term '/' _ Factor $1 / $4
Factor
}
Expr : @{
Expr '+' _ Term $1 + $4
Expr '-' _ Term $1 - $4
Term
}
Expr _ print("= " + $1) # gives some neat result output
$ tokay examples/expr_from_readme.tok 1 + 2 + 3 = 6 7 * (8 + 2) / 5 = 14 7*(3-9) = -42 ...
Hitung angka Fibonacci dari bilangan bulat yang diurai:
fibonacci : @n {
if n <= 1 n else fibonacci(n - 1) + fibonacci(n - 2)
}
Int print($1, "=>", fibonacci($1))
$ tokay examples/fibonacci2.tok 0 0 => 0 1 1 => 1 2 2 => 1 3 3 => 2 4 4 => 3 5 5 => 5 6 6 => 8 7 7 => 13 8 8 => 21 9 9 => 34 10 10 => 55
Beranda Tokay tokay.dev menyediakan tautan ke permulaan cepat dan dokumentasi. Kode sumber dokumentasi disimpan dalam repositori terpisah.
Untuk debugging, ada dua metode yang digunakan.
log
-crate Untuk trace standar Rust gunakan fasilitas env_logger
. Jejak lengkap hanya dikompilasi ke dalam debug executable, versi rilis hanya memberikan tingkat peringatan ke atas.
$ RUST_LOG=tokay=debug tokay
Alternatifnya, pelacakan dapat diaktifkan untuk program __main__
dengan mengatur TOKAY_LOG
. Ini digunakan untuk memulai penelusuran ketika parser internal telah dikompilasi dan dijalankan, dan mengurai program sebenarnya. TOKAY_LOG
dapat disetel ke format apa pun yang sesuai dengan RUST_LOG
, karena format tersebut akan menjadi RUST_LOG
setelahnya.
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
dan TOKAY_PARSER_DEBUG
Setel TOKAY_DEBUG
ke tingkat debug antara 1-6. Ini juga dapat dicapai dengan menggunakan tokay -dddd
di mana setiap d
menambah tingkat debug. Selain itu, TOKAY_INSPECT
dapat diatur ke satu atau daftar nama parselet (-prefixes) yang harus diperiksa dalam jejak langkah demi langkah VM ( TOKAY_DEBUG=6
).
Tingkat | Mode |
---|---|
0 | Tidak ada debug |
1 | Cetak AST yang dibuat |
2 | Cetak program perantara akhir |
3 | Cetak program VM yang dikompilasi |
4 | Cetak jejak eksekusi VM |
5 | Cetak konten tumpukan VM |
6 | Debugger opcode komputer virtual |
Lihat AST program yang diurai di tingkat debug 1:
$ cargo run -q -- -d 'x = 42 print("Hello World " + x)' main [start 1:1, end 1:33] sequence [start 1:1, end 1:33] assign_drop [start 1:1, end 1:8] lvalue [start 1:1, end 1:3] identifier [start 1:1, end 1:2] => "x" value_integer [start 1:5, end 1:7] => 42 call [start 1:8, end 1:33] identifier [start 1:8, end 1:13] => "print" callarg [start 1:14, end 1:32] op_binary_add [start 1:14, end 1:32] value_string [start 1:14, end 1:28] => "Hello World " identifier [start 1:31, end 1:32] => "x"
TOKAY_PARSER_DEBUG
menetapkan tingkat debug spesifik untuk parser, yang diimplementasikan di Tokay sendiri dan merupakan bagian dari kompiler. Hanya level > 2 yang dapat dikenali di sini, karena AST parser dimasukkan ke dalam kode.
Inilah aksi debugger VM yang menjalankan program sederhana "Hello World":
`$ TOKAY_INSPECT="__main__" cargo run -q -- 'print("Hello World")'` __main__ --- Code --- __main__ 000 Offset(Offset { offset: 6, row: 1, col: 7 }) __main__ >001 LoadStatic(1) __main__ 002 Offset(Offset { offset: 0, row: 1, col: 1 }) __main__ 003 CallStaticArg((2, 1)) __main__ --- Reader --- __main__ offset=Offset { offset: 0, row: 1, col: 1 } __main__ eof=false __main__ --- Globals --- __main__ --- Stack --- __main__ --- Frames --- __main__ 000 capture: 0, reader: 0, fuse: None __main__ ip = 1 state = Ok(Push([59d29e639f88] "Hello World" (10))) __main__ --- Code --- __main__ 000 Offset(Offset { offset: 6, row: 1, col: 7 }) __main__ 001 LoadStatic(1) __main__ 002 Offset(Offset { offset: 0, row: 1, col: 1 }) __main__ >003 CallStaticArg((2, 1)) __main__ --- Reader --- __main__ offset=Offset { offset: 0, row: 1, col: 1 } __main__ eof=false __main__ --- Globals --- __main__ --- Stack --- __main__ 000 [59d29e639f88] "Hello World" (10) __main__ --- Frames --- __main__ 000 capture: 0, reader: 0, fuse: None Hello World __main__ ip = 3 state = Ok(Push([59d29e498fd8] void (10))) __main__ exit state = Ok(Push([59d29e498fd8] void (10)))
Nama bahasa pemrograman Tokay diambil dari nama tokek Tokay (Gekko gecko) dari Asia, yang meneriakkan "token" di malam hari.
Logo dan ikon Tokay untungnya dirancang oleh Timmytiefkuehl.
Kunjungi juga repositori tokay-artwork untuk berbagai versi logo.
Hak Cipta © 2024 oleh Jan Max Meyer, Teknologi Perangkat Lunak Phorward.
Tokay adalah perangkat lunak gratis di bawah lisensi MIT.
Silakan lihat file LISENSI untuk detailnya.