Tokay 是一種專為即席解析而設計的程式語言。
重要的
Tokay 正在開發中,尚未考慮用於生產用途。成為 Tokay 持續發展的一部分並做出貢獻!
Tokay 旨在成為一種可用於快速實現文字處理問題解決方案的程式語言。這可能涉及簡單的資料擷取,也可能涉及語法結構或其部分的解析,以及將資訊轉換為結構化解析樹或抽象語法樹以供進一步處理。
因此,Tokay 不僅成為匹配器或識別器等簡單單行程式的實用工具,而且成為可用於實作程式碼分析器、重構工具、解釋器、編譯器或轉譯器的語言。實際上Tokay自己的語言解析器是在Tokay本身中實現的。
Tokay 受到 awk 的啟發,具有 Python 和 Rust 的語法和語義風格,但也遵循自己的哲學、想法和設計原則。因此,Tokay 不能與其他語言或項目直接比較,而是獨立的。這是一種全新的程式語言。
Tokay 仍然是一個非常年輕的項目,而且潛力巨大。歡迎志工!
透過使用Rusts依賴管理器和建置工具cargo
,只需安裝Tokay即可
$ cargo install tokay
對於基於 Arch Linux 的發行版,Arch Linux AUR 中還有一個tokay
和tokay-git
軟體。
Tokay 版本的「Hello World」非常明顯。
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay 還可以向任何輸入到它的世界打招呼。下一個程式列印“Hello Venus”、“Hello Earth”或“Hello”,後面跟著先前由內建Word
令牌解析的任何其他名稱。除單字以外的任何其他輸入都會自動省略。
print("Hello", Word)
$ tokay 'print("Hello", Word)' -- "World 1337 Venus Mars 42 Max" Hello World Hello Venus Hello Mars Hello Max
一個用於計算單字和數字並隨後列印總數的簡單程式可以這樣實現:
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
按照設計,Tokay 會自動根據使用的資訊建立語法樹。
下一個程式實作簡單數學表達式的解析器和解釋器,例如1 + 2 + 3
或7 * (8 + 2) / 5
。隨後列印每個表達式的結果。
處理直接和間接左遞歸而不以無限循環結束是 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 ...
從解析的整數計算斐波那契數:
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
Tokay 首頁 tokay.dev 提供了快速入門和文件的連結。文檔原始碼維護在單獨的儲存庫中。
對於調試,有兩種方法可供使用。
log
-crate 進行跟踪對於 Rust 標準跟踪,請使用env_logger
工具。完整追蹤僅編譯為偵錯可執行文件,發布版本僅提供警告等級及以上等級。
$ RUST_LOG=tokay=debug tokay
或者,可以透過設定TOKAY_LOG
來啟動__main__
程式的追蹤。這用於在內部解析器已經編譯和執行並解析實際程式時開始追蹤。 TOKAY_LOG
可以設定為任何RUST_LOG
相容格式,因為它會立即變成RUST_LOG
。
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
和TOKAY_PARSER_DEBUG
的內建 AST 和 VM 偵錯器將TOKAY_DEBUG
設定為 1-6 之間的偵錯等級。這也可以使用tokay -dddd
來實現,其中每個d
都會增加調試等級。此外, TOKAY_INSPECT
可以設定為一個或一系列解析器名稱(-前綴),應在 VM 逐步追蹤中檢查( TOKAY_DEBUG=6
)。
等級 | 模式 |
---|---|
0 | 沒有調試 |
1 | 列印構建的 AST |
2 | 列印最終中間程序 |
3 | 列印編譯後的VM程序 |
4 | 列印VM執行追蹤 |
5 | 列印VM堆疊內容 |
6 | VM操作碼調試器 |
查看調試等級 1 中程式的已解析 AST:
$ 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
設定解析器的特定偵錯級別,該級別在 Tokay 本身中實現,是編譯器的一部分。這裡只能辨識 > 2 級,因為解析器的 AST 是內建在程式碼中。
這是正在運行的簡單「Hello World」程式的 VM 偵錯器:
`$ 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)))
Tokay程式語言以來自亞洲的託卡壁虎(Gekko gecko)命名,它在黑夜中喊出「代幣」。
值得慶幸的是,Tokay 標誌和圖示是由 Timmytiefkuehl 設計的。
也可以查看 tokay-artwork 儲存庫以取得不同版本的標誌。
版權所有 © 2024,Phorward Software Technologies 公司的 Jan Max Meyer。
Tokay 是 MIT 許可下的免費軟體。
有關詳細信息,請參閱許可證文件。