gpt4 book ai didi

c++ - 避免从字符串流中获取任何东西

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:44 24 4
gpt4 key购买 nike

我正在为一个非常基本的 ISA 开发一个汇编程序。目前我正在实现解析器功能,我正在使用字符串流从行中获取单词。下面是汇编代码的示例:

; This program counts from 10 to 0
.ORIG x3000
LEA R0, TEN ; This instruction will be loaded into memory location x3000
LDW R1, R0, #0
START ADD R1, R1, #-1
BRZ DONE
BR START
; blank line
DONE TRAP x25 ; The last executable instruction
TEN .FILL x000A ; This is 10 in 2's comp, hexadecimal
.END

不要担心汇编代码的性质,只要看第 3 行,右边有注释的那一行。我的解析器函数不完整,但这是我所拥有的:

// Define three conditions to code
enum {DONE, OK, EMPTY_LINE};
// Tuple containing a condition and a string vector
typedef tuple<int,vector<string>> Code;

// Passed an alias to a string
// Parses the line passed to it
Code ReadAndParse(string& line)
{

/***********************************************/
/****************REMOVE COMMENTS****************/
/***********************************************/
// Sentinel to flag down position of first
// semicolon and the index position itself
bool found = false;
size_t semicolonIndex = -1;

// Convert the line to lowercase
for(int i = 0; i < line.length(); i++)
{
line[i] = tolower(line[i]);

// Find first semicolon
if(line[i] == ';' && !found)
{
semicolonIndex = i;
// Throw the flag
found = true;
}
}

// Erase anything to and from semicolon to ignore comments
if(found != false)
line.erase(semicolonIndex);


/***********************************************/
/*****TEST AND SEE IF THERE'S ANYTHING LEFT*****/
/***********************************************/

// To snatch and store words
Code code;
string token;
stringstream ss(line);
vector<string> words;

// While the string stream is still of use
while(ss.good())
{
// Send the next string to the token
ss >> token;
// Push it onto the words vector
words.push_back(token);

// If all we got was nothing, it's an empty line
if(token == "")
{
code = make_tuple(EMPTY_LINE, words);
return code;
}
}

/***********************************************/
/***********DETERMINE OUR TYPE OF CODE**********/
/***********************************************/


// At this point it should be fine
code = make_tuple(OK, words);
return code;
}

如您所见,Code 元组包含一个条件,该条件以枚举减速和包含该行中所有单词的 vector 表示。我想要的是将一行中的每个单词都插入 vector 然后返回。

问题出现在函数的第三次调用(汇编代码的第三行)。我使用 ss.good() 函数来确定字符串流中是否有任何单词。由于某种原因,即使第三行中没有第四个单词,ss.good() 函数也会返回 true,我最终将单词 [lea] [r0,] [ten] 和 [ten] 插入了 vector 。 ss.good() 在第四次调用时为真, token 没有收到任何东西,因此我将 [十] 插入 vector 两次。

我注意到如果我删除分号和最后一个单词之间的空格,则不会发生此错误。我想知道如何将正确数量的单词推送到 vector 中。

请不要推荐 Boost 库。我喜欢图书馆,但我想让这个项目保持简单。这没什么大不了的,这个处理器只有十几条指令。另外,请记住,此功能只是半生不熟,我正在逐步测试和调试它。

最佳答案

流的错误标志仅在条件(例如到达流的末尾)发生后设置。

尝试将循环条件替换为:

while(ss >> token)
{
// Push it onto the words vector
words.push_back(token);

// If all we got was nothing, it's an empty line
if(token == "")
{
code = make_tuple(EMPTY_LINE, words);
return code;
}
}

通过这段代码,我得到了第 3 行的以下标记:

"LEA"
"R0,"
"TEN"
";"
"This"
"instruction"
"will"
"be"
"loaded"
"into"
"memory"
"location"
"x3000"

我知道您要解析的语言很简单。尽管如此,如果您考虑使用专门的工具来完成这项工作,您会帮自己一个忙,例如 flex。 .

关于c++ - 避免从字符串流中获取任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6196825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com