Skip to content

Commit

Permalink
fix: operator precedence issue
Browse files Browse the repository at this point in the history
  • Loading branch information
martok committed Oct 12, 2011
1 parent ab15223 commit 5fe87b2
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions uMath.pas
Expand Up @@ -764,9 +764,10 @@ TToken= record
end; end;


procedure Fold(L,R: integer); procedure Fold(L,R: integer);
var i,A,ll,rr:integer; var i,A,eid,ll,rr:integer;
tmp: IExpression; tmp: IExpression;
b: pchar; b: pchar;

function NextR(k: integer): integer; function NextR(k: integer): integer;
var j:integer; var j:integer;
begin begin
Expand Down Expand Up @@ -868,9 +869,12 @@ TToken= record
end; end;


//finally, operators //finally, operators
// Note: this wastes some extra iterations per Prio-Class, just ignore that, okay?
for A:= 0 to high(Expressions) do begin for A:= 0 to high(Expressions) do begin
for i:= L to R do for i:= L to R do
if (Tokens[i].Kind=tokOperator) and (Tokens[i].OpIdx=A) then begin if (Tokens[i].Kind=tokOperator) and
(Expressions[Tokens[i].OpIdx].P=Expressions[A].P) then begin
eid:= Tokens[i].OpIdx;
rr:= NextR(i); rr:= NextR(i);
ll:= NextL(i); ll:= NextL(i);


Expand All @@ -880,15 +884,15 @@ TToken= record
if Tokens[rr].Kind<>tokExpression then if Tokens[rr].Kind<>tokExpression then
raise ESyntaxError.CreateFmt('Position %d: expected expression, found %s',[Tokens[rr].Pos, Tokens[rr].Value]); raise ESyntaxError.CreateFmt('Position %d: expected expression, found %s',[Tokens[rr].Pos, Tokens[rr].Value]);


if (Expressions[A].Cls = TE_Subtraction) and if (Expressions[eid].Cls = TE_Subtraction) and
((ll<0) or (Tokens[ll].Kind<>tokExpression)) then begin ((ll<0) or (Tokens[ll].Kind<>tokExpression)) then begin
tmp:= TE_Negation.Create; tmp:= TE_Negation.Create;
tmp.RHS:= Tokens[rr].Expr; tmp.RHS:= Tokens[rr].Expr;
end else begin end else begin
tmp:= Expressions[A].Cls.Create; tmp:= Expressions[eid].Cls.Create;


tmp.RHS:= Tokens[rr].Expr; tmp.RHS:= Tokens[rr].Expr;
if not Expressions[A].Unary then begin if not Expressions[eid].Unary then begin
if ll<0 then if ll<0 then
raise ESyntaxError.CreateFmt('Position %d: Operator has no LHS',[Tokens[i].Pos]); raise ESyntaxError.CreateFmt('Position %d: Operator has no LHS',[Tokens[i].Pos]);
if Tokens[ll].Kind<>tokExpression then if Tokens[ll].Kind<>tokExpression then
Expand All @@ -899,7 +903,7 @@ TToken= record
end; end;
Tokens[rr].Kind:= tokVoid; Tokens[rr].Kind:= tokVoid;
Tokens[i].Kind:= tokExpression; Tokens[i].Kind:= tokExpression;
Tokens[i].Expr:= tmp; Tokens[i].Expr:= tmp;
end; end;
end; end;


Expand Down

0 comments on commit 5fe87b2

Please sign in to comment.