所以,这就是故事。我正在尝试创建一个递归下降解析器,它对一个字符串进行标记,然后从这些标记中创建一个节点树。
我的主要课程的所有指针都在工作......如果你之前使用过 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; =}
}