Binder refactoring, Monster refactoring
This commit is contained in:
@@ -38,6 +38,34 @@ type
|
||||
ISeriesLengthNode = interface;
|
||||
IRecurNode = interface;
|
||||
|
||||
// Defines the concrete kinds of AST nodes
|
||||
TAstNodeKind = (
|
||||
akConstant,
|
||||
akIdentifier,
|
||||
akKeyword,
|
||||
akBinaryExpression,
|
||||
akUnaryExpression,
|
||||
akIfExpression,
|
||||
akTernaryExpression,
|
||||
akLambdaExpression,
|
||||
akFunctionCall,
|
||||
akMacroExpansion,
|
||||
akBlockExpression,
|
||||
akVariableDeclaration,
|
||||
akAssignment,
|
||||
akMacroDefinition,
|
||||
akQuasiquote,
|
||||
akUnquote,
|
||||
akUnquoteSplicing,
|
||||
akIndexer,
|
||||
akMemberAccess,
|
||||
akRecordLiteral,
|
||||
akCreateSeries,
|
||||
akAddSeriesItem,
|
||||
akSeriesLength,
|
||||
akRecur
|
||||
);
|
||||
|
||||
// --- Concrete Type Definitions ---
|
||||
|
||||
// Defines how an identifier's address was resolved.
|
||||
@@ -88,7 +116,37 @@ type
|
||||
end;
|
||||
|
||||
IAstNode = interface(IInterface)
|
||||
{$region 'private'}
|
||||
function GetKind: TAstNodeKind;
|
||||
{$endregion}
|
||||
function Accept(const Visitor: IAstVisitor): TDataValue;
|
||||
|
||||
function AsConstant: IConstantNode;
|
||||
function AsIdentifier: IIdentifierNode;
|
||||
function AsKeyword: IKeywordNode;
|
||||
function AsBinaryExpression: IBinaryExpressionNode;
|
||||
function AsUnaryExpression: IUnaryExpressionNode;
|
||||
function AsIfExpression: IIfExpressionNode;
|
||||
function AsTernaryExpression: ITernaryExpressionNode;
|
||||
function AsLambdaExpression: ILambdaExpressionNode;
|
||||
function AsFunctionCall: IFunctionCallNode;
|
||||
function AsMacroExpansion: IMacroExpansionNode;
|
||||
function AsBlockExpression: IBlockExpressionNode;
|
||||
function AsVariableDeclaration: IVariableDeclarationNode;
|
||||
function AsAssignment: IAssignmentNode;
|
||||
function AsMacroDefinition: IMacroDefinitionNode;
|
||||
function AsQuasiquote: IQuasiquoteNode;
|
||||
function AsUnquote: IUnquoteNode;
|
||||
function AsUnquoteSplicing: IUnquoteSplicingNode;
|
||||
function AsIndexer: IIndexerNode;
|
||||
function AsMemberAccess: IMemberAccessNode;
|
||||
function AsRecordLiteral: IRecordLiteralNode;
|
||||
function AsCreateSeries: ICreateSeriesNode;
|
||||
function AsAddSeriesItem: IAddSeriesItemNode;
|
||||
function AsSeriesLength: ISeriesLengthNode;
|
||||
function AsRecur: IRecurNode;
|
||||
|
||||
property Kind: TAstNodeKind read GetKind;
|
||||
end;
|
||||
|
||||
IConstantNode = interface(IAstNode)
|
||||
@@ -221,11 +279,11 @@ type
|
||||
{$region 'private'}
|
||||
function GetName: IIdentifierNode;
|
||||
function GetParameters: TArray<IIdentifierNode>;
|
||||
function GetBody: IQuasiquoteNode;
|
||||
function GetBody: IAstNode;
|
||||
{$endregion}
|
||||
property Name: IIdentifierNode read GetName;
|
||||
property Parameters: TArray<IIdentifierNode> read GetParameters;
|
||||
property Body: IQuasiquoteNode read GetBody;
|
||||
property Body: IAstNode read GetBody;
|
||||
end;
|
||||
|
||||
// Represents a quasiquoted expression, e.g., `(a b)
|
||||
@@ -247,9 +305,9 @@ type
|
||||
// Represents an unquote-splicing expression, e.g., ~@y
|
||||
IUnquoteSplicingNode = interface(IAstNode)
|
||||
{$region 'private'}
|
||||
function GetExpression: IAstNode;
|
||||
function GetExpression: IQuasiquoteNode;
|
||||
{$endregion}
|
||||
property Expression: IAstNode read GetExpression;
|
||||
property Expression: IQuasiquoteNode read GetExpression;
|
||||
end;
|
||||
|
||||
IIndexerNode = interface(IAstNode)
|
||||
|
||||
Reference in New Issue
Block a user