问题描述
我用带有指向 Node 结构的指针的 bison 构建了一个 AST:
typedef struct Node {
enum node_type type;
Stmt *left;
struct Node *right;
} Node;
然后我以这种方式在野牛中打印它:
printf("%s\n",root->right->left->value_s.declaration->value_d.string);
printf("%s\n",root->right->left->value_s.declaration->id);
printf("%s\n",root->right->right->right->left->value_s.stdout->string);
它显示得很好,但我试图用外部函数打印它,然后我得到了分段错误。这是入门野牛生产:
program: stmts {
printf("---- PRINTING AST ----\n");
$$ = malloc(sizeof(Node));
$$->type = NODE_TYPE_NODE;
$$->left = NULL;
$$->right = $1;
Traversal($$);
}
;
void Traversal(struct Node *root) {
if(root->left == NULL && root->right == NULL)
printf("AST is empty.");
else {
switch (root->left->type) {
case NODE_TYPE_STMT_D:
TravDeclaration(root->left->value_s.declaration);
break;
/* other cases */
default:
printf("Error,check node_type.");
break;
}
if(root->right->type != NODE_TYPE_END)
Traversal(root->right);
}
}
我认为在调用外部函数时,指针的使用可能存在错误。如果我在问题中遗漏了什么,请告诉我,这是我第一次来到这里。
解决方法
switch (root->left->type)
如果 root->left
是 NULL
(在这种情况下是这样,因为您设置了 $$->left = NULL;
)而 root->right
不是,上面的行将取消引用 {{1} } 指针。
类似地,如果 NULL
是 root->right->type
而 NULL
不是。