コード例 #1
0
void GlobalEntry::eventHandler(ostream& os) {
    vector<EventEntry*> event_l;
    EventEntry *event;
    vector<Type*>* argtype_l;

    // Store all EventEntry definitions
    vector<RuleNode*>::const_iterator it; 
    for (it = rules_.begin(); it != rules_.end(); ++it) {
        if ((*it)->pat()->kind() == BasePatNode::PatNodeKind::PRIMITIVE) {
            event_l.push_back(((PrimitivePatNode*)(*it)->pat())->event());
        }
    }

    os << "JMP begin" << endl;
    // Generate code to input event parameter
    for (unsigned int ii = 0; ii < event_l.size(); ii++) {
        event = event_l[ii];
        os << S_PREFIX << event->name() << ": ";
        
        argtype_l = event->type()->argTypes();

        os << "MOVL " << S_EVENT_END << R_PARAM << endl;
        os << "STI" << R_PARAM << RSP << C_PUSH_RET << endl;
        os << "SUB" << RSP << " 4" << RSP << endl;
        
        if (argtype_l) {
            std::vector<Type*>::iterator type_it = argtype_l->begin();
            for (int i = 1; type_it != argtype_l->end(); ++type_it, ++i) {

                os << "PRTS\"Enter Param " << i << ": \"" << endl;
                if ((*type_it)->tag() == Type::DOUBLE) {
                    os << "INF" << F_PARAM << C_IN_EPARAM << endl;
                    os << "STF" << F_PARAM << RSP << C_APARAM << endl;
                } else {
                    os << "INI" << R_PARAM << C_IN_EPARAM << endl;
                    os << "STI" << R_PARAM << RSP << C_APARAM << endl;
                }
                os << "SUB" << RSP << " 4" << RSP << endl;
            }
        }

        os << "JMP " << E_PREFIX << event->name() << endl;
        os << endl;
    }

    os << S_EVENT_END << ": ";
    os << "IN" << R_PARAM << C_DUMMY_INP << endl;
    os << S_START << ": ";
    os << "PRTS " << "\"\\nEnter Event Name ('0' for exit): \"" << endl;
    os << "IN" << R_PARAM << endl;

    // Generate code to select appropriate event
    for (unsigned int ii = 0; ii < event_l.size(); ii++) {
        event = event_l[ii];
        os << "JMPC EQ" << R_PARAM << " " << TO_INT(event->name()) << " " << S_PREFIX << event->name() << endl;
    }
    os << "JMPC EQ" << R_PARAM << " " << (int)'0' << " " << S_EXIT << endl;
    os << "PRTS " << "\"Invalid Event Name\\n\"" << endl;
    os << "JMP " << S_EVENT_END << endl << endl;
}
コード例 #2
0
ファイル: STEClasses.C プロジェクト: zhasun/CompilerProject
void GlobalEntry::memAlloc(MemoryMgr &mm){
	memory_mgr_ = mm;

	parse_label_ = new Label(Label::LabelType::PARSE_START);
	end_label_ = new Label(Label::LabelType::END_PROGRAM);

	//Loops over all declarations
	SymTab* st = this->symTab();
	for(SymTab::iterator i = st->begin(); i != st->end(); ++i){
		(*i)->memAlloc(mm);
	}

	//Technically this happens between the two of them, but all registers should be free at this point
	in_reg_ = mm.getNextRegister(true);
	mm.addRegister(in_reg_);

	comp_reg_ = mm.getNextRegister(true);
	mm.addRegister(comp_reg_);


	
	mm.freeRegister(comp_reg_);

	//Loops over all Rules
	for(unsigned int x = 0; x < rules_.size();++x){
		MemoryMgr mm_r;
		mm_r.addRegister(in_reg_);
		rules_[x]->memAlloc(mm_r);
		mm_r.freeRegister(in_reg_);

		if(rules_[x]->pat()->kind() == BasePatNode::PatNodeKind::PRIMITIVE){
			PrimitivePatNode* pn = (PrimitivePatNode*)((PatNode*)rules_[x]->pat())->pat1();
			EventEntry* ee = pn->event();
			if(ee->name().length() == 1){
				rule_names_.push_back(ee->name());
				rule_labels_.push_back(rules_[x]->startLabel());
				rule_return_labels_.push_back(rules_[x]->returnLabel());
			}
			if(ee->name() == "any"){
				any_labels_.push_back(rules_[x]->startLabel());
				any_return_labels_.push_back(rules_[x]->returnLabel());
			}
		}
	}

	mm.freeRegister(in_reg_);
}