// ノードの値 : 構文規則 ; // 選択 => 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 ;