3 个版本 (重大变更)

0.3.0 2023 年 7 月 12 日
0.2.0 2023 年 2 月 23 日
0.1.0 2022 年 11 月 10 日

#4 in #air

Download history 7/week @ 2024-04-18 8/week @ 2024-04-25 4/week @ 2024-05-02 4/week @ 2024-05-09 9/week @ 2024-05-16 10/week @ 2024-05-23 6/week @ 2024-05-30 10/week @ 2024-06-06 7/week @ 2024-06-13 9/week @ 2024-06-20 4/week @ 2024-06-27 2/week @ 2024-07-04 4/week @ 2024-07-11 6/week @ 2024-07-18 27/week @ 2024-07-25 14/week @ 2024-08-01

52 每月下载量
用于 4 仓库(其中 2 个直接使用)

MIT 许可证

610KB
14K SLoC

解析器

此软件包包含 AirScript 的解析器。

解析器的作用是将用人类友好的 AirScript 语言编写的约束解析成抽象语法树(AST)。

生成抽象语法树(AST)

解析器使用 Logos 生成自定义词法分析器,然后将它输入到由 LALRPOP 生成的解析器中。

要从给定的 AirScript 模块创建 AST,将源代码传递给公开的 parse 函数,该函数将返回 AST 或类型为 ScanErrorParseErrorError

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