1 个不稳定版本
0.1.0 | 2023年6月3日 |
---|
#119 在 #printing
42KB
914 代码行
Tangibl
此项目仍在开发中,可能会出现故障。
这是 Tangibl 核心库。此源代码最初是用 Java 编写的,但已被重写为 Rust,以便生成动态 C 库、WASM 等。
示例
use topcodes::TopCode;
use tangibl::JsonPrinter;
// Scan or generate your TopCodes.
let topcodes: Vec<TopCode> = ...;
// Parse codes in Tangibl abstract syntax tree.
let ast: Option<Start> = tangibl::parse(&topcodes);
// Create a visitor for printing JSON.
let mut json_printer = JsonPrinter::new();
println!("{}", json_printer.print(&ast));
该库还包含一个 JSON 打印器和基于 AST 形状执行操作的访问者抽象。点击这里了解 Tangibl 语法概述。
访问者中使用枚举的动机
访问者使用基于枚举的匹配,而不是在面向对象语言中更常用的 accept/visit 方法模式。原因有两个
- Rust 枚举类型是代数和类型,因此 match 语句必须包含所有可能的值。
- 与经典 OOP 方法相比,难以推理所有权和类型规则,这使得它似乎不适合 Rust。您可以自由地使用您选择的任何语言实现 JSON 解析器和自定义访问者。
期待
需要为 Tangibl 被使用的每种语言创建单独的接口来消费动态 C 库。这应该是最小的工作量,因为前端只需将最终的 JSON 表示形式解析成可用的节点树。然而,Rust 实现可以直接从这个源中获取 AST,并跳过此步骤。
依赖项
~5–13MB
~153K SLoC