procedure printtree(t:tree); procedure printId(id:alfa); var i:integer; begin i:=1; while i<=10 do if id[i]=' ' then i:=11 else begin write(id[i]); i:=i+1 end; write(' ') end; procedure printsy(sy:symbol); begin case sy of conssy:write('::'); orsy: write('or '); andsy:write('and '); eq: write('='); ne: write('<>'); le:write('<='); ge: write('>='); gt: write('>'); lt:write('<'); plus: write('+'); minus:write('-'); times: write('*'); over: write('/'); hdsy: write('hd '); tlsy: write('tl '); nullsy:write('null '); notsy: write('not ') end{case} end{printsy}; begin{printtree} if t<>nil then begin write('('); case t^.tag of ident: printId(t^.id); intcon: write(t^.n:1, ' '); boolcon: write(t^.b, ' '); charcon: write('''', t^.ch, ''' '); emptycon:write('()'); nilcon: write('nil '); lambdaexp: begin write('lambda '); printtree(t^.fparam); write('.'); printtree(t^.body) end; application: begin printtree(t^.fun); printtree(t^.aparam) end; unexp: begin printsy(t^.unopr); printtree(t^.unarg) end; binexp:begin printtree(t^.left); printsy(t^.binopr); printtree(t^.right) end; ifexp: begin write('if '); printtree(t^.e1); write('then '); printtree(t^.e2); write('else '); printtree(t^.e3) end; block: begin write('let '); if t^.decs^.recursive then write('rec '); printtree(t^.decs); writeln; write('in '); printtree(t^.exp) end; declist: begin printtree(t^.hd); if t^.tl <> nil then begin writeln(','); printtree(t^.tl) end end; decln: begin printId(t^.name); write('='); printtree(t^.val) end end{case}; write(')') end{t<>nil} end{printtree}; {\fB Print a Parse Tree. \fP}