home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / pascal / qparser.arc / CALCSEM.PAS < prev    next >
Pascal/Delphi Source File  |  1985-02-11  |  3KB  |  62 lines

  1.   { CALCSEM:  Calculator-specific semantics. }
  2.   { Copyright (C) 1984 by QCAD Systems Inc., All Rights Reserved. }
  3.  
  4.   {*********************}
  5.   procedure APPLY(PFLAG, PRODLEN: int; TSEMP: semrecp);
  6.     { Apply customized for the calculator.  All operations are kept
  7.       track of on the semantic stack. }
  8.   begin
  9.     case pflag of
  10.       ASSIGN:   begin {Stmt -> <identifier> := Expr <eol>}
  11.                   semstack[stackx-3]^.symp^.symt := real_variable;
  12.                   semstack[stackx-3]^.symp^.rval
  13.                     := semstack[stackx-1]^.rval;
  14.                   write(semstack[stackx-3]^.symp^.sym, ':= ');
  15.                   write_value(semstack[stackx-1]^.rval);
  16.                   writeln
  17.                 end;
  18.       DIVIDE,   {Term -> Term / Fact}
  19.       MINUS,    {Expr -> Expr - Term}
  20.       MPY,      {Term -> Term * Fact}
  21.       PLUS:     {Expr -> Expr + Term}
  22.                 eval_binop(pflag, semstack[stackx-2], semstack[stackx],
  23.                            tsemp);
  24.       PRTVAL:   begin {Stmt -> Expr <eol>}
  25.                   if semstack[stackx-1]^.semt = float then begin
  26.                     { the value is good (assume that a message has
  27.                       already been printed if it is not). }
  28.                     write('= ');
  29.                     write_value(semstack[stackx-1]^.rval);
  30.                     writeln
  31.                   end
  32.                 end;
  33.       QUIT:     begin {Goal -> Stmts QUIT}
  34.                   { this output could also have been generated in
  35.                     the end_sem procedure. }
  36.                   writeln('Quitting.');
  37.                 end;
  38.       INTVAL:   begin {Primary -> <integer>}
  39.                   { convert the integer to floating point }
  40.                   tsemp^.semt := float;
  41.                   tsemp^.rval := semstack[stackx]^.numval
  42.                 end;
  43.       REALVAL:  begin {Primary -> <real>}
  44.                 end;
  45.       PARENS:   {Primary -> ( Expr )}
  46.                 { Copy the result of the expression. }
  47.                 tsemp^ := semstack[stackx-1]^;
  48.       UMINUS:   {Fact -> - Primary}
  49.                 eval_binop(uminus, semstack[stackx], nil, tsemp);
  50.       VARIABLE: begin {Primary -> <identifier>}
  51.                   if semstack[stackx]^.symp^.symt <> real_variable then
  52.                      writeln('Undefined variable ',
  53.                               semstack[stackx]^.symp^.sym)
  54.                   else begin
  55.                     tsemp^.semt := float;
  56.                     tsemp^.rval := semstack[stackx]^.symp^.rval
  57.                   end
  58.                 end;
  59.     end { apply case }
  60.   end;
  61.  
  62.