я написал парсер, который читает в текстовый файл с текстом в формате следующих типов:Ошибка преобразования десятичной в двоичную в строке
a r3, r2, r1
ah r8, r5, r6, r7
ai r10, i10, r127
число для г может измениться, и начальные символы могут изменение. В основном то, что делает синтаксический анализатор, основано на начальных символах (a, ah и т. Д.), Оно будет определять значение кода операции и затем анализировать номера регистров и преобразовывать их в двоичные. Он объединит все эти значения вместе, чтобы создать 32-битную двоичную командную строку и вывести ее в текстовый файл.
При тестировании я столкнулся с ошибкой.
Вот мой код:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
#include <bitset>
using namespace std;
void main()
{
string instruction, input, OpCode;
int i = 0;
int format = 0;
vector<string> myString;
ifstream inFile;
inFile.open("myfile.txt");
//format 1 -> input: syntax/rt/ra/rb output -> opcode/rb/ra/rt
//format 2 -> input: syntax/rt/ra/rb/rc output -> opcode/rt/rb/ra/rc
//format 3 -> input: syntax/rt/ra output -> opcode/i7/ra/rt
//format 4 -> input: syntax/rt/ra output -> opcode/i10/ra/rt
//format 5 -> input: syntax/rt output -> opcode/i16/rt
if (inFile.is_open()){
cout << "test" << endl;
//Read until no more lines in text file to read
while (getline(inFile, input))
{
istringstream ss(input);
string token;
//Get the instruction token
getline(ss, token, ' ');
instruction = token;
//ADD WORD
if (instruction == "a"){
OpCode = "00011000000";
format = 1;
}
if (format == 1){
// Seperate the registers
//We have RA, RB, AND RT
//Convert the values into binary
string value;
while (getline(ss, token, ',')){
ss.ignore();
token.erase(0, 1); //Remove the "r" or "i" character from each string/register
myString.push_back(token);
}
for (int j = 0; j < myString.size(); j++)
{
cout << myString[j] << endl;
value = bitset<8>(myString[j]).to_string();
cout << value << endl;
OpCode = OpCode + value;
cout << OpCode << endl;
}
}
}
}
system("pause");
}
Для простоты я только положить 1, если заявление для команды добавить слово. Вход я использую для того чтобы испытать следующий:
a r3, r1, r2
Что он должен сделать, это посмотреть инструкцию является a
, поэтому OpCode
получает значение и это будет продолжаться, чтобы разобрать r3, r2, r1
. Он удалит r
и преобразует 3, 2 и 1 в его двоичное значение и поместит его в строку, которая объединена с OpCode, чтобы сформировать инструкцию длиной 32 бит. Вопрос, который у меня есть, - value = bitset<8>myString[j]).to_string();
. Visual Studio выдает следующее сообщение об ошибке при отладке:
Unhandled exception at 0X7712C52F in Assembler_Parser.exe: Microsoft C++ exception: std::invalid_arguement at memory location 0x0039F110.
Я не уверен, что сделать это. Это дает мне возможность сломаться или продолжить. Если я продолжу, он преобразует 3 в 00000000. На следующей итерации он правильно преобразует 2 в 00000010, но затем он выдает исключение для 1.
Im не уверен, почему это происходит.
'значение = BITSET <8> (Стой (MyString, J)) to_string();' «Ошибка. Не экземпляр перегруженной функции совпадает со списком аргументов типов аргументов: (станд :: Vector.>, int) " –
Noobgineer
@Noobgineer Я не видел, что' myString' был фактически вектором. Выберите лучшие имена переменных. – user6280310
И это исправлено! Tyvm !! – Noobgineer