예제 #1
0
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 + "`");
		}
	}
}
예제 #2
0
파일: qv_array.cpp 프로젝트: dabroz/dablang
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;
}
예제 #3
0
/* Функция компиляци
 * Осуществляется как проверки, так и вызовв других
 * функций для проверок или преобразваний.
 * Проверки на правельность написания мнемокода ассамблера
 * и заменна мнемокода на коды команд, так же замена символов
 * адресации на коды адресации, и также меток на их дресса
 * - Входные данные: исходные мнемокод ассамблера с виджета
 * - Выходные данные: записать данных в ячейки ОЗУ сформированных
 * во время выполнения функции
 */
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);
}