void BinOpNode::generateLvalue(AsmCode& code){ string value = token->Value; if (value == "+"){ SymbolType *type = left->getType(); if (dynamic_cast<ArraySymbol*>(type)) left->generateLvalue(code); else if (dynamic_cast<PointerSymbol*>(type)) left->generate(code); SymbolType *t = type->upType(); right->generate(code); code.add(_POP, _EAX) .add(_MOV, _EBX, to_string(t->byteSize())) .add(_IMUL, _EAX, _EBX) .add(_POP, _EBX) .add(_ADD, _EAX, _EBX) .add(_PUSH, _EAX); t = t->upType(); } else if (isAssing(token)){ generate(code); code.add(_POP, _EAX); left->generateLvalue(code); } else throw MyException("Compiler error"); }
void Block::generate(AsmCode &code){ for(int i = 0; i < size(); i++){ body[i]->generate(code); if(body[i]->isExpression()){ SymbolType *type = body[i]->getType(); if(type && type->byteSize()) code.add(_POP, _EAX); } } }
void ArrNode::generateLvalue(AsmCode &code){ SymbolType *type = name->getType(); if(dynamic_cast<ArraySymbol*>(type)) name->generateLvalue(code); else if(dynamic_cast<PointerSymbol*>(type)) name->generate(code); SymbolType *t = type->upType(); for(int i = 0; i < args.size(); i++){ args[i]->generate(code); code.add(_POP, _EAX) .add(_MOV, _EBX, to_string(t->byteSize())) .add(_IMUL, _EAX, _EBX) .add(_POP, _EBX) .add(_ADD, _EAX, _EBX) .add(_PUSH, _EAX); t = t->upType(); } }