gpt4 book ai didi

C++ vector 和段错误

转载 作者:行者123 更新时间:2023-11-30 02:04:51 25 4
gpt4 key购买 nike

我正在开发一个简单的数学解析器。只是读取 number = 1 + 2;

的东西

我有一个包含这些标记的 vector 。它们存储字符的类型和字符串值。我正在尝试通过 vector 来构建这些标记的 AST,但我一直遇到段错误,即使我认为我的代码应该可以防止这种情况发生。

这是构建 AST 的代码:

struct ASTGen
{
const vector<Token> &Tokens;
unsigned int size,
pointer;

ASTGen(const vector<Token> &t) : Tokens(t), pointer(0)
{
size = Tokens.size() - 1;
}

unsigned int next()
{
return pointer + 1;
}

Node* Statement()
{
if(next() <= size)
{
switch(Tokens[next()].type)
{
case EQUALS
:
Node* n = Assignment_Expr();
return n;
}
}

advance();
}

void advance()
{
if(next() <= size) ++pointer;
}

Node* Assignment_Expr()
{
Node* lnode = new Node(Tokens[pointer], NULL, NULL);
advance();
Node* n = new Node(Tokens[pointer], lnode, Expression());
return n;
}

Node* Expression()
{
if(next() <= size)
{
advance();
if(Tokens[next()].type == SEMICOLON)
{
Node* n = new Node(Tokens[pointer], NULL, NULL);
return n;
}

if(Tokens[next()].type == PLUS)
{
Node* lnode = new Node(Tokens[pointer], NULL, NULL);
advance();
Node* n = new Node(Tokens[pointer], lnode, Expression());
return n;
}
}
}
};

...

ASTGen AST(Tokens);
Node* Tree = AST.Statement();
cout << Tree->Right->Data.svalue << endl;

我可以访问 Tree->Data.svalue 并获取 = 节点的 token 信息,所以我知道该节点正在生成,我还可以获取 >Tree->Left->Data.svalue 并获取=

左边的变量

我已经多次重写它,尝试使用不同的方法逐步遍历 vector ,但是当我尝试访问 = 正确的节点(应该是 +节点)

如有任何帮助,我们将不胜感激。

最佳答案

还有很多我们没有看到的代码,所以我不能准确地告诉你发生了什么,但我看到了一些值得关注的事情。一是 Statement() 方法并不总是返回一个值。如果第一个 if 测试没有通过,那么我们调用 advance() 并在没有显式返回的情况下退出例程的底部。调用者将尝试获取函数的返回值,但它会得到垃圾。这可能会导致各种问题,包括两次 free() 调用等,这些很容易导致段错误。

Expression() 也有同样的问题。

关于C++ vector 和段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060613/

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