diff --git "a/C:\\Users\\heff\\AppData\\Local\\Temp\\TortoiseGit\\JclF486.tmp\\JclExprEval-2f4215d-left.pas" "b/C:\\Users\\heff\\Desktop\\jcl\\jcl\\source\\common\\JclExprEval.pas"
index 9f62a66..bf357e4 100644
--- "a/C:\\Users\\heff\\AppData\\Local\\Temp\\TortoiseGit\\JclF486.tmp\\JclExprEval-2f4215d-left.pas"
+++ "b/C:\\Users\\heff\\Desktop\\jcl\\jcl\\source\\common\\JclExprEval.pas"
@@ -40,7 +40,8 @@
 // all binary operators are associated from left to right
 // all unary operators are associated from right to left
 
-// (highest) not bnot(bitwise) +(unary) -(unary)                      (level 3)
+// (highest) not bnot(bitwise) +(unary) -(unary)                      (level 4)
+//           ^                                                        (level 3)
 //           * / div mod and band(bitwise) shl shr                    (level 2)
 //           +(binary) -(binary) or xor bor(bitwise) bxor(bitwise)    (level 1)
 // (lowest)  < <= > >= cmp = <>                                       (level 0)
@@ -61,9 +62,9 @@ uses
   JclUnitVersioning,
   {$ENDIF UNITVERSIONING}
   {$IFDEF HAS_UNITSCOPE}
-  System.SysUtils, System.Classes,
+  System.SysUtils, System.Classes, System.Math,
   {$ELSE ~HAS_UNITSCOPE}
-  SysUtils, Classes,
+  SysUtils, Classes, Math,
   {$ENDIF ~HAS_UNITSCOPE}
   JclBase, JclSysUtils, JclStrHashMap, JclResources;
 
@@ -441,6 +442,7 @@ type
     function Subtract(ALeft, ARight: TExprNode): TExprNode; virtual; abstract;
     function Multiply(ALeft, ARight: TExprNode): TExprNode; virtual; abstract;
     function Divide(ALeft, ARight: TExprNode): TExprNode; virtual; abstract;
+    function Power(ALeft, ARight: TExprNode): TExprNode; virtual; abstract;
     function IntegerDivide(ALeft, ARight: TExprNode): TExprNode; virtual; abstract;
     function Modulo(ALeft, ARight: TExprNode): TExprNode; virtual; abstract;
     function Negate(AValue: TExprNode): TExprNode; virtual; abstract;
@@ -486,6 +488,7 @@ type
     function CompileExprLevel1(ASkip: Boolean): TExprNode; virtual;
     function CompileExprLevel2(ASkip: Boolean): TExprNode; virtual;
     function CompileExprLevel3(ASkip: Boolean): TExprNode; virtual;
+    function CompileExprLevel4(ASkip: Boolean): TExprNode; virtual;
     function CompileFactor: TExprNode; virtual;
     function CompileIdentFactor: TExprNode; virtual;
   public
@@ -505,6 +508,7 @@ type
     function EvalExprLevel1(ASkip: Boolean): TFloat; virtual;
     function EvalExprLevel2(ASkip: Boolean): TFloat; virtual;
     function EvalExprLevel3(ASkip: Boolean): TFloat; virtual;
+    function EvalExprLevel4(ASkip: Boolean): TFloat; virtual;
     function EvalFactor: TFloat; virtual;
     function EvalIdentFactor: TFloat; virtual;
   public
@@ -607,6 +611,7 @@ type
     function Subtract(ALeft, ARight: TExprNode): TExprNode; override;
     function Multiply(ALeft, ARight: TExprNode): TExprNode; override;
     function Divide(ALeft, ARight: TExprNode): TExprNode; override;
+    function Power(ALeft, ARight: TExprNode): TExprNode; override;
     function IntegerDivide(ALeft, ARight: TExprNode): TExprNode; override;
     function Modulo(ALeft, ARight: TExprNode): TExprNode; override;
     function Negate(AValue: TExprNode): TExprNode; override;
@@ -1216,20 +1221,33 @@ end;
 
 function TExprCompileParser.CompileExprLevel3(ASkip: Boolean): TExprNode;
 begin
+  Result := CompileExprLevel4(ASkip);
+
+  while True do
+    case Lexer.CurrTok of
+      etArrow:
+        Result := NodeFactory.Power(Result, CompileExprLevel4(True));
+    else
+      Break;
+    end;
+end;
+
+function TExprCompileParser.CompileExprLevel4(ASkip: Boolean): TExprNode;
+begin
   if ASkip then
     Lexer.NextTok;
 
   case Lexer.CurrTok of
     etPlus:
-      Result := CompileExprLevel3(True);
+      Result := CompileExprLevel4(True);
     etMinus:
-      Result := NodeFactory.Negate(CompileExprLevel3(True));
+      Result := NodeFactory.Negate(CompileExprLevel4(True));
     etIdentifier: // not, bnot
       if AnsiSameText(Lexer.TokenAsString, 'not') then
-        Result := NodeFactory.LogicalNot(CompileExprLevel3(True))
+        Result := NodeFactory.LogicalNot(CompileExprLevel4(True))
       else
       if AnsiSameText(Lexer.TokenAsString, 'bnot') then
-        Result := NodeFactory.BitwiseNot(CompileExprLevel3(True))
+        Result := NodeFactory.BitwiseNot(CompileExprLevel4(True))
       else
         Result := CompileFactor;
   else
@@ -1451,25 +1469,38 @@ end;
 
 function TExprEvalParser.EvalExprLevel3(ASkip: Boolean): TFloat;
 begin
+  Result := EvalExprLevel4(ASkip);
+
+  while True do
+    case Lexer.CurrTok of
+      etArrow:
+        Result := Power(Result, EvalExprLevel4(True));
+    else
+      Break;
+    end;
+end;
+
+function TExprEvalParser.EvalExprLevel4(ASkip: Boolean): TFloat;
+begin
   if ASkip then
     Lexer.NextTok;
 
   case Lexer.CurrTok of
     etPlus:
-      Result := EvalExprLevel3(True);
+      Result := EvalExprLevel4(True);
     etMinus:
-      Result := -EvalExprLevel3(True);
+      Result := -EvalExprLevel4(True);
     etIdentifier: // not, bnot
       if AnsiSameText(Lexer.TokenAsString, 'not') then
       begin
-        if EvalExprLevel3(True) <> 0.0 then
+        if EvalExprLevel4(True) <> 0.0 then
           Result := 0.0
         else
           Result := 1.0;
       end
       else
       if AnsiSameText(Lexer.TokenAsString, 'bnot') then
-        Result := not Round(EvalExprLevel3(True))
+        Result := not Round(EvalExprLevel4(True))
       else
         Result := EvalFactor;
   else
@@ -1903,6 +1934,11 @@ type
     procedure Execute; override;
   end;
 
+  TExprPowerVmOp = class(TExprBinaryVmOp)
+  public
+    procedure Execute; override;
+  end;
+
   TExprCompareVmOp = class(TExprBinaryVmOp)
   public
     procedure Execute; override;
@@ -2236,6 +2272,13 @@ begin
   FOutput := FLeft^ / FRight^;
 end;
 
+//=== { TExprPowerVmOp } =====================================================
+
+procedure TExprPowerVmOp.Execute;
+begin
+  FOutput := Power(FLeft^, FRight^);
+end;
+
 //=== { TExprCompareVmOp } ===================================================
 
 procedure TExprCompareVmOp.Execute;
@@ -3127,6 +3170,11 @@ begin
   Result := AddNode(TExprBinaryVmNode.Create(TExprDivideVmOp, [ALeft, ARight]));
 end;
 
+function TExprVirtMachNodeFactory.Power(ALeft, ARight: TExprNode): TExprNode;
+begin
+  Result := AddNode(TExprBinaryVmNode.Create(TExprPowerVmOp, [ALeft, ARight]));
+end;
+
 function TExprVirtMachNodeFactory.IntegerDivide(ALeft, ARight: TExprNode): TExprNode;
 begin
   Result := AddNode(TExprBinaryVmNode.Create(TExprIntegerDivideVmOp, [ALeft, ARight]));
