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
            parallelsy: write('||'); choicesy: write('|');
            sequencesy: write('->');
            inputsy:    write('?');  outputsy: write('!');
            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 ');
         newchan: write('chan');
         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}

