To generate the initial state of storage for variables.

§1.

int variables_written = FALSE, prepare_counter = 0, knowledge_counter = 0;
void CodeGen::Var::prepare(code_generation *gen) {
    variables_written = FALSE;
    prepare_counter = 0;
    knowledge_counter = 0;
    InterTree::traverse(gen->from, CodeGen::Var::visitor1, gen, NULL, VARIABLE_IST);
}

void CodeGen::Var::visitor1(inter_tree *I, inter_tree_node *P, void *state) {
    code_generation *gen = (code_generation *) state;
    inter_symbol *var_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_VAR_IFLD);
    prepare_counter = CodeGen::Targets::prepare_variable(gen, P, var_name, prepare_counter);
}

void CodeGen::Var::knowledge(code_generation *gen) {
    if (variables_written == FALSE) {
        variables_written = TRUE;
        InterTree::traverse(gen->from, CodeGen::Var::visitor2, gen, NULL, VARIABLE_IST);
    }
}

void CodeGen::Var::visitor2(inter_tree *I, inter_tree_node *P, void *state) {
    code_generation *gen = (code_generation *) state;
    inter_symbol *var_name = InterSymbolsTables::symbol_from_frame_data(P, DEFN_VAR_IFLD);
    knowledge_counter = CodeGen::Targets::declare_variable(gen, P, var_name, knowledge_counter, prepare_counter);
}