虎书P8问题(1)
见《虎书》中文版第8页;我的答案:
#ifndef P8Q1_H#define P8Q1_H#include "slp.h"int resolveStm(A_stm stm);int resolveExp(A_exp exp);int resolveExpList(A_expList expList);int countExpInExpList(A_expList expList);#endif
#include "p8q1.h"int resolveStm(A_stm stm){ int temp1 = 0, temp2 = 0; if(stm->kind == A_compoundStm){temp1 = resolveStm(stm->u.compound.stm1);temp2 = resolveStm(stm->u.compound.stm2);return temp1>temp2? temp1:temp2; }else if(stm->kind == A_assignStm){return resolveExp(stm->u.assign.exp); }else if(stm->kind == A_printStm){// the way out return countExpInExpList(stm->u.print.exps); }else{return 0; }}int countExpInExpList(A_expList expList){ if(expList->kind == A_lastExpList){return 1; }else if(expList->kind == A_pairExpList){return 1 + countExpInExpList(expList->u.pair.tail); }else{return 0; }}int resolveExpList(A_expList expList){ int temp1,temp2; if(expList->kind == A_pairExpList){temp1 = resolveExp(expList->u.pair.head);temp2 = resolveExpList(expList->u.pair.tail);return temp1>temp2?temp1:temp2; }else if(expList->kind == A_lastExpList){return resolveExp(expList->u.last); }else{return 0; }}int resolveExp(A_exp exp){ int temp1,temp2; if(exp->kind == A_idExp){return 0; }else if(exp->kind == A_numExp){return 0; }else if(exp->kind == A_opExp){temp1 = resolveExp(exp->u.op.left);temp2 = resolveExp(exp->u.op.right);return temp1>temp2?temp1:temp2; }else if(exp->kind == A_eseqExp){temp1 = resolveStm(exp->u.eseq.stm);temp2 = resolveExp(exp->u.eseq.exp);return temp1>temp2?temp1:temp2; }else{return 0; }}
main.c:
#include <stdio.h>#include "util.h"#include "prog1.h"#include "slp.h"#include "p8q1.h"main(){ printf("%d\n",resolveStm(prog()));}
输出结果:2
体会:对于“目标”需要特殊处理,“目标”就是解析程序的出口。
页:
[1]