gpt4 book ai didi

c++ - 词法分析器项目 - vector 未正确输出

转载 作者:行者123 更新时间:2023-11-28 05:14:04 27 4
gpt4 key购买 nike

我有以下代码,它是一个更大项目的一部分。这段代码应该做的是逐个字符地遍历行以查找“标记”。我在这段代码中寻找的 token 是一个 ID。其定义为一个字母后跟零个或多个数字或字母。

当检测到一个字母时,它会进入内部循环并遍历接下来的几个字符,将每个字符或字母添加到 idstring,直到它找到 ID 字符的结尾(在代码中定义)然后添加该 idstring 到一个 vector 。在该行的末尾,它应该输出 vector 的每个元素。我没有得到我需要的输出。我希望这些信息足以理解代码中发生的事情。如果有人能帮我解决这个问题,我会非常满意。谢谢!

我需要的输出:ab : ab

我得到的:a : a

#include <iostream>
#include <regex>
#include <string>
#include <vector>

int main()
{
std::vector<std::string> id;

std::regex idstart("[a-zA-Z]");
std::regex endID("[^a-z]|[^A-Z]|[^0-9]");

std::string line = "ab ab";

//Loops character by character through the line
//Adding each recognized token to the appropriate vector
for ( int i = 0; i<line.length(); i++ )
{
std::string tempstring(1,line[i]);
//Character is letter
if ( std::regex_match(tempstring,idstart) )
{
std::string tempIDString = tempstring;
int lineInc = 0;
for ( int j = i + 1; j<line.length(); j++)
{
std::string tempstring2(1,line[j]);
//Checks next character for end of potential ID
if ( std::regex_match(tempstring2,endID) )
{
i+=lineInc+1;
break;
}
else
{
tempIDString+=tempstring2;
lineInc++;
}
}
id.push_back(tempIDString);
}
}

std::cout << id.at(0) << " : " << id[1] << std::endl;
return 0;
}

最佳答案

这个问题已有 2.5 年历史,现在您看到它可能会发笑。您在找到匹配的第二个字符时break;内部for,因此您永远不会将tempstring2分配给tempstring1 .

但是让我们忘掉那段代码吧。这里没有好的设计。

你有一个使用 std::regex 的好主意,但你不知道它是如何工作的。

那么让我们看看正确的实现:

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <regex>

// Our test data (raw string). So, containing also \n and so on
std::string testData(
R"#( :-) IDcorrect1 _wrongID I2DCorrect
3FALSE lowercasecorrect Underscore_not_allowed
i3DCorrect,i4 :-)
}
)#");

std::regex re("(\\b[a-zA-Z][a-zA-Z0-9]*\\b)");

int main(void)
{
// Define the variable id as vector of string and use the range constructor to read the test data and tokenize it
std::vector<std::string> id{ std::sregex_token_iterator(testData.begin(), testData.end(), re, 1), std::sregex_token_iterator() };

// For debug output. Print complete vector to std::cout
std::copy(id.begin(), id.end(), std::ostream_iterator<std::string>(std::cout, "\n"));

return 0;
}

这完成了变量定义中的所有工作并通过调用范围构造函数。所以,一个典型的单行。

希望有人能从这段代码中学习。 . .

关于c++ - 词法分析器项目 - vector 未正确输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43013232/

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