Metropoli BBS
VIEWER: asmbl.pas MODE: TEXT (CP437)
{****************************************************************************

                   Copyright (c) 1993,96 by Florian Klämpfl

 ****************************************************************************}

unit asmbl;

  interface

  uses
     globals,scanner,asmgen,hcodegen,symtable,tree;

     function assemble : ptree;


  implementation

    function assemble : ptree;

      var
         s,hs : string;
         c : char;
         ende : boolean;
         sym : psym;
         code : pasmlist;

      begin
         ende:=false;
         s:='';
         c:=asmgetchar;
         code:=new(pasmlist,init);
         while not(ende) do
           begin
              case c of
                 'A'..'Z','a'..'z','_' : begin
                      hs:='';
                      while ((ord(c)>=ord('A')) and (ord(c)<=ord('Z')))
                         or ((ord(c)>=ord('a')) and (ord(c)<=ord('z')))
                         or ((ord(c)>=ord('0')) and (ord(c)<=ord('9')))
                         or (c='_') do
                        begin
                           inc(byte(hs[0]));
                           hs[length(hs)]:=c;
                           {
                           hs:=hs+c;
                           }
                           c:=asmgetchar;
                        end;
                      if upper(hs)='END' then ende:=true
                      else s:=s+hs;
                   end;
                 #10 : begin
                          code^.concat(gennasmrec(DIRECT,S_NO,s));
                          s:='';
                          c:=asmgetchar;
                          write_line;
                       end;
                 {'~' : begin
                          hs:='';
                          c:=asmgetchar;
                          while c<>'~' do
                            begin
                               hs:=hs+c;
                               c:=asmgetchar;
                            end;
                          c:=asmgetchar;
                       end; }
                 #13 : c:=asmgetchar;
                 #26 : fatalerror(endoffile);
                 else
                   begin
                      inc(byte(s[0]));
                      s[length(s)]:=c;
                      c:=asmgetchar;
                   end;
              end;
           end;
         code^.insert(gennasmrec(DIRECT,S_NO,s));
         assemble:=genasmnode(code);
      end;

end.
[ RETURN TO DIRECTORY ]