3 个版本 (重大变更)
0.3.0 | 2023 年 7 月 12 日 |
---|---|
0.2.0 | 2023 年 2 月 23 日 |
0.1.0 | 2022 年 11 月 10 日 |
#4 in #air
52 每月下载量
用于 4 个 仓库(其中 2 个直接使用)
610KB
14K SLoC
解析器
此软件包包含 AirScript 的解析器。
解析器的作用是将用人类友好的 AirScript 语言编写的约束解析成抽象语法树(AST)。
生成抽象语法树(AST)
解析器使用 Logos 生成自定义词法分析器,然后将它输入到由 LALRPOP 生成的解析器中。
要从给定的 AirScript 模块创建 AST,将源代码传递给公开的 parse
函数,该函数将返回 AST 或类型为 ScanError
或 ParseError
的 Error
。
parse
函数首先使用词法分析器对源代码进行标记,然后将结果标记映射到解析器接受的标记,这些标记的类型为 (usize, Token, usize)
。每个无效标记都将存储为 ScanError
。最后,如果没有发生 ScanError
,则 parse
将标记传递给解析器以生成相应的 AST(或 ParseError
)的结果。
示例用法
// parse the source string to a Result containing the AST or an Error
let ast = parse(source.as_str());
AST
AirScript AST (Source
) 包含一个 SourceSection
向量,每个 SourceSection
都包含解析 AirScript 模块中一个部分的结果。
SourceSection
类型包括:
AirDef
,它包含 AIR 的名称。Constant
,它包含用于编写约束的命名常量。Trace
,包含主和辅助执行跟踪的解析跟踪列信息。每个列或列组都通过其标识符表示,可以在约束中使用此标识符进行访问。这些列也可以使用内置变量$main[idx]
和$aux[idx]
进行访问,其中idx
是跟踪中列的索引。PublicInputs
,它是一个包含模块中定义的所有公共输入的向量。每个公共输入都通过其标识符和固定大小表示。PeriodicColumns
,它是一个包含模块中定义的所有周期性列的向量。每个周期性列都通过其标识符和一个包含其重复(周期性)值模式的向量表示。RandomValues
,它是一个包含验证器提供的所有随机值的向量。每个随机值或随机值组都通过其标识符表示,并可以使用此标识符在约束中访问。这些随机值也可以使用$rand[idx]
进行访问,其中rand
是随机值数组的名称,而idx
是该数组中随机值的索引。BoundaryConstraints
,它包含一个BoundaryStmt
语句的向量,每个语句可以是边界约束或中间变量。每个边界约束都表示为表达式树。变量可以是包含表达式树的标量、向量或矩阵。IntegrityConstraints
,它包含一个IntegrityStmt
语句的向量,每个语句可以是完整性约束或中间变量。每个完整性约束都表示为表达式树。变量可以是标量、向量或包含表达式树的矩阵。
依赖项
~7-16MB
~193K SLoC