0

所以,这就是故事。我正在尝试创建一个递归下降解析器,它对一个字符串进行标记,然后从这些标记中创建一个节点树。

我的主要课程的所有指针都在工作......如果你之前使用过 RDP,那么你就会知道我在说什么程序 -> 语句 -> assignStmt ......等等。这个想法是程序节点有一个指向语句节点等的子节点。

这就是问题所在。当我到达树节点的末尾时,我指向的是标记器从字符串创建的实际标记。

所以,假设字符串是:

 firstvar = 1;

在这种情况下,有 4 个标记 [{id} firstvar]、[{assignment} =]、[{number} 1]、[{scolon}]

我希望我的 assignStmt 节点指向该语句的非装饰器部分。即,assignStmt 的 child1 将是 [{id} firstvar],而 child2 将是 [{number} 1] ...

然而。当我将 child1 分配给 [{id} firstvar],然后继续前进到下一个标记时,child1 的值会随着我的前进而改变。因此,如果我将全局令牌更改为下一个令牌(在本例中为 [{assignment} =] ),则 assignStmt 的 child1 会随之更改。

为什么是这样?我能做些什么?!谢谢!

TOKEN* getNextToken(void); 
//only shown here to you know the return... it's working properly elsewhere

typedef struct node {
    TOKEN *data;

    struct node *child1, *child2, *child3, *child4, *parent;

} node;

TOKEN *token;
Symbol sym;
struct node *root;

void getsym() 
{
    token = getNextToken();
    sym = token->sym;
}

int main()
{
    getsym();
    //So, right now, from getsym() the global token has the value {identifier; firstvar} 

    struct node* tempNode;
    tempNode = (struct node*) calloc(1, sizeof(struct node));
    tempNode->child1 = tempNode->child2 = tempNode->child3 = tempNode->child4 =  NULL;
    tempNode->data = token;

    getsym();
    //BUT NOW from getsym() the global token has the value {assignment; =}, and 
    //subsequently the tempNode->data has changed from what it should be 
    //{identifier; firstvar} to what the global token's new value is: {assignment; =}

}
4

2 回答 2

2

由于我的声誉低,我无法对此发表评论,我将添加这个答案,如果已经理解您的问题,您可能正在传递一个指向函数的指针,问题是您可能需要一个指向指针的指针,而不仅仅是一个指针。

在 C 中,当您将值传递给函数时,您是通过值而不是通过引用传递它们,这意味着该函数会生成该参数的本地副本,并且它仅适用于该本地副本,问题是所有更改都会影响只有本地副本,当函数终止时,如果您不能正确处理,所有更改都将丢失。

于 2012-10-10T21:21:02.960 回答
1

您正在返回一个指向全局变量的指针,即使您修改了全局变量,该指针也将始终相同。

解决方案是每次分配一个新对象,或者根本不使用指针并直接返回结构并让编译器处理结构内部值的复制。

于 2012-10-11T07:09:40.057 回答