home *** CD-ROM | disk | FTP | other *** search
- (*****************************************************************************)
- (* CALCSIMP.PAS *)
- (* *)
- (* Vereinfachen von Calc-Programmen *)
- (*****************************************************************************)
-
-
- PROCEDURE calcsimplify(VAR pptr : calc_prog);
-
- VAR pptr1,help1,help2 : calc_prog;
- op : INTEGER;
- dummy : calc_operand;
- arg1,arg2,simpleError : BOOLEAN;
- helpinstruct : calc_symbols;
-
- FUNCTION equal(pptr1,pptr2 : calc_prog) : BOOLEAN;
-
- VAR help1,help2 : calc_prog;
- check : BOOLEAN;
-
- BEGIN
- help1 := endof(pptr1);
- help2 := endof(pptr2);
- IF (pptr1 <> nil) AND (pptr2 <> nil) AND (help1 <> nil) AND (help2 <>
- nil)
- THEN
- BEGIN
- check := TRUE;
- REPEAT
- check := check AND (pptr1^.instruct = pptr2^.instruct);
- CASE pptr1^.instruct OF
- calc_const : check := check AND (pptr1^.operand = pptr2^.
- operand);
- calc_var : check := check AND (pptr1^.varindex = pptr2^.
- varindex)
- END;
- pptr1 := pptr1^.nextinst;
- pptr2 := pptr2^.nextinst
- UNTIL NOT check OR (pptr1 = help1^.nextinst) AND (pptr2 = help2^.
- nextinst);
- equal := check
- END
- ELSE
- equal := FALSE
- END;
-
- FUNCTION compute(pptr,pptr1,pptr2 : calc_prog) : calc_operand;
-
- VAR exptr,a,b,c : calc_prog;
- vardummy : calc_vartab;
-
- BEGIN
- IF heapavail > 160.0
- THEN
- BEGIN
- vardummy := newvartab;
- New(a);
- New(b);
- New(c);
- a^ := pptr^;
- b^ := pptr1^;
- IF pptr2 <> nil
- THEN
- c^ := pptr2^;
- a^.nextinst := nil;
- New(exptr);
- exptr^.nextinst := b;
- IF pptr2 <> nil
- THEN
- BEGIN
- b^.nextinst := c;
- c^.nextinst := a
- END
- ELSE
- b^.nextinst := a;
- compute := calcexpression(exptr,vardummy);
- SimpleError := SimpleError or not calcresult;
- Dispose(a);
- Dispose(b);
- Dispose(c);
- Dispose(exptr);
- killvartab(vardummy)
- END
- else
- BEGIN
- compute := 0.0;
- SimpleError := true
- END
- END;