Мне нужно создать синтаксический анализатор строк на С++. Я попытался использовать
vector<string> Tokenize(const string& strInput, const string& strDelims)
{
vector<string> vS;
string strOne = strInput;
string delimiters = strDelims;
int startpos = 0;
int pos = strOne.find_first_of(delimiters, startpos);
while (string::npos != pos || string::npos != startpos)
{
if(strOne.substr(startpos, pos - startpos) != "")
vS.push_back(strOne.substr(startpos, pos - startpos));
// if delimiter is a new line (\n) then add new line
if(strOne.substr(pos, 1) == "\n")
vS.push_back("\\n");
// else if the delimiter is not a space
else if (strOne.substr(pos, 1) != " ")
vS.push_back(strOne.substr(pos, 1));
if( string::npos == strOne.find_first_not_of(delimiters, pos) )
startpos = strOne.find_first_not_of(delimiters, pos);
else
startpos = pos + 1;
pos = strOne.find_first_of(delimiters, startpos);
}
return vS;
}
Это работает для 2X + 7cos (3Y)
(tokenizer("2X+7cos(3Y)","+-/^() \t");
)
Но дает ошибку времени выполнения для 2X
Мне нужно решение без Boost.
Я попробовал использовать токен-код String Toolkit (StrTk) С++
std::vector<std::string> results;
strtk::split(delimiter, source,
strtk::range_to_type_back_inserter(results),
strtk::tokenize_options::include_all_delimiters);
return results;
но он не дает токена в виде отдельной строки.
например: если я даю ввод как 2X + 3Y
выходной вектор содержит
2X +
3Y