// Pre-Processamento: // Remove os comentarios e linhas em branco // E coloca o codigo numa estrutura do tipo CodeLines // Tambem verifica os labels e equs e ifs void readAndPreProcess (const char* fileName) { ifstream infile(fileName); string line; int textMemAddr = textStartAddress; int dataMemAddr = 0; int BSSMemAddr = 0; stringstream tempSS; CodeSection codeSection = NONE; // Le linha a linha for (int lineCount = 1; getline(infile, line); ++lineCount) { // Troca virgulas por espaco strReplace(line, ",", " "); // Ignora linhas em branco if (line.empty()) continue; // Pega palavra a palavra de acordo com os espacos istringstream iss(line); string tempStr; while (iss >> tempStr) { if ("SECTION" == tempStr) { string tempStr2; iss >> tempStr2; if ("TEXT" == tempStr2) codeSection = TEXT; else if ("DATA" == tempStr2) codeSection = DATA; codeLines[lineCount].push_back(tempStr); codeLines[lineCount].push_back(tempStr2); continue; } // Ignora comentarios if (";" == tempStr.substr(0,1)) break; // Desconsidera o caso (maiusculas/minusculas) transform(tempStr.begin(), tempStr.end(), tempStr.begin(), ::toupper); // Ve se eh um label / define if (":" == tempStr.substr(tempStr.length() - 1, 1)) { // Ve se ainda restam tokens na linha if (iss.rdbuf()->in_avail() != 0) { // Remove o ':' tempStr = tempStr.substr(0, tempStr.length() - 1); string tempStr2; iss >> tempStr2; // Ve se o proximo token eh EQU if ("EQU" == tempStr2) { string tempStr3; iss >> tempStr3; // Se define já existe if (defines.find(tempStr3) != defines.end()){ tempSS << lineCount; errors.push("ERRO NA LINHA " + tempSS.str() + ": EQU ja declarado."); tempSS.str(""); } else { // Coloca o valor do EQU na tabela de defines defines[tempStr] = tempStr3; } // Se nao eh so um label // Com algo a mais na mesma linha } else { if ( (labels.find(tempStr) != labels.end()) || (dataLabels.find(tempStr) != dataLabels.end()) ){ tempSS << lineCount; errors.push("ERRO NA LINHA " + tempSS.str() + ": Label ja declarado."); tempSS.str(""); } else { // Adiciona na tabela de labels if(codeSection == TEXT){ labels[tempStr] = textMemAddr; } else if (codeSection == DATA) { dataLabels[tempStr] = dataMemAddr; dataMemAddr += 4; } } // Adiciona endereco de memoria if (instructions.find(tempStr2) != instructions.end()) textMemAddr += get<3>(instructions[tempStr2]); // Adiciona os tokens ao vetor codeLines[lineCount].push_back(tempStr+":"); codeLines[lineCount].push_back(tempStr2); } // Se nao eh um label "sozinho" // Adiciona no vetor } else {