============================================
If statements
============================================

int main() {
  if (a)
    1;

  if (!a) {
    2;
  } else {
    3;
  }
}

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator (identifier) (parameter_list))
    (compound_statement
      (if_statement (identifier)
        (expression_statement (number_literal)))
      (if_statement (logical_expression (identifier))
        (compound_statement
          (expression_statement (number_literal)))
        (compound_statement
          (expression_statement (number_literal)))))))

============================================
For loops
============================================

int main() {
  for (;;)
    1;

  for (int i = 0; i < 5; next(), i++) {
    2;
  }

  for (start(); check(); step())
    3;
}

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator (identifier) (parameter_list))
    (compound_statement
      (for_statement
        (expression_statement (number_literal)))
      (for_statement
        (declaration (primitive_type) (init_declarator (identifier) (number_literal)))
        (relational_expression (identifier) (number_literal))
        (call_expression (identifier) (argument_list))
        (math_expression (identifier))
        (compound_statement (expression_statement (number_literal))))
      (for_statement
        (call_expression (identifier) (argument_list))
        (call_expression (identifier) (argument_list))
        (call_expression (identifier) (argument_list))
        (expression_statement (number_literal))))))

============================================
While loops
============================================

int main() {
  while (x)
    printf("hi");
}

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator (identifier) (parameter_list))
    (compound_statement
      (while_statement (identifier)
        (expression_statement (call_expression
          (identifier)
          (argument_list (string_literal))))))))

============================================
Labeled statements
============================================

void foo(T *t) {
recur:
  t = t->next();
  if (t) goto recur;
}

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator (identifier) (parameter_list
      (parameter_declaration (type_identifier) (pointer_declarator (identifier)))))
    (compound_statement
      (labeled_statement (statement_identifier)
        (expression_statement (assignment_expression
          (identifier)
          (call_expression (field_expression (identifier) (field_identifier)) (argument_list)))))
      (if_statement (identifier) (goto_statement (statement_identifier))))))

============================================
Comments with asterisks
============================================

/*************************
 * odd number of asterisks
 *************************/
int a;

/**************************
 * even number of asterisks
 **************************/
int b;

---

(translation_unit
  (comment)
  (declaration (primitive_type) (identifier))
  (comment)
  (declaration (primitive_type) (identifier)))
