prune_lang/block/
ast.rs

1use super::*;
2
3use std::fmt;
4
5#[derive(Clone, Debug)]
6pub struct Block {
7    pub blk_pred: Ident,
8    pub blk_idx: usize,
9    pub min_depth: usize,
10    pub eqs: Vec<(TermId, TermId)>,
11    pub prims: Vec<(Prim, Vec<AtomId>)>,
12    pub brchss: Vec<Vec<usize>>,
13    pub calls: Vec<(Ident, Vec<TermId>)>,
14}
15
16impl fmt::Display for Block {
17    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {
18        writeln!(
19            f,
20            "block {}.{} {{{}}}:",
21            self.blk_pred, self.blk_idx, self.min_depth
22        )?;
23
24        for (var, atom) in self.eqs.iter() {
25            writeln!(f, "    {} = {}; ", var, atom)?;
26        }
27
28        for (prim, args) in self.prims.iter() {
29            let args = args.iter().format(", ");
30            writeln!(f, "    {:?}({})", prim, args)?;
31        }
32
33        if !self.brchss.is_empty() {
34            writeln!(f, "    brch {:?}", self.brchss)?;
35        }
36
37        for (pred, args) in self.calls.iter() {
38            let args = args.iter().format(", ");
39            writeln!(f, "    call {}({})", pred, args)?;
40        }
41        Ok(())
42    }
43}
44
45impl Default for Block {
46    fn default() -> Self {
47        Self::new()
48    }
49}
50
51impl Block {
52    pub fn new() -> Block {
53        Block {
54            blk_pred: Ident::dummy(&"?"),
55            blk_idx: 0,
56            min_depth: 0,
57            eqs: Vec::new(),
58            prims: Vec::new(),
59            brchss: Vec::new(),
60            calls: Vec::new(),
61        }
62    }
63}
64
65#[derive(Clone, Debug)]
66pub struct PredDef {
67    pub name: Ident,
68    pub pars: Vec<(Ident, TypeId)>,
69    pub vars: Vec<(Ident, TypeId)>,
70    pub blks: Vec<Block>,
71}
72impl std::fmt::Display for PredDef {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        writeln!(f, "define {}:", self.name)?;
75
76        for (par, par_ty) in self.pars.iter() {
77            writeln!(f, "par {par}: {par_ty}")?;
78        }
79
80        for (var, var_ty) in self.vars.iter() {
81            writeln!(f, "var {var}: {var_ty}")?;
82        }
83
84        for blk in self.blks.iter() {
85            write!(f, "{blk}")?;
86        }
87        Ok(())
88    }
89}
90
91#[derive(Clone, Debug)]
92pub struct Program {
93    pub ty_map: HashMap<Ident, TypeId>,
94    pub preds: HashMap<Ident, PredDef>,
95    pub querys: Vec<crate::logic::ast::QueryDecl>,
96}