// ノードの値 : 構文規則 ;
 // 選択     => a | b
 // 繰り返し => { a b }
 _program : empty | _blocks ... ;
 _scope : SCOPE_BEGIN _blocks SCOPE_END ;
 _blocks : empty
         | { _statement | _eol }
         ;
 _eol : EOL ;
 _statement : _let
            | _if_stmt
            | _while
            | _for
            | _foreach
            | _repeat_times
            | _def_function
            | _def_variable
            | _callfunc_stmt
            | _print
            | CONTINUE
            | BREAK
            ;
 _def_variable : WORD (DIM_VARIABLE|DIM_NUMBER|DIM_INT|DIM_STRING|DIM_ARRAY) [=_value]
               ;
 _scope_or_statement : _scope
                     | _statement
                     ;
 _if_stmt : IF _value THEN [EOL] _scope_or_statement [ ELSE _scope_or_statement ]
          ;
 _while   : _value WHILE _scope_or_statement
          ;
 _for     : WORD _value _value FOR _scope_or_statement
          ;
 _repeat_times : _value REPEAT_TIMES _scope_or_statement
               ;
 _foreach : _value FOREACH _scope_or_statement
          ;
 _callfunc : { [{_value}] FUNCTION_NAME }
           ;
 _arglist : '(' { _value } ')'
          ;
 _callfunc : FUNCTION_NAME
           | FUNCTION_NAME _arglist
           ;
 _def_function : DEF_FUNCTION _def_function_args _scope
               ;
 _def_function_args : empty
                    | '(' { WORD } ')' FUNCTION_NAME
                    | { WORD } FUNCTION_NAME
                    | FUNCTION_NAME '(' { WORD } ')'
                    ;
 _print : PRINT _value
 _let : _setVariable EQ _value
 _setVariable : WORD _variable_elements
              | WORD ;
 _variable_elements : '[' _value ']'
                    | '\' _value
                    ;
 _variable : WORD '[' VALUE ']'
           | WORD ;
 _value : FUNCTION_NAME | _calc_fact ;
 _calc_value : _simple_value
             | _callfunc
             | { _simple_value } _callfunc
             ;
 _simple_value : [MINUS] _const | _variable
               ;
 _calc_formula : PARENTHESES_L _value PARENTHESES_R
               | _calc_value
               ;
 _calc_power : _calc_formula { POWER _calc_formula }
             ;
 _calc_expr : _calc_power { (MUL|DIV|MOD) _calc_power }
            ;
 _calc_term : _calc_expr { (PLUS|MINUS) _calc_expr }
            ;
 _calc_comp : _calc_term  { (GT|GT_EQ|LT|LT_EQ|EQ|EQ_EQ|NOT_EQ) _calc_term }
            ;
 _calc_fact : _calc_comp
            ;
 _const : INT | NUMBER | STRING ;