program->struct_declear program|declear program|calculation ; program|condition program|cycle program|array_declear program|print_func ; program|break_keyword ; program|$


print_func->PRINT calculation GEQ_PRINT|PRINTLN calculation GEQ_PRINTLN

declear->type_name PUSH IDENTIFIER PUSH declear1
declear1->; FILL|= declear2
declear2->CONSTANT PUSH FILL_I ;|IDENTIFIER PUSH FILL_I ;

struct_declear->STRUCT IDENTIFIER BEGIN_STRUCT { struct_declear1 } END_STRUCT
struct_declear1->declear struct_declear1|$

array_declear->[ CONSTANT PUSH_CAPACITY ] type_name PUSH IDENTIFIER PUSH array_declear1
array_declear1->; FILL_EMPTY_ARRAY|= array_declear2
array_declear2->{ constant_list } FILL_ARRAY ;

constant_list->CONSTANT PUSH constant_list1|$
constant_list1->$|, constant_list

assignment->IDENTIFIER = CONSTANT

condition->IF ( calculation ) GEQ_IF { program } condition_else END_IF
condition_else->BEGIN_ELSE ELSE { program }|$

cycle->WHILE ( calculation ) GEQ_WHILE { program } END_WHILE

break_keyword->BREAK GEQ_BREAK|CONTINUE GEQ_CONTINUE

calculation->fifth calculation1
calculation1->fifth_operator PUSH fifth GEQ calculation1 |$
fifth->fourth fifth1
fifth1->fourth_operator PUSH fourth GEQ fifth1|$
fourth->third fourth1
fourth1->third_operator PUSH third GEQ fourth1|$
third->second third1
third1->second_operator PUSH second GEQ third1|$
second->first second1
second1->first_operator PUSH first GEQ second1|$
first->IDENTIFIER PUSH maybe_struct|CONSTANT PUSH|( calculation )
maybe_struct->. IDENTIFIER PUSH_MEMBER|$

type_name->INT|FLOAT|DOUBLE|CHAR

first_operator->!|~
second_operator->*|/|%
third_operator->+|-|<<|>>
fourth_operator->&|^| |
fifth_operator->=|EQ_OP|NE_OP|<|>|>=|<=|+=|-=|*=|/=|%=|%=|<<=|>>=|&=|^=
