Я пытаюсь кодировать NFA в C ++, который может распознать строку и определить, принята или отклонена эта строка. У меня есть строковый вход, который будет оцениваться как входящий.
Тем не менее, как только я перехожу к нему в функцииvaluInput () (в третьем вложенном цикле for, в операторе if), по какой-то причине программа не будет компилироваться, потому что она говорит, что in.at (i) считается int, поэтому нельзя сравнивать со строкой.
Я не понимаю, почему во всей программе это строка, но когда к ней обращаются, она внезапно становится int?
Я получаю следующую ошибку:
error: invalid operands to binary expression ('int' and
'string' (aka 'basic_string<char, char_traits<char>, allocator<char> >'))
if(in[i] == currStates[j].transitions[k].symb)
Я предоставил весь свой код, если это поможет.
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <stdlib.h>
#include <vector>
using namespace std;
string num, SoA1, SoA2, currentState, symbol, tranState;
struct Transition;
struct State{
bool startS = false;
bool acceptS = false;
string sym;
vector<Transition> transitions;//transition between states
};
struct Transition{
string symb;
State to;
State from;
};
struct NFA{
vector<State> NFAStates;
State start;
};
void evaluateInput(string in, NFA F)
{
vector<State> currStates;
currStates.push_back(F.start);
if(in[1] == "1")
{
cout << "yes" << endl;
}
for(int i = 0; i < in.length(); i++)
{
cout << "input #: " << in[i] << endl;
vector<State> next;
for(int j = 0; j < currStates.size(); j++)
{
for(int k = 0; k < currStates[j].transitions.size(); k++)
{
if(in.at(i) == currStates[j].transitions[k].symb)
{
next.push_back(currStates[j].transitions[k].to);
}
}
}
currStates = next;
}
}
int main(int argc, char* argv[])
{
char* fileName;
string stringInput;
if(argc > 1)
{
fileName = argv[1];
stringInput = argv[2];
//cout << stringInput << endl;
}
ifstream file(fileName);
if(file.is_open())
{
NFA FA;
string line;
while(getline(file, line)){
//cout << "1: " << line << endl;
string ST;
stringstream ss(line);
getline(ss, ST, '\t');
if(ST == "state")
{
State S;
getline(ss, num, '\t');
getline(ss, SoA1, '\t');
getline(ss, SoA2);
int num_i = stoi(num);
S.sym = num_i;
if((SoA1 == "start") || (SoA2 == "start"))
{
S.startS = true;
}
if((SoA1 == "accept") || (SoA2 == "accept"))
{
S.acceptS = true;
}
FA.NFAStates.push_back(S);
if(S.startS == true){
FA.start = S;
}
}else if(ST == "transition")
{
Transition T;
getline(ss, currentState, '\t');
getline(ss, symbol, '\t');
getline(ss, tranState);
int currentState_i = stoi(currentState);
int tranState_i = stoi(tranState);
T.symb = symbol;
for(int j = 0; j < FA.NFAStates.size(); j++)
{
if(FA.NFAStates[j].sym == tranState)
{
T.to = FA.NFAStates[j];
}
}
for(int i = 0; i < FA.NFAStates.size(); i++)
{
if(FA.NFAStates[i].sym == currentState)
{
T.from = FA.NFAStates[i];
FA.NFAStates[i].transitions.push_back(T);
}
}
}
}
evaluateInput(stringInput, FA);
}
}
Спасибо за помощь.
Задача ещё не решена.
Других решений пока нет …