3 个版本
0.0.3 | 2022年1月14日 |
---|---|
0.0.2 | 2022年1月4日 |
0.0.1 | 2022年1月2日 |
#297 in 文本编辑器
18MB
497K SLoC
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);
编辑语法
使用此包后,编辑语法的常见工作流程将类似于以下内容
- 修改
grammar.ts
。 - 运行
npm install && npm test
来查看更改是否对现有的解析行为有影响。默认的npm test
目标需要安装valgrind
;如果您没有安装,并且不想安装,您可以直接使用tree-sitter test
。 - 在某个实际的 Swift 代码库上运行
tree-sitter parse
并查看是否(或在哪里)失败。 - 使用任何失败情况来创建新的语料库测试案例。
如果您只想 使用 解析器而不是修改它,您可以使用 rust 绑定 README 中的说明从 Rust 代码中依赖它。基本上,您需要在构建脚本中构建 parser.c
和 scanner.c
,并使用生成的文件来生成一个绑定可以与之交互的解析器。我不打算在处于 实验性
状态时将其作为包发布。
贡献
如果您想对这个解析器进行修改,并且修改是净正向的,请提交一个拉取请求。我主要创建这个解析器是为了学习如何使用 tree-sitter
以及如何编写语法,所以欢迎改进。如果您对这个解析器有问题,请提交一个错误报告,并在 语料库
中包含一个测试用例。我无法保证任何级别的支持,但拥有测试用例会使我更有可能对其进行修改。
常见问题
难道没有现成的 Swift 语法吗?为什么还要创建另一个呢?
确实有一个 Swift 语法存在于 tree-sitter
组织下,但它没有 LICENSE
文件。由于它未获得许可,我必须小心使用它。实际上,我还没有看过代码本身或整个存储库,因为我想要避免与这个解析器相关的潜在许可问题。对 Github 问题的简要浏览显示,它也不太完整,但我还没有深入研究以确定它是否比这个更完整。
我创建这个解析器是为了学习如何使用 tree-sitter。观察当前环境,似乎这对其他人可能也有用,所以我决定发布它。由于这个有许可,似乎是一个很好的前进道路,供与我需求相似的人使用。
如果这不是现有 Swift 语法的分支,它是基于什么的?
许多特定功能是基于 Kotlin 语言语法 的,因为这两种语言有很多外观相似之处。例如,两种语言都有尾随闭包语法。一些部分也来自 Rust 语法,这个语法可能应该复制更多。
为什么这个 实验性
?它有什么实验性?
这是一个需要回答的问题。如果这个语法不被广泛使用,它可能永远都是实验性的。如果有兴趣,希望其他人愿意帮助定义如何才能使这个语法不再是“实验性的”。达到我们可以提供一些稳定性保证的阶段可能是一个好的第一步。
您提供哪些稳定性保证?
目前没有。似乎明智的做法是,将来语法将进行版本控制,任何节点删除或更改都应被视为重大更改,并伴随着主版本号的提升。目前,除非您锁定确切的提交哈希,否则这不是寻求稳定性的地方。
您的 parser.c
在哪里?
这个存储库目前省略了构建过程中自动生成的大部分代码。这意味着,例如,grammar.json
和 parser.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