TDataValue as new global variant type

This commit is contained in:
Michael Schimmel
2025-09-12 11:18:32 +02:00
parent 695e854cc3
commit 646ffe92bb
15 changed files with 763 additions and 725 deletions
+50 -49
View File
@@ -20,7 +20,8 @@ uses
System.JSON,
System.Generics.Collections,
Myc.Ast,
Myc.Data.Scalar;
Myc.Data.Scalar,
Myc.Data.Value; // Added for TDataValue
type
// TJsonAstConverter implements the visitor pattern for serialization
@@ -50,22 +51,22 @@ type
function JsonToSeriesLengthNode(const AObj: TJSONObject): ISeriesLengthNode;
protected
// IAstVisitor implementation for serialization
function VisitConstant(const Node: IConstantNode): TAstValue;
function VisitIdentifier(const Node: IIdentifierNode): TAstValue;
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TAstValue;
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TAstValue;
function VisitIfExpression(const Node: IIfExpressionNode): TAstValue;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TAstValue;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstValue;
function VisitFunctionCall(const Node: IFunctionCallNode): TAstValue;
function VisitBlockExpression(const Node: IBlockExpressionNode): TAstValue;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstValue;
function VisitAssignment(const Node: IAssignmentNode): TAstValue;
function VisitIndexer(const Node: IIndexerNode): TAstValue;
function VisitMemberAccess(const Node: IMemberAccessNode): TAstValue;
function VisitCreateSeries(const Node: ICreateSeriesNode): TAstValue;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstValue;
function VisitSeriesLength(const Node: ISeriesLengthNode): TAstValue;
function VisitConstant(const Node: IConstantNode): TDataValue;
function VisitIdentifier(const Node: IIdentifierNode): TDataValue;
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue;
function VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
function VisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
function VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
function VisitAssignment(const Node: IAssignmentNode): TDataValue;
function VisitIndexer(const Node: IIndexerNode): TDataValue;
function VisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
function VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
function VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
public
constructor Create;
destructor Destroy; override;
@@ -147,7 +148,7 @@ begin
AParent.AddPair(AName, scalarObj);
end;
function TJsonAstConverter.VisitConstant(const Node: IConstantNode): TAstValue;
function TJsonAstConverter.VisitConstant(const Node: IConstantNode): TDataValue;
var
obj: TJSONObject;
begin
@@ -155,10 +156,10 @@ begin
obj.AddPair('NodeType', TJSONString.Create('Constant'));
ScalarToJson(Node.Value, obj, 'Value');
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitIdentifier(const Node: IIdentifierNode): TAstValue;
function TJsonAstConverter.VisitIdentifier(const Node: IIdentifierNode): TDataValue;
var
obj: TJSONObject;
begin
@@ -166,10 +167,10 @@ begin
obj.AddPair('NodeType', TJSONString.Create('Identifier'));
obj.AddPair('Name', TJSONString.Create(Node.Name));
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitBinaryExpression(const Node: IBinaryExpressionNode): TAstValue;
function TJsonAstConverter.VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
var
obj, leftObj, rightObj: TJSONObject;
begin
@@ -185,10 +186,10 @@ begin
obj.AddPair('Left', leftObj);
obj.AddPair('Right', rightObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitUnaryExpression(const Node: IUnaryExpressionNode): TAstValue;
function TJsonAstConverter.VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue;
var
obj, rightObj: TJSONObject;
begin
@@ -200,10 +201,10 @@ begin
obj.AddPair('Operator', TJSONString.Create(Node.Operator.ToString));
obj.AddPair('Right', rightObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitIfExpression(const Node: IIfExpressionNode): TAstValue;
function TJsonAstConverter.VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
var
obj, condObj, thenObj, elseObj: TJSONObject;
begin
@@ -230,10 +231,10 @@ begin
obj.AddPair('ElseBranch', TJSONNull.Create);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitTernaryExpression(const Node: ITernaryExpressionNode): TAstValue;
function TJsonAstConverter.VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
var
obj, condObj, thenObj, elseObj: TJSONObject;
begin
@@ -251,10 +252,10 @@ begin
obj.AddPair('ThenBranch', thenObj);
obj.AddPair('ElseBranch', elseObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstValue;
function TJsonAstConverter.VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
var
obj, bodyObj: TJSONObject;
paramsArray: TJSONArray;
@@ -281,10 +282,10 @@ begin
obj.AddPair('Parameters', paramsArray);
obj.AddPair('Body', bodyObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitFunctionCall(const Node: IFunctionCallNode): TAstValue;
function TJsonAstConverter.VisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
var
obj, calleeObj: TJSONObject;
argsArray: TJSONArray;
@@ -311,10 +312,10 @@ begin
obj.AddPair('Callee', calleeObj);
obj.AddPair('Arguments', argsArray);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitBlockExpression(const Node: IBlockExpressionNode): TAstValue;
function TJsonAstConverter.VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
var
obj: TJSONObject;
exprsArray: TJSONArray;
@@ -337,10 +338,10 @@ begin
obj.AddPair('NodeType', TJSONString.Create('Block'));
obj.AddPair('Expressions', exprsArray);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstValue;
function TJsonAstConverter.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
var
obj, identObj, initObj: TJSONObject;
begin
@@ -362,10 +363,10 @@ begin
else
obj.AddPair('Initializer', TJSONNull.Create);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitAssignment(const Node: IAssignmentNode): TAstValue;
function TJsonAstConverter.VisitAssignment(const Node: IAssignmentNode): TDataValue;
var
obj, identObj, valueObj: TJSONObject;
begin
@@ -380,10 +381,10 @@ begin
obj.AddPair('Identifier', identObj);
obj.AddPair('Value', valueObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitIndexer(const Node: IIndexerNode): TAstValue;
function TJsonAstConverter.VisitIndexer(const Node: IIndexerNode): TDataValue;
var
obj, baseObj, indexObj: TJSONObject;
begin
@@ -398,10 +399,10 @@ begin
obj.AddPair('Base', baseObj);
obj.AddPair('Index', indexObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitMemberAccess(const Node: IMemberAccessNode): TAstValue;
function TJsonAstConverter.VisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
var
obj, baseObj, memberObj: TJSONObject;
begin
@@ -416,10 +417,10 @@ begin
obj.AddPair('Base', baseObj);
obj.AddPair('Member', memberObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitCreateSeries(const Node: ICreateSeriesNode): TAstValue;
function TJsonAstConverter.VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
var
obj: TJSONObject;
begin
@@ -427,10 +428,10 @@ begin
obj.AddPair('NodeType', TJSONString.Create('CreateSeries'));
obj.AddPair('Definition', TJSONString.Create(Node.Definition));
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstValue;
function TJsonAstConverter.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
var
obj, seriesObj, valueObj, lookbackObj: TJSONObject;
begin
@@ -455,10 +456,10 @@ begin
else
obj.AddPair('Lookback', TJSONNull.Create);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TJsonAstConverter.VisitSeriesLength(const Node: ISeriesLengthNode): TAstValue;
function TJsonAstConverter.VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
var
obj, seriesObj: TJSONObject;
begin
@@ -469,7 +470,7 @@ begin
obj.AddPair('NodeType', TJSONString.Create('SeriesLength'));
obj.AddPair('Series', seriesObj);
FJsonObjectStack.Push(obj);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
{ TJsonAstConverter - Deserialization }