#swift #parser #incremental #programming-language

npezza93-tree-sitter-swift

tree-sitter 解析库的 Swift 语法

1 个不稳定版本

0.4.4 2024年4月18日

#213文本编辑器


ttags 中使用

MIT 许可协议

33MB
1M SLoC

C 1M SLoC // 0.0% comments Scheme 291 SLoC // 0.1% comments Rust 51 SLoC

Parse rate badge Crates.io badge NPM badge Build

tree-sitter-swift

包含 Swift 编程语言的 tree-sitter 语法。

入门

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

Rust

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

tree-sitter = "0.20.4"
tree-sitter-swift = "=0.4.3"

然后,您可以使用此处声明的语言使用 tree-sitter 解析器

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

// ...

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

JavaScript

要从 NPM 使用此内容,您需要在 package.json 中添加类似的依赖项

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

解析器的使用方式如下

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

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

// ...

const tree = parser.parse(mySourceCode);

编辑语法

使用此包进行 checkout 的常见工作流程将类似于

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

贡献

欢迎所有对本存储库的贡献。

如果所述贡献是将生成的文件(例如,parser.c)检入存储库,请注意,您的贡献将不会被接受。请确保阅读常见问题解答条目、之前的讨论妥协,这些都是在该主题上已经发生的。

在 Web Assembly 中使用 tree-sitter-swift

要使用 tree-sitter-swift 作为 web 绑定版本 tree-sitter 的语言,这可能会比已发布的 node 模块更现代。请参阅以下说明

  1. 安装节点模块 npm install web-tree-sitter tree-sitter-swift
  2. 运行 tree-sitter 命令行工具以创建 wasm 包
    $ npx tree-sitter build-asm ./node_modules/tree-sitter
    
  3. 以此方式启动 tree-sitter wasm。
const Parser = require("web-tree-sitter");
async function run() {
  //needs to happen first
  await Parser.init();
  //wait for the load of swift
  const Swift = await Parser.Language.load("./tree-sitter-swift.wasm");

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

  //Parse your swift code here.
  const tree = parser.parse('print("Hello, World!")');
}
//if you want to run this
run().then(console.log, console.error);

常见问题解答

你的 parser.c 在哪里?

该仓库目前省略了构建过程中生成的大部分代码。这意味着,例如,grammar.jsonparser.c都只能在构建后使用。这也大大减少了差异比较时的噪音。

不提交parser.c的副作用是你可以保证向下兼容。由tree-sitter CLI生成的解析器并不总是向下兼容。如果你需要一个解析器,请使用CLI自己生成;所有相关信息都包含在这个包中。通过这样做,你还可以确保你的解析器版本和库版本是兼容的。

如果你需要一个parser.c,并且你不在乎tree-sitter的版本,但你没有本地设置可以让你获取解析器,你可以从这个包中的一个最近的workflows运行中下载一个。要这样做

  • 访问这个仓库的GitHub actions页面
  • 单击“发布grammar.jsonparser.c”操作对应的提交。
  • 下滑到Artifacts并单击generated-parser-src。所有相关的解析器文件都将可供下载。

依赖关系

~2.8–4MB
~72K SLoC