gpt4 book ai didi

c++ - 如何解析结构化格式?

转载 作者:行者123 更新时间:2023-11-28 03:42:38 26 4
gpt4 key购买 nike

我有一个字符串,我想在结构 block 上解析它。

因此,字符串结构如下:

if(true) {
if(true) {
if(true) {}
}
}
if(true) {
if(true) {
if(true) {}
}
}

我想像这样在父 block 上拆分一个:

if(true) {
if(true) {
if(true) {}
}
},

if(true) {
if(true) {
if(true) {}
}
}

我的代码:

string condition = 
"if(true) {\
if(true) {\
if(true) {}\
}\
}\
if(true) {\
if(true) {\
if(true) {}\
}\
}";

string item;
stringstream stream(condition);
vector<string> array;

//splitting on sections
while (getline(stream, item, '}')) {
array.push_back(item + "}");
}

for(int i = 0; i < array.size(); i++) {
cout << i << array[i] << endl;
}

结果:

0 if(true) { if(true) { if(true) {}
1 }
2 }
3 if(true) { if(true) { if(true) {}
4 }
5 }

但需要:

0 if(true) { if(true) { if(true) {} } }
1 if(true) { if(true) { if(true) {} } }

如何更正确地检测和解析父 block 或告诉算法?

最佳答案

您需要记录当前的深度。我发现最好的解析器是基于迭代器的,所以这就是我将在这里展示的内容。 std::getline 对于解析不是很有用,除非是最简单的格式。

完全未经测试的代码:

std::vector<std::string> vec;

int depth = 0;
std::string::const_iterator first = condition.begin(),
last = condition.end(),
iter = first;

for(;;)
{
iter = std::find_if(iter, last,
[](char ch) { return ch == '{' || ch == '}'; });

if(iter == last)
{
if(depth)
{
throw std::runtime_error("unclosed block found.");
}

break;
}

if(*iter == '{')
{
++depth;
++iter;
}
else if(*iter == '}' && !--depth)
{
v.push_back(std::string(first, ++iter));
first = iter;
}
else
{
++iter;
}
}

关于c++ - 如何解析结构化格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631164/

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