6 个版本
0.3.1 | 2020 年 9 月 8 日 |
---|---|
0.3.0 | 2020 年 9 月 5 日 |
0.1.3 | 2020 年 5 月 1 日 |
0.1.2 | 2018 年 12 月 30 日 |
在 #s-expression 中排名 #3
24KB
505 行(不包括注释)
基本用法
这是一个用 Rust 编写的简单 s-表达式解析器。
你可能想用这个库做这些事情
- 将程序文本表示转换为简单的 s-表达式(见解析器部分)
- 使用 s-expressions 进行一些语法转换(可选)
- 执行程序或以某种方式显示文档
- 直接解释简单的 s-表达式
- 转换为已可执行的格式(llvm、汇编、字节码、C、html)
- 在执行上述任何操作之前,将这些转换为一个其他格式(AST、类型化 s-表达式)
解析内容的格式
一个简单的 s-表达式由符号组成,这些符号可以是符号或其他符号的列表。
符号基本上就是一个字符串。列表可以表示更复杂的表达式。没有不同类型的表示,但你可以使用前缀符号((''string':hello'
,(''int':1'
)。确切的表示和其意义由用户决定。它适用于纯数据(代替 json/xml 等)、可解释代码、在编译时将代码转换为 Rust 以及更多。
这些表达式只是内部表示,可用于简单的结构转换。
解析器
文本解析基于读取宏,类似于 Common Lisp 中的工作方式。
对于大多数常见用例,如解析字符串、列表和注释,有一些预定义的宏字符,但你也可以定义自己的解析器(只需复制一个现有的并修改它)。建议从 DelimitedListParser
开始解析。请查看测试中的示例(math.rs
)。
一般来说,解析器会解析符号,直到遇到宏字符。宏字符绑定到解析器,可以调用。解析器完成后,它将控制权交回给之前的解析器以解析文件的其余部分。
与 Common Lisp 版本不同,解析器可以访问解析的标记的本地列表,这使得它非常灵活。这样,甚至可以为解析器添加中缀运算符。
解析格式甚至可能看起来与典型的s表达式非常不同。
依赖关系
~2MB
~46K SLoC