是这样的,我在做一个词法器,它扫描整个文本并且将分析好的 Token 写入一个队列里面。对于数字 Token 就存储数字,对于字符和字符串(不包括关键字)就要存储字符串,当然 Token 的类型是肯定会存储的。
结构是这样的
struct token_node
{
TokenKind type;
const char* string;
double number;
}
在处理时因为是一个字符一个字符的处理,所以在处理阶段用的是 string 来接收的字符,读取结束后再判断是否是关键字,如果是关键字就直接存储 type 不存储其他信息。
void lexer::GetString(const char * stream, size_t & index)
{
token_node newNode;
std::string tmpString;
newNode.string = "";
while ((stream[index] >= 'a' && stream[index] <= 'z') || (stream[index] >= 'A' && stream[index] <= 'Z')
|| stream[index] == '_' || (stream[index] >= '0' && stream[index] <= '9'))
{
char currentChar = userInputed[index];
tmpString += currentChar;
index++;
}
if (tmpString == "true")
{
newNode.type = TokenKind::KW_TRUE;
}
// 中间省略
else if (tmpString == "return")
{
newNode.type = TokenKind::KW_RETURN;
}
else
{
newNode.type = TokenKind::OBJ_UNDEFINED;
newNode.string = tmpString.data();
}
#if 0
if (newNode.type == TokenKind::OBJ_UNDEFINED)
{
std::cout << newNode.string << std::endl;
}
#endif
this->_queue.push(newNode);
#if 0
if (newNode.type == TokenKind::OBJ_UNDEFINED)
{
std::cout << this->_queue.front().string << std::endl
}
#endif
return;
}
那两个 #if 测试出来发现无论是 push 之前还是 push 之后得到的数据都是正常的,可是在这个函数执行完成之后返回时,数据就丢失了,变成了 "0"。对于数字也是同样方式处理的(写入 string 里面然后转换成数字存储),并没有丢失。
这里是std::string,函数调用完成后,tmpString析构,分配的data数据会被delete。
既然要使用string,token_node也用std::string吧,或者最好直接用堆分配的char数组。