深入探索计算器编译器:从基础到高级应用
1. 代码基础与错误处理
首先来看一些基础代码片段,这里涉及到树节点的释放和错误处理函数。
/* no subtree */ case 'K': free(a); break; default: printf("internal error: free bad node %c\n", a->nodetype); }这段代码用于处理树节点的释放,当节点类型为 ‘K’ 时,释放节点内存,否则输出内部错误信息。
接下来是两个树遍历函数,它们进行深度优先遍历,递归访问每个节点的子树,然后访问节点本身。eval函数从每次调用中返回树或子树的值,而treefree函数不需要返回任何值。
错误处理函数yyerror如下:
void yyerror(char *s, ...) { va_list ap; va_start(ap, s); fprintf(stderr, "%d: error: ", yylineno); vfprintf(stderr, s, ap); fprintf(stderr, "\n"); }这个版本的yyerror使用可变参数来接受printf风格的参数列表,在生成错误消息时非常方便。
主函