Scalar operators
This commit is contained in:
@@ -385,15 +385,11 @@ begin
|
||||
end;
|
||||
|
||||
function TEvaluatorVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
|
||||
var
|
||||
value: TDataValue;
|
||||
begin
|
||||
if Assigned(Node.Initializer) then
|
||||
value := Node.Initializer.Accept(Self);
|
||||
Result := Node.Initializer.Accept(Self);
|
||||
|
||||
FScope[Node.Identifier.Address] := value;
|
||||
|
||||
Result := value;
|
||||
FScope[Node.Identifier.Address] := Result;
|
||||
end;
|
||||
|
||||
function TEvaluatorVisitor.VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
|
||||
@@ -410,58 +406,22 @@ begin
|
||||
leftScalar := leftValue.AsScalar;
|
||||
rightScalar := rightValue.AsScalar;
|
||||
|
||||
if (leftScalar.Kind <> rightScalar.Kind) then
|
||||
begin
|
||||
if (leftScalar.Kind = skInt64) and (rightScalar.Kind = skDouble) then
|
||||
leftScalar := TScalar.FromDouble(leftScalar.Value.AsInt64)
|
||||
else if (leftScalar.Kind = skDouble) and (rightScalar.Kind = skInt64) then
|
||||
rightScalar := TScalar.FromDouble(rightScalar.Value.AsInt64)
|
||||
else
|
||||
raise ENotSupportedException.Create(
|
||||
'Binary operations are only supported for compatible types. ' + leftScalar.ToString + ' ' + rightScalar.ToString);
|
||||
end;
|
||||
if not TScalar.IsBinaryOperatorSupported(Node.Operator, leftScalar.Kind, rightScalar.Kind) then
|
||||
raise ENotSupportedException.Create('Binary operation not supported for scalar type.');
|
||||
|
||||
case leftScalar.Kind of
|
||||
skInt64:
|
||||
begin
|
||||
var leftVal := leftScalar.Value.AsInt64;
|
||||
var rightVal := rightScalar.Value.AsInt64;
|
||||
case Node.Operator of
|
||||
boAdd: Result := TScalar.FromInt64(leftVal + rightVal);
|
||||
boSubtract: Result := TScalar.FromInt64(leftVal - rightVal);
|
||||
boMultiply: Result := TScalar.FromInt64(leftVal * rightVal);
|
||||
boDivide: Result := TScalar.FromInt64(leftVal div rightVal);
|
||||
boEqual: Result := TScalar.FromBoolean(leftVal = rightVal);
|
||||
boNotEqual: Result := TScalar.FromBoolean(leftVal <> rightVal);
|
||||
boLess: Result := TScalar.FromBoolean(leftVal < rightVal);
|
||||
boGreater: Result := TScalar.FromBoolean(leftVal > rightVal);
|
||||
boLessOrEqual: Result := TScalar.FromBoolean(leftVal <= rightVal);
|
||||
boGreaterOrEqual: Result := TScalar.FromBoolean(leftVal >= rightVal);
|
||||
else
|
||||
raise ENotSupportedException.Create('Operator not supported for Int64.');
|
||||
end;
|
||||
end;
|
||||
skDouble:
|
||||
begin
|
||||
var leftVal := leftScalar.Value.AsDouble;
|
||||
var rightVal := rightScalar.Value.AsDouble;
|
||||
case Node.Operator of
|
||||
boAdd: Result := TScalar.FromDouble(leftVal + rightVal);
|
||||
boSubtract: Result := TScalar.FromDouble(leftVal - rightVal);
|
||||
boMultiply: Result := TScalar.FromDouble(leftVal * rightVal);
|
||||
boDivide: Result := TScalar.FromDouble(leftVal / rightVal);
|
||||
boEqual: Result := TScalar.FromBoolean(leftVal = rightVal);
|
||||
boNotEqual: Result := TScalar.FromBoolean(leftVal <> rightVal);
|
||||
boLess: Result := TScalar.FromBoolean(leftVal < rightVal);
|
||||
boGreater: Result := TScalar.FromBoolean(leftVal > rightVal);
|
||||
boLessOrEqual: Result := TScalar.FromBoolean(leftVal <= rightVal);
|
||||
boGreaterOrEqual: Result := TScalar.FromBoolean(leftVal >= rightVal);
|
||||
else
|
||||
raise ENotSupportedException.Create('Operator not supported for Double.');
|
||||
end;
|
||||
end;
|
||||
case Node.Operator of
|
||||
boAdd: Result := leftScalar + rightScalar;
|
||||
boSubtract: Result := leftScalar - rightScalar;
|
||||
boMultiply: Result := leftScalar * rightScalar;
|
||||
boDivide: Result := leftScalar / rightScalar;
|
||||
boEqual: Result := TScalar.FromBoolean(leftScalar = rightScalar);
|
||||
boNotEqual: Result := TScalar.FromBoolean(leftScalar <> rightScalar);
|
||||
boLess: Result := TScalar.FromBoolean(leftScalar < rightScalar);
|
||||
boGreater: Result := TScalar.FromBoolean(leftScalar > rightScalar);
|
||||
boLessOrEqual: Result := TScalar.FromBoolean(leftScalar <= rightScalar);
|
||||
boGreaterOrEqual: Result := TScalar.FromBoolean(leftScalar >= rightScalar);
|
||||
else
|
||||
raise ENotSupportedException.Create('Binary operations are not supported for this scalar type.');
|
||||
raise ENotSupportedException.Create('Unsupported binary operator.');
|
||||
end;
|
||||
end;
|
||||
|
||||
@@ -472,18 +432,14 @@ var
|
||||
begin
|
||||
rightValue := Node.Right.Accept(Self);
|
||||
|
||||
if not TScalar.IsUnaryOperatorSupported(Node.Operator, rightScalar.Kind) then
|
||||
raise ENotSupportedException.Create('Unary operation not supported for scalar type.');
|
||||
|
||||
case Node.Operator of
|
||||
uoNegate:
|
||||
begin
|
||||
if (rightValue.Kind <> vkScalar) then
|
||||
raise ENotSupportedException.Create('Unary "-" is only supported for scalar types.');
|
||||
rightScalar := rightValue.AsScalar;
|
||||
case rightScalar.Kind of
|
||||
skInt64: Result := TScalar.FromInt64(-rightScalar.Value.AsInt64);
|
||||
skDouble: Result := TScalar.FromDouble(-rightScalar.Value.AsDouble);
|
||||
else
|
||||
raise ENotSupportedException.Create('Unary "-" is not supported for this scalar type.');
|
||||
end;
|
||||
Result := -rightScalar;
|
||||
end;
|
||||
uoNot:
|
||||
begin
|
||||
@@ -495,27 +451,16 @@ begin
|
||||
end;
|
||||
|
||||
function TEvaluatorVisitor.VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
|
||||
var
|
||||
conditionValue: TDataValue;
|
||||
begin
|
||||
conditionValue := Node.Condition.Accept(Self);
|
||||
if IsTruthy(conditionValue) then
|
||||
if IsTruthy(Node.Condition.Accept(Self)) then
|
||||
Result := Node.ThenBranch.Accept(Self)
|
||||
else
|
||||
begin
|
||||
if Assigned(Node.ElseBranch) then
|
||||
Result := Node.ElseBranch.Accept(Self)
|
||||
else
|
||||
Result := TDataValue.Void;
|
||||
end;
|
||||
else if Assigned(Node.ElseBranch) then
|
||||
Result := Node.ElseBranch.Accept(Self);
|
||||
end;
|
||||
|
||||
function TEvaluatorVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
|
||||
var
|
||||
conditionValue: TDataValue;
|
||||
begin
|
||||
conditionValue := Node.Condition.Accept(Self);
|
||||
if IsTruthy(conditionValue) then
|
||||
if IsTruthy(Node.Condition.Accept(Self)) then
|
||||
Result := Node.ThenBranch.Accept(Self)
|
||||
else
|
||||
Result := Node.ElseBranch.Accept(Self);
|
||||
@@ -527,9 +472,7 @@ var
|
||||
begin
|
||||
Result := TDataValue.Void;
|
||||
for expression in Node.Expressions do
|
||||
begin
|
||||
Result := expression.Accept(Self);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TEvaluatorVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
|
||||
|
||||
Reference in New Issue
Block a user