高级计算器的实现与优化
1. 代码基础结构
在代码中,有几个关键的部分。首先是一段处理节点释放的代码:
/* no subtree */ case 'K': free(a); break; default: printf("internal error: free bad node %c\n", a->nodetype); }接着是两个树遍历的例程,它们进行深度优先遍历。eval例程返回树或子树的值,treefree则无需返回值。以下是yyerror和main函数:
void yyerror(char *s, ...) { va_list ap; va_start(ap, s); fprintf(stderr, "%d: error: ", yylineno); vfprintf(stderr, s, ap); fprintf(stderr, "\n"); } int main() { printf("> "); return yyparse(); }yyerror函数使用可变参数来接受printf风格的参数列表,在生成错误消息时很方便。
2. 构建 AST 计算器
该程序有三个源文件和一个头文件,使用 <