============================
local variables declarations
============================

void Test() {
    int number;
    float pointnumber;
    char character;
    bool boolean;
    char[] text = "lorem ipsum";
    float vec[3];
    bool active[MAXPLAYERS + 1];
    Action action;
    Action actions[MAXPLAYERS + 1];
}

---

(source_file
  (function_definition
    (type
      (builtin_type)
    )
    (identifier)
    (parameter_declarations)
    (block
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (dimension)
        (dynamic_array_declaration
          (identifier)
          (string_literal)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (fixed_dimension
            (int_literal)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (fixed_dimension
            (binary_expression
              (identifier)
              (int_literal)
            )
          )
        )
      )
      (variable_declaration_statement
        (type
          (identifier)
        )
        (variable_declaration
          (identifier)
        )
      )
      (variable_declaration_statement
        (type
          (identifier)
        )
        (variable_declaration
          (identifier)
          (fixed_dimension
            (binary_expression
              (identifier)
              (int_literal)
            )
          )
        )
      )
    )
  )
)


==============
initialization
==============

void Test() {
    int money = 5400;
    int money = 0
    + 1;
    int money = 0
    + 1
    float percent = 67.3;
    char key = 'A';
    bool enabled = false;
    Handle handle = null;
}

---

(source_file
  (function_definition
    (type
      (builtin_type)
    )
    (identifier)
    (parameter_declarations)
    (block
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (int_literal)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (binary_expression
            (int_literal)
            (int_literal)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (binary_expression
            (int_literal)
            (int_literal)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (float_literal)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (char_literal
            (character)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (bool_literal)
        )
      )
      (variable_declaration_statement
        (type
          (identifier)
        )
        (variable_declaration
          (identifier)
          (null)
        )
      )
    )
  )
)


====================
array initialization
====================

void Test() {
    char[] text = "Hello world";
    int numbers[] = { 1, 2, 3 };
    float vec[3] = { 0.0, 14.2, 13.22 };
    bool client_has_stuff[MAXPLAYERS] = { true, ... };
    char[] name = new char[players*2];
    Action[] actions = new Action[MAXPLAYERS];
}

---

(source_file
  (function_definition
    (type
      (builtin_type)
    )
    (identifier)
    (parameter_declarations)
    (block
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (dimension)
        (dynamic_array_declaration
          (identifier)
          (string_literal)
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (dimension)
          (array_literal
            (int_literal)
            (int_literal)
            (int_literal)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (fixed_dimension
            (int_literal)
          )
          (array_literal
            (float_literal)
            (float_literal)
            (float_literal)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (fixed_dimension
            (identifier)
          )
          (array_literal
            (bool_literal)
            (rest_operator)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (dimension)
        (dynamic_array_declaration
          (identifier)
          (dynamic_array
            (builtin_type)
            (fixed_dimension
              (binary_expression
                (identifier)
                (int_literal)
              )
            )
          )
        )
      )
      (variable_declaration_statement
        (type
          (identifier)
        )
        (dimension)
        (dynamic_array_declaration
          (identifier)
          (dynamic_array
            (identifier)
            (fixed_dimension
              (identifier)
            )
          )
        )
      )
    )
  )
)


=============
storage class
=============

void Test() {
    static const int foo = 1;
    static const Action foo = 1;
    const int foo = 1;
    static Action foo;
    static ConVar foo = null, bar = null;
}

---

(source_file
  (function_definition
    (type
      (builtin_type)
    )
    (identifier)
    (parameter_declarations)
    (block
      (variable_declaration_statement
        (visibility)
        (variable_storage_class)
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (int_literal)
        )
      )
      (variable_declaration_statement
        (visibility)
        (variable_storage_class)
        (type
          (identifier)
        )
        (variable_declaration
          (identifier)
          (int_literal)
        )
      )
      (variable_declaration_statement
        (variable_storage_class)
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (int_literal)
        )
      )
      (variable_declaration_statement
        (visibility)
        (type
          (identifier)
        )
        (variable_declaration
          (identifier)
        )
      )
      (variable_declaration_statement
        (visibility)
        (type
          (identifier)
        )
        (variable_declaration
          (identifier)
          (null)
        )
        (variable_declaration
          (identifier)
          (null)
        )
      )
    )
  )
)


=======================
multidimensional arrays
=======================

void Test(){
    float vec[MAXPLAYERS][10];
    float vec [MAXPLAYERS] [10];
    int bla[][] = { {1,2,3}, {4,5,6}, {7,8,9} };
    char[][] name = new char[players*2][5];
}

---

(source_file
  (function_definition
    (type
      (builtin_type)
    )
    (identifier)
    (parameter_declarations)
    (block
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (fixed_dimension
            (identifier)
          )
          (fixed_dimension
            (int_literal)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (fixed_dimension
            (identifier)
          )
          (fixed_dimension
            (int_literal)
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (variable_declaration
          (identifier)
          (dimension)
          (dimension)
          (array_literal
            (array_literal
              (int_literal)
              (int_literal)
              (int_literal)
            )
            (array_literal
              (int_literal)
              (int_literal)
              (int_literal)
            )
            (array_literal
              (int_literal)
              (int_literal)
              (int_literal)
            )
          )
        )
      )
      (variable_declaration_statement
        (type
          (builtin_type)
        )
        (dimension)
        (dimension)
        (dynamic_array_declaration
          (identifier)
          (dynamic_array
            (builtin_type)
            (fixed_dimension
              (binary_expression
                (identifier)
                (int_literal)
              )
            )
            (fixed_dimension
              (int_literal)
            )
          )
        )
      )
    )
  )
)
