1 个不稳定版本

0.1.0 2023年6月3日

#119#printing

GPL-2.0 许可证

42KB
914 代码行

Tangibl

Build

此项目仍在开发中,可能会出现故障。

这是 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 方法模式。原因有两个

  1. Rust 枚举类型是代数和类型,因此 match 语句必须包含所有可能的值。
  2. 与经典 OOP 方法相比,难以推理所有权和类型规则,这使得它似乎不适合 Rust。您可以自由地使用您选择的任何语言实现 JSON 解析器和自定义访问者。

期待

需要为 Tangibl 被使用的每种语言创建单独的接口来消费动态 C 库。这应该是最小的工作量,因为前端只需将最终的 JSON 表示形式解析成可用的节点树。然而,Rust 实现可以直接从这个源中获取 AST,并跳过此步骤。

依赖项

~5–13MB
~153K SLoC