理想の行動に各区切り文字を入れる:'#'
後トークン化文字列、およびそれ自身のトークン
- すべてが(
#
=コメント)を無視しています。- 空の行はトークンを作成しません。
- '{'は
BLOCK_OPEN
のトークンを作成します。- '}'はタイプ
BLOCK_CLOSE
のトークンを作成します。- '='は、タイプ
EQUALS
のトークンを作成します。- 他のすべては、タイプ
LABEL
のトークンを作成します。- トークンは空のスペース(S)ほとんどの入力の場合
、完璧に私のトークン化機能を持っていてはいけません。
show_position = {X = -9 Y = 78}
注スペースの欠如一個のバグを除いて!
返されるベクトルに"x"
と"-9"
の間に"="
がありません。
どうすればこのバグを修正できますか?私はデバッグしようとしましたが、何がうまくいかないのか分かりませんでした。新鮮な眼のペアは恩恵です。
これは私がトークン化する方法である:
std::vector<Token> tokenizeLine(const std::string str)
{
std::vector<Token> tokens;
std::string::size_type start = 0;
std::string::size_type end = 0;
while (end != std::string::npos)
{
enum POSES
{
EQUALS,
OPEN,
CLOSE,
SPACE,
EOL,
RETURN,
TAB,
COMMENT,
POSES_SIZE
};
std::string::size_type pos[] =
{
str.find('=', start),
str.find('{', start),
str.find('}', start),
str.find(' ', start),
str.find('\n', start),
str.find('\r', start),
str.find('\t', start),
str.find('#', start)
};
end = *std::min_element(pos, &pos[POSES_SIZE]);
switch (str[start])
{
case('=') :
tokens.push_back(Token(Token::EQUALS, "="));
break;
case('{') :
tokens.push_back(Token(Token::BLOCK_OPEN, "{"));
break;
case('}') :
tokens.push_back(Token(Token::BLOCK_CLOSE, "}"));
break;
case(' ') :
case('\n') :
case('\r') :
case('\t'):
break;
case('#') :
return tokens;
break;
default:
if(str.substr(start, end - start).length() > 0)
tokens.push_back(Token(Token::LABEL, str.substr(start, end - start)));
}
// If at end, use start=maxSize. Else use start=end+delimiter.
start = ((end > (std::string::npos - sizeof(char)))
? std::string::npos : end + sizeof(char));
}
return tokens;
}
は、ここでは、あなたの家の快適さで実行することができるものです。
std::vector<std::string> tokenizeLine(const std::string str)
{
std::vector<std::string> tokens;
std::string::size_type start = 0;
std::string::size_type end = 0;
while (end != std::string::npos)
{
enum POSES // Deliminators
{
EQUALS,
OPEN,
CLOSE,
SPACE,
EOL,
RETURN,
TAB,
COMMENT,
POSES_SIZE
};
std::string::size_type pos[] =
{
str.find('=', start),
str.find('{', start),
str.find('}', start),
str.find(' ', start),
str.find('\n', start),
str.find('\r', start),
str.find('\t', start),
str.find('#', start)
};
end = *std::min_element(pos, &pos[POSES_SIZE]);
switch (str[start])
{
case('=') :
tokens.push_back("=");
break;
case('{') :
tokens.push_back("{");
break;
case('}') :
tokens.push_back("}");
break;
case(' ') :
case('\n') :
case('\r') :
case('\t'):
break;
case('#') :
return tokens;
break;
default:
if(str.substr(start, end - start).length() > 0)
tokens.push_back(str.substr(start, end - start));
}
// If at end, use start=maxSize. Else use start=end+delimiter.
start = ((end > (std::string::npos - sizeof(char)))
? std::string::npos : end + sizeof(char));
}
return tokens;
}
@NathanOliver与えられたコードが意図したとおりに機能しないため、コードレビューで話題にならないでしょう。 – syb0rg
申し訳ありませんが明確ではありません。問題を明らかにするために質問を編集しました。 –
@IvanRubinson 2番目のコードは正常に動作します:http://ideone.com/i1tRr8 MCVEを提供してください。 – alexeykuzmin0