2 个不稳定版本

0.4.0 2022年10月24日
0.3.0 2022年10月21日
0.1.0 2022年10月21日

#227 in 文本编辑器

Download history 25/week @ 2024-03-12 19/week @ 2024-03-19 63/week @ 2024-03-26 98/week @ 2024-04-02 70/week @ 2024-04-09 31/week @ 2024-04-16 26/week @ 2024-04-23 43/week @ 2024-04-30 16/week @ 2024-05-07 18/week @ 2024-05-14 11/week @ 2024-05-21 41/week @ 2024-05-28 22/week @ 2024-06-04 15/week @ 2024-06-11 10/week @ 2024-06-18 16/week @ 2024-06-25

67 每月下载量
用于 4 crates

MIT 许可证

630KB
21K SLoC

C 20K SLoC JavaScript 455 SLoC // 0.3% comments Rust 31 SLoC // 0.1% comments

tree-sitter-souffle

crates.io

tree-sitter 提供的 Soufflé 语法。

目录

目录

状态

语法相当完整。它解析了 Soufflé 仓库(v2.3)中的 500/503 个测试用例。

存在一些 已知问题

用例

此语法旨在支持以下用例

  • 编辑器集成
    • 代码导航(例如,跳转到定义,显示引用)
    • 语法高亮
  • 评估
  • 代码检查
  • 静态分析

目前并不旨在支持往返打印(即代码格式化和重构)。

C 预处理器

此解析器对解析 C 预处理器 #line 指令支持有限,这可能有助于分析任务。为了避免语法过于复杂,它不处理顶级实体中间的指令(例如,在两个规则连结之间)。您可以配置您的预处理器不发出此类标记(-Pmcpp)。

设计

此语法并不反映 Soufflé C++ 解析器实现的结构或 Soufflé 文档中展示的语法。它相反,试图将非终结符映射到更抽象的类别,即与我们思考语言方式匹配的类别。例如,Soufflé C++ 解析器没有常量非终结符,而此解析器有。作为另一个例子,Soufflé 文档有此类型声明的指定

type_decl ::= '.type' IDENT ("<:" type_name | "=" ( type_name ( "|" type_name )* | record_list | adt_branch ( "|" adt_branch )* ))

此语法则更类似于

type_decl ::= subtype | type_synonym | type_union | record | adt

以便解析树编码了更多的“语义”信息。希望这些选择能使其更容易编写 tree-sitter 查询

出于同样的原因,语法没有将关键字和运算符如 .functoreqrel*:- 作为它们自己的非终结符,而是在语法中内联它们。

开发

测试

运行

tree-sitter test

或等价地

npm test

本脚本下载 Soufflé、ddisasm、cclyzer++ 以及其他仓库,并尝试解析它们的 Datalog 文件。

./scripts/parse-examples

参考

发布

  1. 更新 CHANGELOG.md
  2. 更新 Cargo.toml 中的版本号
  3. gitcheckout main && gitpull origin && gittag -avX.Y.Z -mvX.Y.Z && gitpush --tags
  4. cargopublish
  5. 发布 CI 创建的预发布版本

依赖

~2.8–4MB
~72K SLoC