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

MIT/Apache

24KB
505 行(不包括注释)

基本用法

这是一个用 Rust 编写的简单 s-表达式解析器。

你可能想用这个库做这些事情

  1. 将程序文本表示转换为简单的 s-表达式(见解析器部分)
  2. 使用 s-expressions 进行一些语法转换(可选)
  3. 执行程序或以某种方式显示文档
    • 直接解释简单的 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