From df5ca5be09ad90baba4aa6c97e979cf5424d2d9c Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 18 Aug 1998 20:51:32 +0000 Subject: [PATCH] * fixed bug 42 --- compiler/asmutils.pas | 136 ++++++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 66 deletions(-) diff --git a/compiler/asmutils.pas b/compiler/asmutils.pas index a37d85ae2e..3e7d47e23f 100644 --- a/compiler/asmutils.pas +++ b/compiler/asmutils.pas @@ -451,6 +451,7 @@ begin end; end; + Function TExprParse.Evaluate(Expr : String):longint; Var I : Integer; @@ -462,78 +463,78 @@ begin Token := ''; For I := 1 to Length(Expr) DO - + begin if Expr[I] in ['0'..'9'] then begin { Build multi-digit numbers } - Token := Token + Expr[I]; - if I = Length(Expr) then { Send last one to calculator } - RPNCalc(Token,false); + Token := Token + Expr[I]; + if I = Length(Expr) then { Send last one to calculator } + RPNCalc(Token,false); end else - if Expr[I] in ['+', '-', '*', '/', '(', ')','^','&','|','%','~','<','>'] then - begin - if Token <> '' then - begin { Send last built number to calc. } - RPNCalc(Token,false); - Token := ''; + if Expr[I] in ['+', '-', '*', '/', '(', ')','^','&','|','%','~','<','>'] then + begin + if Token <> '' then + begin { Send last built number to calc. } + RPNCalc(Token,false); + Token := ''; + end; + + Case Expr[I] OF + '(' : OpPush('(',false); + ')' : begin + While OpStack[OpTop].ch <> '(' DO + Begin + OpPop(opr); + RPNCalc(opr.ch,opr.is_prefix); + end; + OpPop(opr); { Pop off and ignore the '(' } + end; + '+','-','~' : Begin + { workaround for -2147483648 } + if (expr[I]='-') and (expr[i+1] in ['0'..'9']) then + begin + token:='-'; + expr[i]:='+'; + end; + { if start of expression then surely a prefix } + { or if previous char was also an operator } + if (I = 1) or (not (Expr[I-1] in ['0'..'9','(',')'])) then + OpPush(Expr[I],true) + else + Begin + { Evaluate all higher priority operators } + While (OpTop > 0) AND (Priority(Expr[I]) <= Priority(OpStack[OpTop].ch)) DO + Begin + OpPop(opr); + RPNCalc(opr.ch,opr.is_prefix); + end; + OpPush(Expr[I],false); + End; + end; + '*', '/', + '^','|','&', + '%','<','>' : begin + While (OpTop > 0) and (Priority(Expr[I]) <= Priority(OpStack[OpTop].ch)) DO + Begin + OpPop(opr); + RPNCalc(opr.ch,opr.is_prefix); + end; + OpPush(Expr[I],false); + end; + end; { Case } + end + else + Error(invalid_op); { Handle bad input error } end; - Case Expr[I] OF - '(' : OpPush('(',false); - ')' : - begin - While OpStack[OpTop].ch <> '(' DO - Begin - OpPop(opr); - RPNCalc(opr.ch,opr.is_prefix); - end; - OpPop(opr); { Pop off and ignore the '(' } - end; +{ Pop off the remaining operators } + While OpTop > 0 do + Begin + OpPop(opr); + RPNCalc(opr.ch,opr.is_prefix); + end; - '+','-','~': Begin - While (OpTop > 0) AND - (Priority(Expr[I]) <= Priority(OpStack[OpTop].ch)) DO - Begin - OpPop(opr); - RPNCalc(opr.ch,opr.is_prefix); - end; - { if start of expression then surely a prefix } - { or if previous char was also an operator } - { push it and don't evaluate normally } - { workaround for -2147483648 } - if (expr[I]='-') and (expr[i+1] in ['0'..'9']) then - begin - token:='-'; - expr[i]:='+'; - end; - if (I = 1) or (not (Expr[I-1] in ['0'..'9','(',')'])) then - OpPush(Expr[I],true) - else - OpPush(Expr[I],false); - end; - - '*', '/','^','|','&','%','<','>' : - begin - While (OpTop > 0) AND - (Priority(Expr[I]) <= Priority(OpStack[OpTop].ch)) DO - Begin - OpPop(opr); - RPNCalc(opr.ch,opr.is_prefix); - end; - OpPush(Expr[I],false); - end; - end; { Case } - end - else Error(invalid_op); - { Handle bad input error } - - While OpTop > 0 do { Pop off the remaining operators } - Begin - OpPop(opr); - RPNCalc(opr.ch,opr.is_prefix); - end; - - { The result is stored on the top of the stack } +{ The result is stored on the top of the stack } Evaluate := RPNPop; end; @@ -1628,7 +1629,10 @@ end; end. { $Log$ - Revision 1.6 1998-08-10 14:49:40 peter + Revision 1.7 1998-08-18 20:51:32 peter + * fixed bug 42 + + Revision 1.6 1998/08/10 14:49:40 peter + localswitches, moduleswitches, globalswitches splitting Revision 1.5 1998/07/14 21:46:38 peter