bool AbstractParser::parseUserCommands(const QString &input)
{
    if (tryParseGenericDoorCommand(input))
        return false;

    if (input.startsWith(prefixChar)) {
        auto view = StringView{input}.trim();
        if (view.isEmpty() || view.takeFirstLetter() != prefixChar)
            sendToUser("Internal error. Sorry.\r\n");
        else
            parseSpecialCommand(view);
        sendPromptToUser();
        return false;
    }

    return parseSimpleCommand(input);
}
Beispiel #2
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);
}