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 许可下的免费软件。
有关详细信息,请参阅许可证文件。