我正在写一个lex扫描器,我在其中定义一个数组如下:
// array of vector<string>
std::vector<std::string> Lexicals[5] = {
// [0] OPERATORS (pre-initialized with values)
{"...", "..."},
// [1] PUNCTUATIVES (pre-initialized with values)
{"...", "..."},
// [2] KEYWORDS (pre-initialized with values)
{"...", "..."},
// [3] IDENTIFIERS - add as found
std::vector<std::string>(),
// [4] LITERALS - add as found
std::vector<std::string>()
};
使用以下enum
,我可以评估lexType
并按vector
值(0 - 4)获取匹配的enum
:
enum LexType {
OPERATOR,
PUNCTUATION,
KEYWORD,
IDENTIFIER,
LITERAL
};
导致问题的是IDENTIFIER
和LITERAL
选项。以下逻辑尝试检索正确的向量容器,并添加新值并标识位置或标识现有值的位置:
case LexType::IDENTIFIER:
case LexType::LITERAL: {
string val(read_buffer(), m_length);
// Lexicals[3] || [4]
vector<string> lex = Lexicals[m_lexType];
vector<string>::iterator it;
// make sure value is not already in the vector
if(!lex.empty()){
it = find(lex.begin(), lex.end(), val);
if(it == lex.end()) {
lex.push_back(val);
it = std::find(lex.begin(), lex.end(), val);
}
} else {
lex.push_back(val);
it = find(lex.begin(), lex.end(), val);
}
m_lexical = it - lex.begin();
}
break;
在第一次传递后的每次迭代中,绕过!lex.empty()
。我只想弄清楚发生了什么。
答案 0 :(得分:3)
问题很可能是这一行:
vector<string> lex = Lexicals[m_lexType];
在这里,您可以通过值获取向量,这意味着已复制。然后,当您稍后执行lex.push_back(val)
时,您只会附加到副本而不是原始矢量。
而是将lex
作为实际(原始)向量的引用:
vector<string>& lex = Lexicals[m_lexType];