#约束 #提取 #系统 #解析 #局部 #规则 #chr

nightly bin+lib rem-constraint

Rusty 提取大师工具

1 个不稳定版本

0.1.0 2023年4月25日

#27 in #约束


用于 rem-borrower

MIT 许可证

110KB
2.5K SLoC

基于CHR的约束系统

此子模块实现了一组基于CHR的约束系统,以及一个用于使用约束抽象Rust ASTs的通用框架。

概述

此模块的用户界面通过以下两个主要元素来捕捉:

  • LocalConstraint - 你的自定义约束应实现的特质
    /// Abstract encoding of a Local Constraint
    pub trait LocalConstraint : Any + Display + Clone {
    
        /// static CHR rules for the constraint system
        const CHR_RULES: &'static str;
    
    
        /// parse a single constraint rule
        fn parse(s: &str) -> nom::IResult<&str, Self>;
    
        /// Collect CHR rules from a function definition
        fn collect<'a>(fun: &Annotated<'a, syn::ItemFn>) -> Vec<Self>;
    }
    
  • ConstraintManager - 用于表示一组约束系统,封装了运行每个单独约束的过程
    let mut constraint_manager : ConstraintManager = Default::default();
    constraint_manager.add_constraint::<ArrayConstraint>();
    constraint_manager.add_constraint::<MutabilityConstraint>();
    
    // ...
    constraint_manager.analyze(fun);
    
    // ..
    let arr_constraints : Vec<ArrayConstraint> = constraint_manager.get_constraints::<ArrayConstraint>();
    let mut_constraints : Vec<MutabilityConstraint> = constraint_manager.get_constraints::<MutabilityConstraint>();
    

项目结构

./src/
├── constraint.rs
├── annotation.rs
├── chr.rs
├── common.rs
└── lib.rs

1 directory, 10 files

子组件由以下模块组成:

  • constraint.rs -- 定义了核心通用约束集合框架
  • annotation.rs -- 定义了一个用于标记 syn ASTs 的访问者
  • chr.rs -- 定义了一个围绕 SwiPL 的包装器,用于在一系列约束上运行 CHR 规则
  • common.rs -- 定义了用于可变性和数组的几个约束系统实例化

解析器应移至 utils,特定于约束的部分应移至 common Solver 应移至 rewrite

依赖关系

~6–14MB
~179K SLoC