circom_lsp_program_structure/abstract_syntax_tree/
expression_builders.rs1use 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}