2 个不稳定版本
0.4.0 | 2022年10月24日 |
---|---|
0.3.0 | 2022年10月21日 |
0.1.0 |
|
#227 in 文本编辑器
67 每月下载量
用于 4 crates
630KB
21K SLoC
tree-sitter-souffle
为 tree-sitter 提供的 Soufflé 语法。
目录
目录
状态
语法相当完整。它解析了 Soufflé 仓库(v2.3)中的 500/503 个测试用例。
- ddisasm
- Soufflé 基准测试
- Soufflé 基准测试
存在一些 已知问题。
用例
此语法旨在支持以下用例
- 编辑器集成
- 代码导航(例如,跳转到定义,显示引用)
- 语法高亮
- 评估
- 代码检查
- 静态分析
目前并不旨在支持往返打印(即代码格式化和重构)。
C 预处理器
此解析器对解析 C 预处理器 #line
指令支持有限,这可能有助于分析任务。为了避免语法过于复杂,它不处理顶级实体中间的指令(例如,在两个规则连结之间)。您可以配置您的预处理器不发出此类标记(-P
对 mcpp
)。
设计
此语法并不反映 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 查询。
出于同样的原因,语法没有将关键字和运算符如 .functor
,eqrel
,*
和 :-
作为它们自己的非终结符,而是在语法中内联它们。
开发
测试
运行
tree-sitter test
或等价地
npm test
本脚本下载 Soufflé、ddisasm、cclyzer++ 以及其他仓库,并尝试解析它们的 Datalog 文件。
./scripts/parse-examples
参考
发布
- 更新
CHANGELOG.md
- 更新
Cargo.toml
中的版本号 gitcheckout main && gitpull origin && gittag -avX.Y.Z -mvX.Y.Z && gitpush --tags
cargopublish
- 发布 CI 创建的预发布版本
依赖
~2.8–4MB
~72K SLoC