#swift #parser #incremental #programming-language

experimental-tree-sitter-swift

tree-sitter 解析库的 Swift 语法

3 个版本

0.0.3 2022年1月14日
0.0.2 2022年1月4日
0.0.1 2022年1月2日

#297 in 文本编辑器

MIT 许可证

18MB
497K SLoC

C 495K SLoC // 0.0% comments TypeScript 2K SLoC // 0.0% comments Scheme 118 SLoC // 0.1% comments Rust 46 SLoC // 0.1% comments

Parse rate badge Crates.io badge NPM badge Build

experimental-tree-sitter-swift

此内容包含 Swift 编程语言的实验性 tree-sitter 语法。

入门

要使用此解析器解析 Swift 代码,您需要依赖 Rust 包或 NPM 包。

Rust

要使用 Rust 包,您需要在您的 Cargo.toml 中添加以下内容

tree-sitter = "0.20.0"
experimental-tree-sitter-swift = "=0.0.3"

然后您可以使用这里声明的语言使用 tree-sitter 解析器

let mut parser = tree_sitter::Parser::new();
parser.set_language(experimental_tree_sitter_swift::language())?;

// ...

let tree = parser.parse(&my_source_code, None)
    .ok_or_else(|| /* error handling code */)?;

JavaScript

要从 NPM 使用此功能,您需要将类似的依赖项添加到 package.json

"dependencies: {
  "experimental-tree-sitter-swift": "0.0.3",
  "tree-sitter": "^0.20.0"
}

您的使用方法将类似于以下内容

const Parser = require("tree-sitter");
const Swift = require("experimental-tree-sitter-swift");

const parser = new Parser();
parser.setLanguage(Swift);

// ...

const tree = parser.parse(mySourceCode);

编辑语法

使用此包后,编辑语法的常见工作流程将类似于以下内容

  1. 修改 grammar.ts
  2. 运行 npm install && npm test 来查看更改是否对现有的解析行为有影响。默认的 npm test 目标需要安装 valgrind;如果您没有安装,并且不想安装,您可以直接使用 tree-sitter test
  3. 在某个实际的 Swift 代码库上运行 tree-sitter parse 并查看是否(或在哪里)失败。
  4. 使用任何失败情况来创建新的语料库测试案例。

如果您只想 使用 解析器而不是修改它,您可以使用 rust 绑定 README 中的说明从 Rust 代码中依赖它。基本上,您需要在构建脚本中构建 parser.cscanner.c,并使用生成的文件来生成一个绑定可以与之交互的解析器。我不打算在处于 实验性 状态时将其作为包发布。

贡献

如果您想对这个解析器进行修改,并且修改是净正向的,请提交一个拉取请求。我主要创建这个解析器是为了学习如何使用 tree-sitter 以及如何编写语法,所以欢迎改进。如果您对这个解析器有问题,请提交一个错误报告,并在 语料库 中包含一个测试用例。我无法保证任何级别的支持,但拥有测试用例会使我更有可能对其进行修改。

常见问题

难道没有现成的 Swift 语法吗?为什么还要创建另一个呢?

确实有一个 Swift 语法存在于 tree-sitter 组织下,但它没有 LICENSE 文件。由于它未获得许可,我必须小心使用它。实际上,我还没有看过代码本身或整个存储库,因为我想要避免与这个解析器相关的潜在许可问题。对 Github 问题的简要浏览显示,它也不太完整,但我还没有深入研究以确定它是否比这个更完整。

我创建这个解析器是为了学习如何使用 tree-sitter。观察当前环境,似乎这对其他人可能也有用,所以我决定发布它。由于这个有许可,似乎是一个很好的前进道路,供与我需求相似的人使用。

如果这不是现有 Swift 语法的分支,它是基于什么的?

许多特定功能是基于 Kotlin 语言语法 的,因为这两种语言有很多外观相似之处。例如,两种语言都有尾随闭包语法。一些部分也来自 Rust 语法,这个语法可能应该复制更多。

为什么这个 实验性?它有什么实验性?

这是一个需要回答的问题。如果这个语法不被广泛使用,它可能永远都是实验性的。如果有兴趣,希望其他人愿意帮助定义如何才能使这个语法不再是“实验性的”。达到我们可以提供一些稳定性保证的阶段可能是一个好的第一步。

您提供哪些稳定性保证?

目前没有。似乎明智的做法是,将来语法将进行版本控制,任何节点删除或更改都应被视为重大更改,并伴随着主版本号的提升。目前,除非您锁定确切的提交哈希,否则这不是寻求稳定性的地方。

您的 parser.c 在哪里?

这个存储库目前省略了构建过程中自动生成的大部分代码。这意味着,例如,grammar.jsonparser.c 只在构建后可用。这也显著减少了差异中的噪音。

不检查 parser.c 的附带好处是,您可以保证向后兼容性。由 tree-sitter CLI 生成的解析器并不总是向后兼容。如果您需要解析器,请使用 CLI 自己生成;所有相关信息都包含在这个包中。通过这样做,您也可以确信您的解析器版本和库版本是兼容的。

如果您需要 parser.c,并且您不关心 tree-sitter 版本,但没有本地设置可以获取解析器,您可以从这个包中最近的工作流程运行中下载一个。要这样做

  • 访问此存储库的 GitHub actions 页面
  • 点击适当的提交的 "Check grammar and style" 动作。
  • 转到 Artifacts 并点击 generated-parser-src。所有相关的解析器文件都将出现在您的下载中。

依赖项

约2.7-4MB
约72K SLoC