To generate the initial state of storage for variables.


§1. Pipeline stage.

void CodeGen::PLM::create_pipeline_stage(void) {
    CodeGen::Stage::new(I"parse-linked-matter", CodeGen::PLM::run_pipeline_stage, NO_STAGE_ARG, FALSE);
}

int CodeGen::PLM::run_pipeline_stage(pipeline_step *step) {
    Inter::Tree::traverse(step->repository, CodeGen::PLM::visitor, NULL, NULL, 0);
    return TRUE;
}

§2. Parsing.

void CodeGen::PLM::visitor(inter_tree *I, inter_tree_node *P, void *state) {
    inter_package *outer = Inter::Packages::container(P);
    if (((outer == NULL) || (Inter::Packages::is_codelike(outer) == FALSE)) && (P->W.data[ID_IFLD] == SPLAT_IST)) {
        text_stream *S = Inter::Node::ID_to_text(P, P->W.data[MATTER_SPLAT_IFLD]);
        match_results mr = Regexp::create_mr();
        if (Regexp::match(&mr, S, L" *(%C+) *(%c*);%c*")) {
            inter_t keyword = 0;
            if (Str::eq_insensitive(mr.exp[0], I"#ifdef")) keyword = IFDEF_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"#ifndef")) keyword = IFNDEF_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"#iftrue")) keyword = IFTRUE_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"#ifnot")) keyword = IFNOT_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"#endif")) keyword = ENDIF_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"#stub")) keyword = STUB_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Constant")) keyword = CONSTANT_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Global")) keyword = GLOBAL_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Array")) keyword = ARRAY_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"[")) keyword = ROUTINE_PLM;

            else if (Str::eq_insensitive(mr.exp[0], I"Attribute")) keyword = ATTRIBUTE_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Property")) keyword = PROPERTY_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Verb")) keyword = VERB_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Fake_action")) keyword = FAKEACTION_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Object")) keyword = OBJECT_PLM;
            else if (Str::eq_insensitive(mr.exp[0], I"Default")) keyword = DEFAULT_PLM;

            else { keyword = MYSTERY_PLM; LOG("Mystery: %S\n", mr.exp[0]); }
            P->W.data[PLM_SPLAT_IFLD] = keyword;
        } else {
            int keep = FALSE;
            LOOP_THROUGH_TEXT(pos, S)
                if (Characters::is_whitespace(Str::get(pos)) == FALSE)
                    keep = TRUE;
            if (keep == FALSE) Inter::Tree::remove_node(P);
        }
    }
}