void qSubvariable::subupdateType() { neu_type = 0; qneu_StructType * ss = dynamic_cast<qneu_StructType*>(L()->neu_type); if (ss) { neu_type = ss->GetTypeFor(name); if (!neu_type) { fireError(true, ERROR_SUBVAR_DOESNTEXIST, "Type `" + ss->name() + "` has no member named `" + name + "`"); } } else { if (L()->neu_type) { fireError(true, ERROR_SUBVAR_ERROR, "Cannot match subvariable `" + name + "` with type `" + L()->neu_type->name() + "`"); } else { fireError(true, ERROR_SUBVAR_ERROR, "Cannot match subvariable `" + name + "`"); } } }
void qArrayAccess::subupdateType() { neu_type = 0; qneu_PointerType * ptype = dynamic_cast<qneu_PointerType*>(L()->neu_type); if (!ptype) { fireError(true, ERROR_TYPE_NO_POINTER, "Type `" + L()->neu_type->name() + "`is not a pointer type"); return; } if (!R()->neu_type->is_integer()) { qValue * cc = new qConvert(qneu_PrimitiveType::type_uint32(), R(), "Array index: "); replace_child(R(), cc); } neu_type = ptype->base; }
/* Функция компиляци * Осуществляется как проверки, так и вызовв других * функций для проверок или преобразваний. * Проверки на правельность написания мнемокода ассамблера * и заменна мнемокода на коды команд, так же замена символов * адресации на коды адресации, и также меток на их дресса * - Входные данные: исходные мнемокод ассамблера с виджета * - Выходные данные: записать данных в ячейки ОЗУ сформированных * во время выполнения функции */ void Compiler::exec(QString &strSource) { if(strSource.isEmpty()) return; QTime startTime = QTime::currentTime(); strSource = parseLabel(strSource); QStringList slCommandPair = strSource.split(" "); mBar->setStyleSheet("QProgressBar {border: 1px solid rgb(83, 83, 83);background-color: rgb(38, 40, 41);border-radius: 5px;} QProgressBar::chunk {background-color: rgb(64, 66, 68);width: 20px; }"); mBar->setMaximum(slCommandPair.size() - 1); mBar->setValue(0); QStringList debugList; QString isRegistr, strCode, strCmd, strArg = "000", typeAdrr = "0", debugArg = " ", debugCmd = " ", resParseCmd = "", error = ""; int indexCmd = 0; for(int i = 0; i < slCommandPair.size(); i ++, mBar->setValue(i)) { strCmd = slCommandPair.at(i); debugCmd = slCommandPair.at(i); strCmd = strCmd.toLower(); resParseCmd = parseSpecialCommand(strCmd, i + 1 < slCommandPair.size() ? slCommandPair.at(i + 1) : " ", error); qDebug() <<"ParseCmd: " << resParseCmd; if(resParseCmd != "-1" && error.isEmpty()) { mMemory->set(indexCmd, resParseCmd); debugList.append(strCmd); indexCmd ++; } else if(!error.isEmpty()) { fireError(error, indexCmd); return; } else { if(i < slCommandPair.size()) { if(i + 1 < slCommandPair.size()) { isRegistr = slCommandPair.at(i + 1); strCode = isRegistr.contains('r') || isRegistr.contains('R') ? mGenCode->getCode(strCmd + "R") : mGenCode->getCode(strCmd); } else { fireError("нет аргумента для команды: " + strCmd, indexCmd); return; } } else { fireError("нет аргумента для команды: " + strCmd, indexCmd); return; } if(strCode != "-1") { if((i + 1) < slCommandPair.size() ) { if(mGenCode->getCode(slCommandPair.at(i + 1)) == "-1") { i ++; strArg = slCommandPair.at(i); debugArg = strArg; parseArguments(strArg, typeAdrr); } else { fireError("не верный аргумент команды: " + strCmd, indexCmd); return; } } else { fireError("нет аргумента для команды: " + strCmd, indexCmd); return; } while(strArg.size() < 3) strArg.push_front("0"); strArg = strArg.replace('r', '0'); debugList.append(debugCmd + " " + debugArg); mMemory->set(indexCmd, strCode + typeAdrr + strArg); indexCmd ++; } else { if(out) { fireError(" не верная команда", indexCmd);return; } } } } updateLog(startTime); mDpanel->updateCode(debugList); }