================================================================================
Transformations
================================================================================
cylinder();
cylinder(
  d=5,
  h=100,
);
rotate([90, 0, 0]) cylinder();
translate([1, 0, 0]) {
  difference() {
    rotate([0, 90, 0]) cylinder();
    cube();
  }
}
--------------------------------------------------------------------------------

(source_file
  (transform_chain
    (module_call
      (identifier)
      (arguments)))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (assignment
          (identifier)
          (integer))
        (assignment
          (identifier)
          (integer)))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (list
          (integer)
          (integer)
          (integer))))
    (transform_chain
      (module_call
        (identifier)
        (arguments))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (list
          (integer)
          (integer)
          (integer))))
    (union_block
      (transform_chain
        (module_call
          (identifier)
          (arguments))
        (union_block
          (transform_chain
            (module_call
              (identifier)
              (arguments
                (list
                  (integer)
                  (integer)
                  (integer))))
            (transform_chain
              (module_call
                (identifier)
                (arguments))))
          (transform_chain
            (module_call
              (identifier)
              (arguments))))))))

================================================================================
Control Flow
================================================================================
if ($preview)
  if (false)
    sphere();
  else
    translate([2, 0, 0]) cube();

for (i = [1:2:7]) {
  let (x = i ^ 2, y = x - 1) {
    translate([x, y, 0]) sphere(r=i);
  }
}

intersection_for (i = [1, 2, 3]) {
  if (i > 1) {
    translate([0, i, 0]) cube();
  }
}
--------------------------------------------------------------------------------

(source_file
  (if_block
    (parenthesized_expression
      (special_variable
        (identifier)))
    (if_block
      (parenthesized_expression
        (boolean))
      (transform_chain
        (module_call
          (identifier)
          (arguments)))
      (transform_chain
        (module_call
          (identifier)
          (arguments
            (list
              (integer)
              (integer)
              (integer))))
        (transform_chain
          (module_call
            (identifier)
            (arguments))))))
  (for_block
    (assignments
      (assignment
        (identifier)
        (range
          (integer)
          (integer)
          (integer))))
    (union_block
      (let_block
        (assignments
          (assignment
            (identifier)
            (binary_expression
              (identifier)
              (integer)))
          (assignment
            (identifier)
            (binary_expression
              (identifier)
              (integer))))
        (union_block
          (transform_chain
            (module_call
              (identifier)
              (arguments
                (list
                  (identifier)
                  (identifier)
                  (integer))))
            (transform_chain
              (module_call
                (identifier)
                (arguments
                  (assignment
                    (identifier)
                    (identifier))))))))))
  (intersection_for_block
    (assignments
      (assignment
        (identifier)
        (list
          (integer)
          (integer)
          (integer))))
    (union_block
      (if_block
        (parenthesized_expression
          (binary_expression
            (identifier)
            (integer)))
        (union_block
          (transform_chain
            (module_call
              (identifier)
              (arguments
                (list
                  (integer)
                  (identifier)
                  (integer))))
            (transform_chain
              (module_call
                (identifier)
                (arguments)))))))))

================================================================================
Modifiers
================================================================================
!cylinder();
*linear_extrude(4) text("Hello");
rotate([0, 90, 0])
  !#cylinder();
%cube();
--------------------------------------------------------------------------------

(source_file
  (transform_chain
    (modifier)
    (module_call
      (identifier)
      (arguments)))
  (transform_chain
    (modifier)
    (module_call
      (identifier)
      (arguments
        (integer)))
    (transform_chain
      (module_call
        (identifier)
        (arguments
          (string)))))
  (transform_chain
    (module_call
      (identifier)
      (arguments
        (list
          (integer)
          (integer)
          (integer))))
    (transform_chain
      (modifier)
      (modifier)
      (module_call
        (identifier)
        (arguments))))
  (transform_chain
    (modifier)
    (module_call
      (identifier)
      (arguments))))

================================================================================
Assert Statements
================================================================================
x = 10;
assert();
assert("t1",);
assert(x < 20) cube();
assert(condition = a*b, message=str("msg: ", 5),);
for (y = [3:5])
    assert(assert() y < x, "message")
        cylinder();
--------------------------------------------------------------------------------

(source_file
  (var_declaration
    (assignment
      (identifier)
      (integer)))
  (assert_statement
    (arguments))
  (assert_statement
    (arguments
      (string)))
  (assert_statement
    (arguments
      (binary_expression
        (identifier)
        (integer)))
    (transform_chain
      (module_call
        (identifier)
        (arguments))))
  (assert_statement
    (arguments
      (assignment
        (identifier)
        (binary_expression
          (identifier)
          (identifier)))
      (assignment
        (identifier)
        (function_call
          (identifier)
          (arguments
            (string)
            (integer))))))
  (for_block
    (assignments
      (assignment
        (identifier)
        (range
          (integer)
          (integer))))
    (assert_statement
      (arguments
        (assert_expression
          (arguments)
          (binary_expression
            (identifier)
            (identifier)))
        (string))
      (transform_chain
        (module_call
          (identifier)
          (arguments))))))
