================================================================================
For statements
================================================================================

for x in s:
  100

for x, y in pairs(x):
  42u32

for (x, y), w, z in whatever:
  for foo, bar in s:
    0x42f

for _, v {.tag.} in c.pairs:
  discard

--------------------------------------------------------------------------------

(source_file
  (for
    left: (symbol_declaration_list
      (symbol_declaration
        name: (identifier)))
    right: (identifier)
    body: (statement_list
      (integer_literal)))
  (for
    left: (symbol_declaration_list
      (symbol_declaration
        name: (identifier))
      (symbol_declaration
        name: (identifier)))
    right: (call
      function: (identifier)
      (argument_list
        (identifier)))
    body: (statement_list
      (integer_literal)))
  (for
    left: (symbol_declaration_list
      (tuple_deconstruct_declaration
        (symbol_declaration
          name: (identifier))
        (symbol_declaration
          name: (identifier)))
      (symbol_declaration
        name: (identifier))
      (symbol_declaration
        name: (identifier)))
    right: (identifier)
    body: (statement_list
      (for
        left: (symbol_declaration_list
          (symbol_declaration
            name: (identifier))
          (symbol_declaration
            name: (identifier)))
        right: (identifier)
        body: (statement_list
          (integer_literal)))))
  (for
    left: (symbol_declaration_list
      (symbol_declaration
        name: (blank_identifier))
      (symbol_declaration
        name: (identifier)
        (pragma_list
          (identifier))))
    right: (dot_expression
      left: (identifier)
      right: (identifier))
    body: (statement_list
      (discard_statement))))

================================================================================
While statements
================================================================================

while true:
  while false:
    nothing

--------------------------------------------------------------------------------

(source_file
  (while
    condition: (identifier)
    body: (statement_list
      (while
        condition: (identifier)
        body: (statement_list
          (identifier))))))

================================================================================
Import statements
================================================================================

import X

import Y, Z,
  J

import K except F

--------------------------------------------------------------------------------

(source_file
  (import_statement
    (expression_list
      (identifier)))
  (import_statement
    (expression_list
      (identifier)
      (identifier)
      (identifier)))
  (import_statement
    (identifier)
    (except_clause
      (expression_list
        (identifier)))))

================================================================================
Export statements
================================================================================

export X, Y

export foo

export bar except bar

--------------------------------------------------------------------------------

(source_file
  (export_statement
    (expression_list
      (identifier)
      (identifier)))
  (export_statement
    (expression_list
      (identifier)))
  (export_statement
    (identifier)
    (except_clause
      (expression_list
        (identifier)))))

================================================================================
Import from statements
================================================================================

from system import seq, echo

from X import Y

from X/Y import Y

--------------------------------------------------------------------------------

(source_file
  (import_from_statement
    module: (identifier)
    (expression_list
      (identifier)
      (identifier)))
  (import_from_statement
    module: (identifier)
    (expression_list
      (identifier)))
  (import_from_statement
    module: (infix_expression
      left: (identifier)
      operator: (operator)
      right: (identifier))
    (expression_list
      (identifier))))

================================================================================
Include statements
================================================================================

include stuff, "foo.txt"

include X

--------------------------------------------------------------------------------

(source_file
  (include_statement
    (expression_list
      (identifier)
      (interpreted_string_literal
        (string_content))))
  (include_statement
    (expression_list
      (identifier))))

================================================================================
Discard statements
================================================================================

discard "foo"

discard

discard bar

discard a: b

discard foo as bar

--------------------------------------------------------------------------------

(source_file
  (discard_statement
    (interpreted_string_literal
      (string_content)))
  (discard_statement)
  (discard_statement
    (identifier))
  (discard_statement
    (call
      function: (identifier)
      (argument_list
        (statement_list
          (identifier)))))
  (discard_statement
    (infix_expression
      left: (identifier)
      right: (identifier))))

================================================================================
Assembly statements
================================================================================

asm """
mov
ret
"""

asm "ret"

--------------------------------------------------------------------------------

(source_file
  (assembly_statement
    (long_string_literal
      (string_content)))
  (assembly_statement
    (interpreted_string_literal
      (string_content))))

================================================================================
Break statements
================================================================================

bRe_ak

break blck

--------------------------------------------------------------------------------

(source_file
  (break_statement)
  (break_statement
    (identifier)))

================================================================================
Continue statements
================================================================================

con_tiNue

continue blck

--------------------------------------------------------------------------------

(source_file
  (continue_statement)
  (continue_statement
    (identifier)))

================================================================================
Raise statements
================================================================================

raise exp

raise

--------------------------------------------------------------------------------

(source_file
  (raise_statement
    (identifier))
  (raise_statement))

================================================================================
Return statements
================================================================================

return

return X

--------------------------------------------------------------------------------

(source_file
  (return_statement)
  (return_statement
    (identifier)))

================================================================================
Bind statements
================================================================================

bind x, y, z

bind foo

bind foo.bar

--------------------------------------------------------------------------------

(source_file
  (bind_statement
    (expression_list
      (identifier)
      (identifier)
      (identifier)))
  (bind_statement
    (expression_list
      (identifier)))
  (bind_statement
    (expression_list
      (dot_expression
        (identifier)
        (identifier)))))

================================================================================
Mixin statements
================================================================================

mixin x, y, z

mixin foo

mixin system.true

--------------------------------------------------------------------------------

(source_file
  (mixin_statement
    (expression_list
      (identifier)
      (identifier)
      (identifier)))
  (mixin_statement
    (expression_list
      (identifier)))
  (mixin_statement
    (expression_list
      (dot_expression
        (identifier)
        (identifier)))))

================================================================================
Yield statements
================================================================================

yield

yield none

--------------------------------------------------------------------------------

(source_file
  (yield_statement)
  (yield_statement
    (identifier)))

================================================================================
Static statements
================================================================================

static: echo y

static:
  doX()
  doY()
  assert y, "foo"

--------------------------------------------------------------------------------

(source_file
  (static_statement
    body: (statement_list
      (call
        function: (identifier)
        (argument_list
          (identifier)))))
  (static_statement
    body: (statement_list
      (call
        function: (identifier)
        (argument_list))
      (call
        function: (identifier)
        (argument_list))
      (call
        function: (identifier)
        (argument_list
          (identifier)
          (interpreted_string_literal
            (string_content)))))))

================================================================================
Assignment
================================================================================

x = foo.add proc =
  bar

--------------------------------------------------------------------------------

(source_file
  (assignment
    (identifier)
    (call
      (dot_expression
        (identifier)
        (identifier))
      (argument_list
        (proc_expression
          (statement_list
            (identifier)))))))

================================================================================
Defer statements
================================================================================

defer: echo y

defer:
  doX()
  doY()
  assert y, "foo"

--------------------------------------------------------------------------------

(source_file
  (defer
    (statement_list
      (call
        (identifier)
        (argument_list
          (identifier)))))
  (defer
    (statement_list
      (call
        (identifier)
        (argument_list))
      (call
        (identifier)
        (argument_list))
      (call
        (identifier)
        (argument_list
          (identifier)
          (interpreted_string_literal
            (string_content)))))))
