Ast development

This commit is contained in:
Michael Schimmel
2025-09-02 17:49:30 +02:00
parent a83bbf4f54
commit eb7902d9e8
7 changed files with 257 additions and 83 deletions
+32 -4
View File
@@ -20,8 +20,8 @@ type
function ToString: string;
end;
// Added avkRecord to represent a TScalarRecord value.
TAstValueKind = (avkUndefined, avkScalar, avkClosure, avkText, avkRecordSeries, avkRecord);
// Added avkMemberSeries to represent a TScalarMemberSeries value.
TAstValueKind = (avkUndefined, avkScalar, avkClosure, avkText, avkRecordSeries, avkRecord, avkMemberSeries);
// --- Forward Declarations to break cycles ---
IExecutionScope = interface;
@@ -33,15 +33,15 @@ type
IBinaryExpressionNode = interface;
IUnaryExpressionNode = interface;
IIfExpressionNode = interface;
// Added forward declaration for the new ternary expression node.
ITernaryExpressionNode = interface;
ILambdaExpressionNode = interface;
IFunctionCallNode = interface;
IBlockExpressionNode = interface;
IVariableDeclarationNode = interface;
IAssignmentNode = interface;
// Added forward declaration for the new indexer node.
IIndexerNode = interface;
// Added forward declaration for the new member access node.
IMemberAccessNode = interface;
IEvaluatorClosure = interface;
// --- Concrete Type Definitions ---
@@ -88,11 +88,13 @@ type
class function FromText(const AValue: String): TAstValue; static;
class function FromRecordSeries(const AValue: TScalarRecordSeries): TAstValue; static;
class function FromRecord(const AValue: TScalarRecord): TAstValue; static;
class function FromMemberSeries(const AValue: TScalarMemberSeries): TAstValue; static;
function AsScalar: TScalar;
function AsClosure: IEvaluatorClosure;
function AsText: String;
function AsRecordSeries: TScalarRecordSeries;
function AsRecord: TScalarRecord;
function AsMemberSeries: TScalarMemberSeries;
function ToString: String;
property IsVoid: Boolean read GetIsVoid;
property Kind: TAstValueKind read GetKind;
@@ -123,6 +125,7 @@ type
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstValue;
function VisitAssignment(const Node: IAssignmentNode): TAstValue;
function VisitIndexer(const Node: IIndexerNode): TAstValue;
function VisitMemberAccess(const Node: IMemberAccessNode): TAstValue;
end;
IAstNode = interface(IInterface)
@@ -243,6 +246,16 @@ type
property Index: IExpressionNode read GetIndex;
end;
// Represents a member access expression (e.g., series.field or record.field).
IMemberAccessNode = interface(IExpressionNode)
{$region 'private'}
function GetBase: IExpressionNode;
function GetMember: IIdentifierNode;
{$endregion}
property Base: IExpressionNode read GetBase;
property Member: IIdentifierNode read GetMember;
end;
implementation
uses
@@ -276,6 +289,13 @@ begin
Result := IEvaluatorClosure(FInterface);
end;
function TAstValue.AsMemberSeries: TScalarMemberSeries;
begin
if (FKind <> avkMemberSeries) then
raise EInvalidCast.Create('Cannot read value as MemberSeries.');
Result := (FInterface as IVal<TScalarMemberSeries>).Value;
end;
function TAstValue.AsRecord: TScalarRecord;
begin
if (FKind <> avkRecord) then
@@ -312,6 +332,13 @@ begin
Result.FScalar := Default(TScalar);
end;
class function TAstValue.FromMemberSeries(const AValue: TScalarMemberSeries): TAstValue;
begin
Result.FKind := avkMemberSeries;
Result.FInterface := TVal<TScalarMemberSeries>.Create(AValue);
Result.FScalar := Default(TScalar);
end;
class function TAstValue.FromRecord(const AValue: TScalarRecord): TAstValue;
begin
Result.FKind := avkRecord;
@@ -358,6 +385,7 @@ begin
avkText: Result := AsText;
avkRecordSeries: Result := '<record_series>';
avkRecord: Result := '<record>';
avkMemberSeries: Result := '<member_series>';
avkUndefined: Result := '<void>';
else
Result := '[Unknown AstValue]';