=====================================
Variable Declaration With Unary Expression
=====================================
template test(){
  var tmp = -1;
  var tmp = ~1;
  var tmp = +1;
  var tmp = !1;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (unary_expression
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (unary_expression
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (unary_expression
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (unary_expression
              (int_literal))))))
=====================================
Variable Declaration With Binary Expression
=====================================
template test(){
  var tmp = 2 + 2;
  var tmp = 2 & 2;
  var tmp = 2 && 2;
  var tmp = 2 | 2;
  var tmp = 2 || 2;
  var tmp = 2 >> 2;
  var tmp = 2 << 2;
  var tmp = 2 ^ 2;
  var tmp = 2 - 2;
  var tmp = 2 * 2;
  var tmp = 2 / 2;
  var tmp = 2 \ 2;
  var tmp = 2 % 2;
  var tmp = 2**2;
  var tmp = 2 < 2;
  var tmp = 2 > 2;
  var tmp = 2 <= 2;
  var tmp = 2 >= 2;
  var tmp = 2 == 2;
  var tmp = 2 != 2;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal)))
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (int_literal)
              (int_literal))))))
=====================================
Variable Declaration With Ternary Expression
=====================================
template test(){
  var tmp = 1 ? 5 > 3 : 0;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (ternary_expression
              (int_literal)
              (binary_expression
                (int_literal)
                (int_literal))
              (int_literal))))))
=====================================
Variable Declaration With Member Expression
=====================================
template qwer(){
  var tmp = qwer.in;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (member_expression
              (identifier)
              (property_identifier))))))
=====================================
Variable Declaration With Array Access Expression
=====================================
template test(){
  var tmp = qwer[0];
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (array_access_expression
              (identifier)
              (int_literal))))))
=====================================
Variable Declaration With Member Array Access Expression
=====================================
template test(){
  var tmp = qwer.in[0];
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (array_access_expression
              (member_expression
                (identifier)
                (property_identifier))
              (int_literal))))))
=====================================
Variable Declaration With Member Double Array Access Expression
=====================================
template test(N){
  var tmp = qwer.in[0][N];
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list
          (parameter
            (identifier)))
        (template_body
          (variable_declaration_statement
            (identifier)
            (array_access_expression
              (array_access_expression
                (member_expression
                  (identifier)
                  (property_identifier))
                (int_literal))
              (identifier))))))
=====================================
Variable Declaration With parenthesized Expression
=====================================
template test(){
  var tmp = (2 + 2);
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (parenthesized_expression
              (binary_expression
                (int_literal)
                (int_literal)))))))
=====================================
Variable Declaration With Complex Expression
=====================================
template test(){
  var tmp = ((2 + 2) * t.in + 1 % q.in[0]) << 2;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (binary_expression
              (parenthesized_expression
                (array_access_expression
                  (member_expression
                    (binary_expression
                      (member_expression
                        (binary_expression
                          (parenthesized_expression
                            (binary_expression
                              (int_literal)
                              (int_literal)))
                          (identifier))
                        (property_identifier))
                      (binary_expression
                        (int_literal)
                        (identifier)))
                    (property_identifier))
                  (int_literal)))
              (int_literal))))))
=====================================
Variable Declaration With Function call Expression
=====================================
template test(){
  var tmp = A();
  var tmp2 = A(1);
  var tmp3 = A(qwe.in, 2 + 10);
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (variable_declaration_statement
            (identifier)
            (call_expression
              (identifier)))
          (variable_declaration_statement
            (identifier)
            (call_expression
              (identifier)
              (argument_list
                (int_literal))))
          (variable_declaration_statement
            (identifier)
            (call_expression
              (identifier)
              (argument_list
                (member_expression
                  (identifier)
                  (property_identifier))
                (binary_expression
                  (int_literal)
                  (int_literal))))))))
=====================================
Signal Assignment
=====================================
template test(){
  signal output out[N];
  signal input in;
  signal input k;
  out[k] <-- (in >> k) & 1;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (signal_declaration_statement
            (signal_visibility)
            (identifier)
            (array_type
              (identifier)))
          (signal_declaration_statement
            (signal_visibility)
            (identifier))
          (signal_declaration_statement
            (signal_visibility)
            (identifier))
          (expression_statement
            (assignment_expression
              (array_access_expression
                (identifier)
                (identifier))
              (binary_expression
                (parenthesized_expression
                  (binary_expression
                    (identifier)
                    (identifier)))
                (int_literal)))))))
=====================================
Left assignment
=====================================
template test(){
  signal input in;
  signal output out;
  in*out === 0;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (signal_declaration_statement
            (signal_visibility)
            (identifier))
          (signal_declaration_statement
            (signal_visibility)
            (identifier))
          (expression_statement
            (assignment_expression
              (binary_expression
                (identifier)
                (identifier))
              (int_literal))))))
=====================================
Increments, decrements
=====================================
template test(){
  a++;
  b--;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (expression_statement
            (increment_expression
              (identifier)))
          (expression_statement
            (decrement_expression
              (identifier))))))
=====================================
Complex Expressions with arrays
=====================================
template test(){
  a.in[5]++;
  b.out[2 + n]--;
  rangeChecks[i].in[1] <== end;
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list)
        (template_body
          (expression_statement
            (increment_expression
              (array_access_expression
                (member_expression
                  (identifier)
                  (property_identifier))
                (int_literal))))
          (expression_statement
            (decrement_expression
              (array_access_expression
                (member_expression
                  (identifier)
                  (property_identifier))
                (binary_expression
                  (int_literal)
                  (identifier)))))
          (expression_statement
            (assignment_expression
              (array_access_expression
                (member_expression
                  (array_access_expression
                    (identifier)
                    (identifier))
                  (property_identifier))
                (int_literal))
              (identifier))))))
=====================================
Expression with array initialization
=====================================
template FloatAdd(k, p) {
  var case_1_output[2] = [alpha_e, alpha_m];
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list
          (parameter
            (identifier))
          (parameter
            (identifier)))
        (template_body
          (variable_declaration_statement
            (identifier)
            (array_type
              (int_literal))
            (array_expression
              (identifier)
              (identifier))))))
=====================================
Expression with tuples, circom 2.0.1
=====================================
template B(n){
    var a = 0, b = 0; component c;
    (a, b, c) = (1,a+1, A(2));
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list
          (parameter
            (identifier)))
        (template_body
          (variable_declaration_statement
            (identifier)
            (int_literal)
            (identifier)
            (int_literal))
          (component_declaration_statement
            (identifier))
          (expression_statement
            (assignment_expression
              (tuple_expression
                (identifier)
                (identifier)
                (identifier))
              (tuple_expression
                (int_literal)
                (binary_expression
                  (identifier)
                  (int_literal))
                (call_expression
                  (identifier)
                  (argument_list
                    (int_literal)))))))))
=====================================
Expression with anonymous components, circom 2.0.1
=====================================
template B(n){
   signal out <== A(n)(in[0],in[1]);
}
---
(source_file
      (template_definition
        (identifier)
        (parameter_list
          (parameter
            (identifier)))
        (template_body
          (signal_declaration_statement
            (identifier)
            (call_expression
              (identifier)
              (argument_list
                (identifier))
              (anonymous_inputs
                (argument_list
                  (array_access_expression
                    (identifier)
                    (int_literal))
                  (array_access_expression
                    (identifier)
                    (int_literal)))))))))