============================================
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 (parenthesized_expression (identifier))
        (expression_statement (number_literal)))
      (if_statement (parenthesized_expression (unary_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;

  for (i = 0, j = 0, k = 0, l = 0; i < 1; i++, j++, k++, l++)
    1;
}

---

(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)))
        (binary_expression (identifier) (number_literal))
        (comma_expression
          (call_expression (identifier) (argument_list))
          (update_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)))
      (for_statement
        (comma_expression
          (assignment_expression (identifier) (number_literal))
          (comma_expression
            (assignment_expression (identifier) (number_literal))
            (comma_expression
              (assignment_expression (identifier) (number_literal))
              (assignment_expression (identifier) (number_literal)))))
        (binary_expression
          (identifier)
          (number_literal))
        (comma_expression
          (update_expression (identifier))
          (comma_expression
            (update_expression (identifier))
            (comma_expression
              (update_expression (identifier))
              (update_expression (identifier)))))
        (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 (parenthesized_expression (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 (parenthesized_expression (identifier)) (goto_statement (statement_identifier))))))

============================================
Switch statements
============================================

void foo(int a) {
  switch (a) {
    puts("entered switch!");

    case 3:
    case 5:
      if (b) {
        c();
      }
      break;

    default:
      c();
      break;
  }
}

---

(translation_unit
  (function_definition
    (primitive_type)
    (function_declarator (identifier) (parameter_list
      (parameter_declaration (primitive_type) (identifier))))
    (compound_statement
      (switch_statement
        (parenthesized_expression (identifier))
        (compound_statement
          (expression_statement (call_expression (identifier) (argument_list (string_literal))))
          (case_statement (number_literal))
          (case_statement (number_literal)
            (if_statement
              (parenthesized_expression (identifier))
              (compound_statement (expression_statement (call_expression (identifier) (argument_list)))))
            (break_statement))
          (case_statement
            (expression_statement (call_expression (identifier) (argument_list)))
            (break_statement)))))))

============================================
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)))
