<type> ::= <signed_type> | <unsigned_type> <signed_type> ::= 'byte' | 'int' | 'long' | 'float' <unsigned_type> ::= 'char' |'ubyte' | 'uint' | 'ulong' <ref_name> ::= <name> | '*' <name> | '*' 'const' <name> <var_spec> ::= <ref_name> | <name> '[' <const_number> ']' <var_spec_list> ::= <var_spec> | <var_spec_list> ',' <var_spec> <global_var_declaration> ::= <type> <var_spec_list> <local_var_declaration> ::= <type> <var_spec_list> <const_value> ::= <number> | <name> | <const_expr> <const_value_list> ::= <const_value> | <const_value_list> ',' <const_value> <const_declaration> ::= 'const' <type> <ref_name> '=' <const_value_list> | 'const' <name> '=' <const_value> <hwreg_declaration> ::= 'hwreg' <name> '=' <const_value> <arg_spec> ::= <type> <ref_name> <arg_spec_list> ::= <arg_spec> | <arg_spec_list> ',' <arg_spec> <proc_spec> ::= <name> '(' <arg_spec_list> ')' <NL> <statement_list> <invoke_opt> ::= 'fastcall' | 'inline' <proc_declaration> ::= 'proc' <type> <proc_spec> 'endproc' | 'proc' <type> '*' <proc_spec> 'endproc' | 'proc' <proc_spec> 'endproc' | 'proc' <invoke_opt> <type> <proc_spec> 'endproc' | 'proc' <invoke_opt> <type> '*' <proc_spec> 'endproc' | 'proc' <invoke_opt> <proc_spec> 'endproc' <if_statement> ::= 'if' <cond_expr> 'then' <NL> <statement_list> <NL> 'endif' | 'if' <cond_expr> 'then' <NL> <statement_list> <NL> 'else' <NL> <statement_list> <NL> 'endif' | 'if' <cond_expr> 'then' <NL> <statement_list> <NL> 'else' <if_statement> <for_statement> ::= 'for' <expr> 'while' <cond_expr> 'step' <expr> 'do' <NL> <statement_list> <NL> 'done' <while_statement> ::= 'while' <cond_expr> 'do' <NL> <statement_list> <NL> 'done' <return_statement> ::= 'return' | 'return' <expr> <break_statement> ::= 'break' <continue_statement> ::= 'continue' <goto_statement> ::= 'goto' <name> <label_statement> ::= <name> ':' <actual_arg_list> ::= <expr> | <actual_arg_list> ',' <expr> <proc_invocation> ::= <name> '(' <actual_arg_list> ')' <array_dereference> ::= <name> '[' <expr> ']' <ref> ::= <address_op> <name> <dereference> ::= <dereference_op> <expr> <expr> ::= <expr> <binary_op> <expr> | <unary_op> <expr> | '(' <expr> ')' | <proc_invocation> | <array_dereference> | <name> | <number> | <ref> | <dereference> <statement> ::= <if_statement> | <for_statement> | <while_statement> | <return_statement> | <break_statement> | <continue_statement> | <expr> | <local_var_declaration> | <goto_statement> | <label_statement> <statement_list> ::= <statement> | <statement_list> <NL> <statement> <include_statement> ::= 'include' <string> <primary_statement> ::= <global_var_declaration> | <const_declaration> | <hwreg_declaration> | <include_statement> | <proc_declaration> <primary_statement_list> ::= <primary_statement> | <primary_statement_list> <NL> <primary_statement> <binary_op> ::= <add_op> | <sub_op> | <mult_op> | <div_op> | <mod_op> | <xor_op> | <or_op> | <and_op> | <shift_left_op> | <shift_right_op> | <logical_or_op> | <logical_and_op> <add_op> ::= '+' <sub_op> ::= '-' <mult_op> ::= '*' <div_op> ::= '/' <mod_op> ::= '%' <xor_op> ::= '^' <or_op> ::= '|' <and_op> ::= '&' <shift_left_op> ::= '<<' <shift_right_op> ::= '>>' <logical_or_op> ::= '||' <logical_and_op> ::= '&&' <unary_op> ::= <negate_op> | <not_op> | <logical_not_op> | <address_op> | <dereference_op> <negate_op> ::= '-' <not_op> ::= '~' <logical_not_op> ::= '!' <address_op> ::= '&' <dereference_op> ::= '*' <comment> ::= '//' <any_text> <NL>