Beginning Editor

This commit is contained in:
Michael Schimmel
2025-09-08 18:59:04 +02:00
parent 7e4ecb2ff9
commit a9cc9633a2
14 changed files with 1582 additions and 288 deletions
+58 -62
View File
@@ -27,7 +27,6 @@ type
// --- Forward Declarations to break cycles ---
IAstVisitor = interface;
IAstNode = interface;
IExpressionNode = interface;
IIdentifierNode = interface;
IConstantNode = interface;
IBinaryExpressionNode = interface;
@@ -54,12 +53,12 @@ type
type
IClosure = interface
{$region 'private'}
function GetBody: IExpressionNode;
function GetBody: IAstNode;
function GetClosureScope: IExecutionScope;
function GetParameters: TArray<IIdentifierNode>;
function GetUpvalues: TArray<IValueCell>;
{$endregion}
property Body: IExpressionNode read GetBody;
property Body: IAstNode read GetBody;
property ClosureScope: IExecutionScope read GetClosureScope;
property Parameters: TArray<IIdentifierNode> read GetParameters;
property Upvalues: TArray<IValueCell> read GetUpvalues;
@@ -170,17 +169,14 @@ type
function Accept(const Visitor: IAstVisitor): TAstValue;
end;
IExpressionNode = interface(IAstNode)
end;
IConstantNode = interface(IExpressionNode)
IConstantNode = interface(IAstNode)
{$region 'private'}
function GetValue: TScalar;
{$endregion}
property Value: TScalar read GetValue;
end;
IIdentifierNode = interface(IExpressionNode)
IIdentifierNode = interface(IAstNode)
{$region 'private'}
function GetIsResolved: Boolean;
function GetAddress: TResolvedAddress;
@@ -191,119 +187,119 @@ type
property Address: TResolvedAddress read GetAddress;
end;
IBinaryExpressionNode = interface(IExpressionNode)
IBinaryExpressionNode = interface(IAstNode)
{$region 'private'}
function GetLeft: IExpressionNode;
function GetLeft: IAstNode;
function GetOperator: TBinaryOperator;
function GetRight: IExpressionNode;
function GetRight: IAstNode;
{$endregion}
property Left: IExpressionNode read GetLeft;
property Left: IAstNode read GetLeft;
property Operator: TBinaryOperator read GetOperator;
property Right: IExpressionNode read GetRight;
property Right: IAstNode read GetRight;
end;
IUnaryExpressionNode = interface(IExpressionNode)
IUnaryExpressionNode = interface(IAstNode)
{$region 'private'}
function GetOperator: TUnaryOperator;
function GetRight: IExpressionNode;
function GetRight: IAstNode;
{$endregion}
property Operator: TUnaryOperator read GetOperator;
property Right: IExpressionNode read GetRight;
property Right: IAstNode read GetRight;
end;
// Represents an if-statement for control flow.
IIfExpressionNode = interface(IExpressionNode)
IIfExpressionNode = interface(IAstNode)
{$region 'private'}
function GetCondition: IExpressionNode;
function GetThenBranch: IExpressionNode;
function GetElseBranch: IExpressionNode;
function GetCondition: IAstNode;
function GetThenBranch: IAstNode;
function GetElseBranch: IAstNode;
{$endregion}
property Condition: IExpressionNode read GetCondition;
property ThenBranch: IExpressionNode read GetThenBranch;
property ElseBranch: IExpressionNode read GetElseBranch;
property Condition: IAstNode read GetCondition;
property ThenBranch: IAstNode read GetThenBranch;
property ElseBranch: IAstNode read GetElseBranch;
end;
// Represents a ternary expression (e.g., condition ? true_expr : false_expr) for value selection.
ITernaryExpressionNode = interface(IExpressionNode)
ITernaryExpressionNode = interface(IAstNode)
{$region 'private'}
function GetCondition: IExpressionNode;
function GetThenBranch: IExpressionNode;
function GetElseBranch: IExpressionNode;
function GetCondition: IAstNode;
function GetThenBranch: IAstNode;
function GetElseBranch: IAstNode;
{$endregion}
property Condition: IExpressionNode read GetCondition;
property ThenBranch: IExpressionNode read GetThenBranch;
property ElseBranch: IExpressionNode read GetElseBranch;
property Condition: IAstNode read GetCondition;
property ThenBranch: IAstNode read GetThenBranch;
property ElseBranch: IAstNode read GetElseBranch;
end;
ILambdaExpressionNode = interface(IExpressionNode)
ILambdaExpressionNode = interface(IAstNode)
{$region 'private'}
function GetParameters: TArray<IIdentifierNode>;
function GetBody: IExpressionNode;
function GetBody: IAstNode;
function GetScopeDescriptor: IScopeDescriptor;
function GetUpvalues: TArray<TResolvedAddress>;
{$endregion}
property Parameters: TArray<IIdentifierNode> read GetParameters;
property Body: IExpressionNode read GetBody;
property Body: IAstNode read GetBody;
property ScopeDescriptor: IScopeDescriptor read GetScopeDescriptor;
property Upvalues: TArray<TResolvedAddress> read GetUpvalues;
end;
IFunctionCallNode = interface(IExpressionNode)
IFunctionCallNode = interface(IAstNode)
{$region 'private'}
function GetCallee: IExpressionNode;
function GetArguments: TList<IExpressionNode>;
function GetCallee: IAstNode;
function GetArguments: TList<IAstNode>;
{$endregion}
property Callee: IExpressionNode read GetCallee;
property Arguments: TList<IExpressionNode> read GetArguments;
property Callee: IAstNode read GetCallee;
property Arguments: TList<IAstNode> read GetArguments;
end;
IBlockExpressionNode = interface(IExpressionNode)
IBlockExpressionNode = interface(IAstNode)
{$region 'private'}
function GetExpressions: TList<IExpressionNode>;
function GetExpressions: TList<IAstNode>;
{$endregion}
property Expressions: TList<IExpressionNode> read GetExpressions;
property Expressions: TList<IAstNode> read GetExpressions;
end;
IVariableDeclarationNode = interface(IExpressionNode)
IVariableDeclarationNode = interface(IAstNode)
{$region 'private'}
function GetIdentifier: IIdentifierNode;
function GetInitializer: IExpressionNode;
function GetInitializer: IAstNode;
{$endregion}
property Identifier: IIdentifierNode read GetIdentifier;
property Initializer: IExpressionNode read GetInitializer;
property Initializer: IAstNode read GetInitializer;
end;
IAssignmentNode = interface(IExpressionNode)
IAssignmentNode = interface(IAstNode)
{$region 'private'}
function GetIdentifier: IIdentifierNode;
function GetValue: IExpressionNode;
function GetValue: IAstNode;
{$endregion}
property Identifier: IIdentifierNode read GetIdentifier;
property Value: IExpressionNode read GetValue;
property Value: IAstNode read GetValue;
end;
// Represents an index access expression (e.g., series[index]).
IIndexerNode = interface(IExpressionNode)
IIndexerNode = interface(IAstNode)
{$region 'private'}
function GetBase: IExpressionNode;
function GetIndex: IExpressionNode;
function GetBase: IAstNode;
function GetIndex: IAstNode;
{$endregion}
property Base: IExpressionNode read GetBase;
property Index: IExpressionNode read GetIndex;
property Base: IAstNode read GetBase;
property Index: IAstNode read GetIndex;
end;
// Represents a member access expression (e.g., series.field or record.field).
IMemberAccessNode = interface(IExpressionNode)
IMemberAccessNode = interface(IAstNode)
{$region 'private'}
function GetBase: IExpressionNode;
function GetBase: IAstNode;
function GetMember: IIdentifierNode;
{$endregion}
property Base: IExpressionNode read GetBase;
property Base: IAstNode read GetBase;
property Member: IIdentifierNode read GetMember;
end;
// Represents creating a new, empty series (e.g., new series(int)).
ICreateSeriesNode = interface(IExpressionNode)
ICreateSeriesNode = interface(IAstNode)
{$region 'private'}
function GetDefinition: String;
{$endregion}
@@ -311,18 +307,18 @@ type
end;
// Represents adding a value to a series (e.g., my_series.add(value, 100)).
IAddSeriesItemNode = interface(IExpressionNode)
IAddSeriesItemNode = interface(IAstNode)
{$region 'private'}
function GetSeries: IIdentifierNode;
function GetValue: IExpressionNode;
function GetLookback: IExpressionNode;
function GetValue: IAstNode;
function GetLookback: IAstNode;
{$endregion}
property Series: IIdentifierNode read GetSeries;
property Value: IExpressionNode read GetValue;
property Lookback: IExpressionNode read GetLookback;
property Value: IAstNode read GetValue;
property Lookback: IAstNode read GetLookback;
end;
ISeriesLengthNode = interface(IExpressionNode)
ISeriesLengthNode = interface(IAstNode)
{$region 'private'}
function GetSeries: IIdentifierNode;
{$endregion}