void ActivationBlock::generate_post() {
	if (this->activity == DEFINITION) {
		// get locals
		string name = this->record->get_symbol_name();
		SymbolListPtr named_items = this->get_analyzer()->get_symtable()->find(name);
		SymbolListPtr locals = SymTable::filter_nest_level(SymTable::filter_data(named_items), this->get_nesting_level());
		unsigned long locals_size = locals->size();
		// move stack ptr minus local variables
		if (locals_size > 0) {
			write_raw("PUSH SP");
			write_raw("PUSH #" + conv_string(locals_size));
			write_raw("SUBS ");
			write_raw("POP SP");
		}
		write_raw("RET\n");
	} else {
		// call
		if (this->activation == PROCEDURE) {
			
		} else if (this->activation == FUNCTION) {
			
		}
	}
}
string SemanticAnalyzer::generate_label() {
	string label = "L" + conv_string(this->label_count);
	label_count++;
	return label;
}
Exemplo n.º 3
0
BigInt::reference   BigInt::operator= ( string s )
{
    sign_ = s[0] == '-';
    buffer = conv_string ( s );
    return normalize();
}
Exemplo n.º 4
0
BigInt::BigInt ( const char* s ) : sign_(false), buffer ( conv_string(s) )
{
    if ( s[0] == '-' )
        sign_ = true;
    normalize();
}