circom_lsp_program_structure/abstract_syntax_tree/
expression_builders.rs

1use super::ast::*;
2use num_bigint::BigInt;
3use Expression::*;
4
5pub fn build_infix(
6    meta: Meta,
7    lhe: Expression,
8    infix_op: ExpressionInfixOpcode,
9    rhe: Expression,
10) -> Expression {
11    InfixOp { meta, infix_op, lhe: Box::new(lhe), rhe: Box::new(rhe) }
12}
13
14pub fn build_prefix(meta: Meta, prefix_op: ExpressionPrefixOpcode, rhe: Expression) -> Expression {
15    PrefixOp { meta, prefix_op, rhe: Box::new(rhe) }
16}
17
18pub fn build_inline_switch_op(
19    meta: Meta,
20    cond: Expression,
21    if_true: Expression,
22    if_false: Expression,
23) -> Expression {
24    InlineSwitchOp {
25        meta,
26        cond: Box::new(cond),
27        if_true: Box::new(if_true),
28        if_false: Box::new(if_false),
29    }
30}
31
32pub fn build_parallel_op(
33    meta: Meta,
34    rhe: Expression,
35)-> Expression {
36    ParallelOp{
37        meta,
38        rhe: Box::new(rhe),
39    }
40}
41
42pub fn build_variable(meta: Meta, name: String, access: Vec<Access>) -> Expression {
43    Variable { meta, name, access }
44}
45
46pub fn build_number(meta: Meta, value: BigInt) -> Expression {
47    Expression::Number(meta, value)
48}
49
50pub fn build_call(meta: Meta, id: String, args: Vec<Expression>) -> Expression {
51    Call { meta, id, args }
52}
53
54pub fn build_anonymous_component(meta: Meta, id: String, params: Vec<Expression>, signals: Vec<Expression>, names: Option<Vec<(AssignOp, String)>>, is_parallel: bool) -> Expression {
55    AnonymousComp { meta, id, params, signals, names, is_parallel }
56}
57pub fn build_array_in_line(meta: Meta, values: Vec<Expression>) -> Expression {
58    ArrayInLine { meta, values }
59}
60
61pub fn build_tuple(meta: Meta, values: Vec<Expression>) -> Expression {
62    Tuple { meta, values }
63}
64
65pub fn build_uniform_array(meta: Meta, value: Expression, dimension: Expression) -> Expression {
66    UniformArray { meta, value: Box::new(value), dimension: Box::new(dimension) }
67}
68
69pub fn unzip_3(vec : Vec<(String,AssignOp,Expression)>) -> (Vec<(AssignOp,String)>, Vec<Expression>){
70    let mut op_name = Vec::new();
71    let mut exprs = Vec::new();
72    for i in vec{
73        op_name.push((i.1,i.0));
74        exprs.push(i.2);
75    }
76    (op_name, exprs)
77}