Ast visitor refactoring

This commit is contained in:
Michael Schimmel
2025-12-04 11:28:40 +01:00
parent a7290550e7
commit 9ed563bcc1
4 changed files with 331 additions and 569 deletions
+56 -56
View File
@@ -31,37 +31,37 @@ type
protected protected
// Override abstract PROCEDURES from TAstVisitor // Override abstract PROCEDURES from TAstVisitor
procedure VisitConstant(const Node: IConstantNode); override; function VisitConstant(const Node: IConstantNode): TVoid; override;
procedure VisitIdentifier(const Node: IIdentifierNode); override; function VisitIdentifier(const Node: IIdentifierNode): TVoid; override;
procedure VisitKeyword(const Node: IKeywordNode); override; function VisitKeyword(const Node: IKeywordNode): TVoid; override;
procedure VisitIfExpression(const Node: IIfExpressionNode); override; function VisitIfExpression(const Node: IIfExpressionNode): TVoid; override;
procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); override; function VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid; override;
procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); override; function VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid; override;
procedure VisitFunctionCall(const Node: IFunctionCallNode); override; function VisitFunctionCall(const Node: IFunctionCallNode): TVoid; override;
procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); override; function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid; override;
procedure VisitRecurNode(const Node: IRecurNode); override; function VisitRecurNode(const Node: IRecurNode): TVoid; override;
procedure VisitBlockExpression(const Node: IBlockExpressionNode); override; function VisitBlockExpression(const Node: IBlockExpressionNode): TVoid; override;
procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); override; function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid; override;
procedure VisitAssignment(const Node: IAssignmentNode); override; function VisitAssignment(const Node: IAssignmentNode): TVoid; override;
procedure VisitMacroDefinition(const Node: IMacroDefinitionNode); override; function VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid; override;
procedure VisitQuasiquote(const Node: IQuasiquoteNode); override; function VisitQuasiquote(const Node: IQuasiquoteNode): TVoid; override;
procedure VisitUnquote(const Node: IUnquoteNode); override; function VisitUnquote(const Node: IUnquoteNode): TVoid; override;
procedure VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); override; function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid; override;
procedure VisitIndexer(const Node: IIndexerNode); override; function VisitIndexer(const Node: IIndexerNode): TVoid; override;
procedure VisitMemberAccess(const Node: IMemberAccessNode); override; function VisitMemberAccess(const Node: IMemberAccessNode): TVoid; override;
procedure VisitRecordLiteral(const Node: IRecordLiteralNode); override; function VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid; override;
procedure VisitCreateSeries(const Node: ICreateSeriesNode); override; function VisitCreateSeries(const Node: ICreateSeriesNode): TVoid; override;
procedure VisitAddSeriesItem(const Node: IAddSeriesItemNode); override; function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid; override;
procedure VisitSeriesLength(const Node: ISeriesLengthNode); override; function VisitSeriesLength(const Node: ISeriesLengthNode): TVoid; override;
procedure VisitNop(const Node: INopNode); override; function VisitNop(const Node: INopNode): TVoid; override;
// List Visitors are handled implicitly by parent node iteration in Dumper, // List Visitors are handled implicitly by parent node iteration in Dumper,
// but we implement them empty/default to satisfy the abstract base class if called directly. // but we implement them empty/default to satisfy the abstract base class if called directly.
procedure VisitParameterList(const Node: IParameterList); override; function VisitParameterList(const Node: IParameterList): TVoid; override;
procedure VisitArgumentList(const Node: IArgumentList); override; function VisitArgumentList(const Node: IArgumentList): TVoid; override;
procedure VisitExpressionList(const Node: IExpressionList); override; function VisitExpressionList(const Node: IExpressionList): TVoid; override;
procedure VisitRecordFieldList(const Node: IRecordFieldList); override; function VisitRecordFieldList(const Node: IRecordFieldList): TVoid; override;
procedure VisitRecordField(const Node: IRecordFieldNode); override; function VisitRecordField(const Node: IRecordFieldNode): TVoid; override;
public public
constructor Create(const AOutput: TStrings); constructor Create(const AOutput: TStrings);
@@ -151,12 +151,12 @@ begin
end; end;
end; end;
procedure TAstDumper.VisitConstant(const Node: IConstantNode); function TAstDumper.VisitConstant(const Node: IConstantNode): TVoid;
begin begin
LogFmt('Constant: %s', [Node.Value.ToString], Node); LogFmt('Constant: %s', [Node.Value.ToString], Node);
end; end;
procedure TAstDumper.VisitIdentifier(const Node: IIdentifierNode); function TAstDumper.VisitIdentifier(const Node: IIdentifierNode): TVoid;
var var
adr: TResolvedAddress; adr: TResolvedAddress;
begin begin
@@ -167,12 +167,12 @@ begin
LogFmt('Identifier: %s (unbound)', [Node.Name], Node); LogFmt('Identifier: %s (unbound)', [Node.Name], Node);
end; end;
procedure TAstDumper.VisitKeyword(const Node: IKeywordNode); function TAstDumper.VisitKeyword(const Node: IKeywordNode): TVoid;
begin begin
LogFmt('Keyword: :%s', [Node.Value.Name], Node); LogFmt('Keyword: :%s', [Node.Value.Name], Node);
end; end;
procedure TAstDumper.VisitIfExpression(const Node: IIfExpressionNode); function TAstDumper.VisitIfExpression(const Node: IIfExpressionNode): TVoid;
begin begin
Log('IfExpression', Node); Log('IfExpression', Node);
Indent; Indent;
@@ -188,7 +188,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitTernaryExpression(const Node: ITernaryExpressionNode); function TAstDumper.VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid;
begin begin
Log('TernaryExpression', Node); Log('TernaryExpression', Node);
Indent; Indent;
@@ -201,7 +201,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitLambdaExpression(const Node: ILambdaExpressionNode); function TAstDumper.VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid;
var var
upvalueAddr: TResolvedAddress; upvalueAddr: TResolvedAddress;
symbols: TArray<string>; symbols: TArray<string>;
@@ -265,7 +265,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitFunctionCall(const Node: IFunctionCallNode); function TAstDumper.VisitFunctionCall(const Node: IFunctionCallNode): TVoid;
var var
arg: IAstNode; arg: IAstNode;
staticStatus: string; staticStatus: string;
@@ -309,7 +309,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitMacroExpansionNode(const Node: IMacroExpansionNode); function TAstDumper.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid;
var var
arg: IAstNode; arg: IAstNode;
begin begin
@@ -335,7 +335,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitRecurNode(const Node: IRecurNode); function TAstDumper.VisitRecurNode(const Node: IRecurNode): TVoid;
var var
arg: IAstNode; arg: IAstNode;
begin begin
@@ -349,7 +349,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitBlockExpression(const Node: IBlockExpressionNode); function TAstDumper.VisitBlockExpression(const Node: IBlockExpressionNode): TVoid;
var var
expr: IAstNode; expr: IAstNode;
begin begin
@@ -360,7 +360,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitVariableDeclaration(const Node: IVariableDeclarationNode); function TAstDumper.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid;
begin begin
LogFmt('VariableDeclaration (IsBoxed: %s)', [Node.IsBoxed.ToString(TUseBoolStrs.True)], Node); LogFmt('VariableDeclaration (IsBoxed: %s)', [Node.IsBoxed.ToString(TUseBoolStrs.True)], Node);
Indent; Indent;
@@ -373,7 +373,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitAssignment(const Node: IAssignmentNode); function TAstDumper.VisitAssignment(const Node: IAssignmentNode): TVoid;
begin begin
Log('Assignment', Node); Log('Assignment', Node);
Indent; Indent;
@@ -383,7 +383,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitMacroDefinition(const Node: IMacroDefinitionNode); function TAstDumper.VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid;
begin begin
Log('MacroDefinition', Node); Log('MacroDefinition', Node);
Indent; Indent;
@@ -407,7 +407,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitQuasiquote(const Node: IQuasiquoteNode); function TAstDumper.VisitQuasiquote(const Node: IQuasiquoteNode): TVoid;
begin begin
Log('Quasiquote', Node); Log('Quasiquote', Node);
Indent; Indent;
@@ -415,7 +415,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitUnquote(const Node: IUnquoteNode); function TAstDumper.VisitUnquote(const Node: IUnquoteNode): TVoid;
begin begin
Log('Unquote', Node); Log('Unquote', Node);
Indent; Indent;
@@ -423,7 +423,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); function TAstDumper.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid;
begin begin
Log('UnquoteSplicing', Node); Log('UnquoteSplicing', Node);
Indent; Indent;
@@ -431,7 +431,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitIndexer(const Node: IIndexerNode); function TAstDumper.VisitIndexer(const Node: IIndexerNode): TVoid;
begin begin
Log('Indexer', Node); Log('Indexer', Node);
Indent; Indent;
@@ -442,7 +442,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitMemberAccess(const Node: IMemberAccessNode); function TAstDumper.VisitMemberAccess(const Node: IMemberAccessNode): TVoid;
begin begin
Log('MemberAccess', Node); Log('MemberAccess', Node);
Indent; Indent;
@@ -453,7 +453,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitRecordLiteral(const Node: IRecordLiteralNode); function TAstDumper.VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid;
var var
field: IRecordFieldNode; field: IRecordFieldNode;
begin begin
@@ -470,12 +470,12 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitCreateSeries(const Node: ICreateSeriesNode); function TAstDumper.VisitCreateSeries(const Node: ICreateSeriesNode): TVoid;
begin begin
LogFmt('CreateSeries: %s', [Node.Definition], Node); LogFmt('CreateSeries: %s', [Node.Definition], Node);
end; end;
procedure TAstDumper.VisitAddSeriesItem(const Node: IAddSeriesItemNode); function TAstDumper.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid;
begin begin
Log('AddSeriesItem', Node); Log('AddSeriesItem', Node);
Indent; Indent;
@@ -491,7 +491,7 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitSeriesLength(const Node: ISeriesLengthNode); function TAstDumper.VisitSeriesLength(const Node: ISeriesLengthNode): TVoid;
begin begin
Log('SeriesLength', Node); Log('SeriesLength', Node);
Indent; Indent;
@@ -500,14 +500,14 @@ begin
Unindent; Unindent;
end; end;
procedure TAstDumper.VisitNop(const Node: INopNode); function TAstDumper.VisitNop(const Node: INopNode): TVoid;
begin begin
Log('Nop', Node); Log('Nop', Node);
end; end;
// --- List Visitors Implementation --- // --- List Visitors Implementation ---
procedure TAstDumper.VisitParameterList(const Node: IParameterList); function TAstDumper.VisitParameterList(const Node: IParameterList): TVoid;
begin begin
// Usually handled by Parent Node iteration (Lambda), // Usually handled by Parent Node iteration (Lambda),
// but if visited directly: // but if visited directly:
@@ -515,25 +515,25 @@ begin
item.Accept(Self); item.Accept(Self);
end; end;
procedure TAstDumper.VisitArgumentList(const Node: IArgumentList); function TAstDumper.VisitArgumentList(const Node: IArgumentList): TVoid;
begin begin
for var item in Node do for var item in Node do
item.Accept(Self); item.Accept(Self);
end; end;
procedure TAstDumper.VisitExpressionList(const Node: IExpressionList); function TAstDumper.VisitExpressionList(const Node: IExpressionList): TVoid;
begin begin
for var item in Node do for var item in Node do
item.Accept(Self); item.Accept(Self);
end; end;
procedure TAstDumper.VisitRecordFieldList(const Node: IRecordFieldList); function TAstDumper.VisitRecordFieldList(const Node: IRecordFieldList): TVoid;
begin begin
for var item in Node do for var item in Node do
item.Accept(Self); item.Accept(Self);
end; end;
procedure TAstDumper.VisitRecordField(const Node: IRecordFieldNode); function TAstDumper.VisitRecordField(const Node: IRecordFieldNode): TVoid;
begin begin
// If visited directly (e.g. inside a list) // If visited directly (e.g. inside a list)
LogFmt('Field :%s', [Node.Key.Value.Name]); LogFmt('Field :%s', [Node.Key.Value.Name]);
+56 -56
View File
@@ -194,37 +194,37 @@ type
function GetResult: string; function GetResult: string;
function Execute(const RootNode: IAstNode): TDataValue; function Execute(const RootNode: IAstNode): TDataValue;
procedure VisitConstant(const Node: IConstantNode); override; function VisitConstant(const Node: IConstantNode): TVoid; override;
procedure VisitIdentifier(const Node: IIdentifierNode); override; function VisitIdentifier(const Node: IIdentifierNode): TVoid; override;
procedure VisitKeyword(const Node: IKeywordNode); override; function VisitKeyword(const Node: IKeywordNode): TVoid; override;
// List Visitors // List Visitors
procedure VisitParameterList(const Node: IParameterList); override; function VisitParameterList(const Node: IParameterList): TVoid; override;
procedure VisitArgumentList(const Node: IArgumentList); override; function VisitArgumentList(const Node: IArgumentList): TVoid; override;
procedure VisitExpressionList(const Node: IExpressionList); override; function VisitExpressionList(const Node: IExpressionList): TVoid; override;
procedure VisitRecordFieldList(const Node: IRecordFieldList); override; function VisitRecordFieldList(const Node: IRecordFieldList): TVoid; override;
procedure VisitRecordField(const Node: IRecordFieldNode); override; function VisitRecordField(const Node: IRecordFieldNode): TVoid; override;
procedure VisitIfExpression(const Node: IIfExpressionNode); override; function VisitIfExpression(const Node: IIfExpressionNode): TVoid; override;
procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); override; function VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid; override;
procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); override; function VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid; override;
procedure VisitMacroDefinition(const Node: IMacroDefinitionNode); override; function VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid; override;
procedure VisitQuasiquote(const Node: IQuasiquoteNode); override; function VisitQuasiquote(const Node: IQuasiquoteNode): TVoid; override;
procedure VisitUnquote(const Node: IUnquoteNode); override; function VisitUnquote(const Node: IUnquoteNode): TVoid; override;
procedure VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); override; function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid; override;
procedure VisitFunctionCall(const Node: IFunctionCallNode); override; function VisitFunctionCall(const Node: IFunctionCallNode): TVoid; override;
procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); override; function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid; override;
procedure VisitBlockExpression(const Node: IBlockExpressionNode); override; function VisitBlockExpression(const Node: IBlockExpressionNode): TVoid; override;
procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); override; function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid; override;
procedure VisitAssignment(const Node: IAssignmentNode); override; function VisitAssignment(const Node: IAssignmentNode): TVoid; override;
procedure VisitIndexer(const Node: IIndexerNode); override; function VisitIndexer(const Node: IIndexerNode): TVoid; override;
procedure VisitMemberAccess(const Node: IMemberAccessNode); override; function VisitMemberAccess(const Node: IMemberAccessNode): TVoid; override;
procedure VisitRecordLiteral(const Node: IRecordLiteralNode); override; function VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid; override;
procedure VisitCreateSeries(const Node: ICreateSeriesNode); override; function VisitCreateSeries(const Node: ICreateSeriesNode): TVoid; override;
procedure VisitAddSeriesItem(const Node: IAddSeriesItemNode); override; function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid; override;
procedure VisitSeriesLength(const Node: ISeriesLengthNode); override; function VisitSeriesLength(const Node: ISeriesLengthNode): TVoid; override;
procedure VisitRecurNode(const Node: IRecurNode); override; function VisitRecurNode(const Node: IRecurNode): TVoid; override;
procedure VisitNop(const Node: INopNode); override; function VisitNop(const Node: INopNode): TVoid; override;
end; end;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
@@ -851,7 +851,7 @@ begin
Result := TDataValue.Void; Result := TDataValue.Void;
end; end;
procedure TPrettyPrintVisitor.VisitConstant(const Node: IConstantNode); function TPrettyPrintVisitor.VisitConstant(const Node: IConstantNode): TVoid;
var var
val: TDataValue; val: TDataValue;
begin begin
@@ -862,19 +862,19 @@ begin
Append(val.ToString); Append(val.ToString);
end; end;
procedure TPrettyPrintVisitor.VisitIdentifier(const Node: IIdentifierNode); function TPrettyPrintVisitor.VisitIdentifier(const Node: IIdentifierNode): TVoid;
begin begin
Append(Node.Name); Append(Node.Name);
end; end;
procedure TPrettyPrintVisitor.VisitKeyword(const Node: IKeywordNode); function TPrettyPrintVisitor.VisitKeyword(const Node: IKeywordNode): TVoid;
begin begin
Append(':' + Node.Value.Name); Append(':' + Node.Value.Name);
end; end;
// --- List Visitors Implementation --- // --- List Visitors Implementation ---
procedure TPrettyPrintVisitor.VisitParameterList(const Node: IParameterList); function TPrettyPrintVisitor.VisitParameterList(const Node: IParameterList): TVoid;
begin begin
Append('['); Append('[');
for var i := 0 to Node.Count - 1 do for var i := 0 to Node.Count - 1 do
@@ -886,7 +886,7 @@ begin
Append(']'); Append(']');
end; end;
procedure TPrettyPrintVisitor.VisitArgumentList(const Node: IArgumentList); function TPrettyPrintVisitor.VisitArgumentList(const Node: IArgumentList): TVoid;
begin begin
// Argument list does not have brackets of its own in Lisp call syntax // Argument list does not have brackets of its own in Lisp call syntax
for var i := 0 to Node.Count - 1 do for var i := 0 to Node.Count - 1 do
@@ -896,7 +896,7 @@ begin
end; end;
end; end;
procedure TPrettyPrintVisitor.VisitExpressionList(const Node: IExpressionList); function TPrettyPrintVisitor.VisitExpressionList(const Node: IExpressionList): TVoid;
begin begin
Indent; Indent;
for var item in Node do for var item in Node do
@@ -908,7 +908,7 @@ begin
NewLine; NewLine;
end; end;
procedure TPrettyPrintVisitor.VisitRecordFieldList(const Node: IRecordFieldList); function TPrettyPrintVisitor.VisitRecordFieldList(const Node: IRecordFieldList): TVoid;
begin begin
Indent; Indent;
for var item in Node do for var item in Node do
@@ -920,7 +920,7 @@ begin
NewLine; NewLine;
end; end;
procedure TPrettyPrintVisitor.VisitRecordField(const Node: IRecordFieldNode); function TPrettyPrintVisitor.VisitRecordField(const Node: IRecordFieldNode): TVoid;
begin begin
Node.Key.Accept(Self); Node.Key.Accept(Self);
Append(' '); Append(' ');
@@ -929,7 +929,7 @@ end;
// --- Node Visitors --- // --- Node Visitors ---
procedure TPrettyPrintVisitor.VisitIfExpression(const Node: IIfExpressionNode); function TPrettyPrintVisitor.VisitIfExpression(const Node: IIfExpressionNode): TVoid;
begin begin
Append('(if '); Append('(if ');
Node.Condition.Accept(Self); Node.Condition.Accept(Self);
@@ -946,7 +946,7 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode); function TPrettyPrintVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid;
begin begin
Append('(? '); Append('(? ');
Node.Condition.Accept(Self); Node.Condition.Accept(Self);
@@ -960,7 +960,7 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode); function TPrettyPrintVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid;
begin begin
Append('(fn '); Append('(fn ');
Node.Parameters.Accept(Self); Node.Parameters.Accept(Self);
@@ -972,7 +972,7 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode); function TPrettyPrintVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid;
begin begin
Append('(defmacro '); Append('(defmacro ');
Node.Name.Accept(Self); Node.Name.Accept(Self);
@@ -986,25 +986,25 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitQuasiquote(const Node: IQuasiquoteNode); function TPrettyPrintVisitor.VisitQuasiquote(const Node: IQuasiquoteNode): TVoid;
begin begin
Append('`'); Append('`');
Node.Expression.Accept(Self); Node.Expression.Accept(Self);
end; end;
procedure TPrettyPrintVisitor.VisitUnquote(const Node: IUnquoteNode); function TPrettyPrintVisitor.VisitUnquote(const Node: IUnquoteNode): TVoid;
begin begin
Append('~'); Append('~');
Node.Expression.Accept(Self); Node.Expression.Accept(Self);
end; end;
procedure TPrettyPrintVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); function TPrettyPrintVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid;
begin begin
Append('~@'); Append('~@');
Node.Expression.Accept(Self); Node.Expression.Accept(Self);
end; end;
procedure TPrettyPrintVisitor.VisitFunctionCall(const Node: IFunctionCallNode); function TPrettyPrintVisitor.VisitFunctionCall(const Node: IFunctionCallNode): TVoid;
begin begin
if (Node.Callee.Kind = akIdentifier) and (Node.Callee.AsIdentifier.Name = 'quote') and (Node.Arguments.Count = 1) then if (Node.Callee.Kind = akIdentifier) and (Node.Callee.AsIdentifier.Name = 'quote') and (Node.Arguments.Count = 1) then
begin begin
@@ -1019,26 +1019,26 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode); function TPrettyPrintVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid;
begin begin
VisitFunctionCall(Node.CallNode); VisitFunctionCall(Node.CallNode);
end; end;
procedure TPrettyPrintVisitor.VisitRecurNode(const Node: IRecurNode); function TPrettyPrintVisitor.VisitRecurNode(const Node: IRecurNode): TVoid;
begin begin
Append('(recur'); Append('(recur');
Node.Arguments.Accept(Self); Node.Arguments.Accept(Self);
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitBlockExpression(const Node: IBlockExpressionNode); function TPrettyPrintVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): TVoid;
begin begin
Append('(do'); Append('(do');
Node.Expressions.Accept(Self); Node.Expressions.Accept(Self);
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode); function TPrettyPrintVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid;
begin begin
Append('(def '); Append('(def ');
Node.Target.Accept(Self); Node.Target.Accept(Self);
@@ -1050,7 +1050,7 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitAssignment(const Node: IAssignmentNode); function TPrettyPrintVisitor.VisitAssignment(const Node: IAssignmentNode): TVoid;
begin begin
Append('(assign '); Append('(assign ');
Node.Target.Accept(Self); Node.Target.Accept(Self);
@@ -1059,7 +1059,7 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitIndexer(const Node: IIndexerNode); function TPrettyPrintVisitor.VisitIndexer(const Node: IIndexerNode): TVoid;
begin begin
Append('(get '); Append('(get ');
Node.Base.Accept(Self); Node.Base.Accept(Self);
@@ -1068,7 +1068,7 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitMemberAccess(const Node: IMemberAccessNode); function TPrettyPrintVisitor.VisitMemberAccess(const Node: IMemberAccessNode): TVoid;
begin begin
Append('(.'); Append('(.');
Node.Member.Accept(Self); Node.Member.Accept(Self);
@@ -1077,7 +1077,7 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode); function TPrettyPrintVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid;
begin begin
if Node.Fields.Count = 0 then if Node.Fields.Count = 0 then
begin begin
@@ -1090,12 +1090,12 @@ begin
Append('}'); Append('}');
end; end;
procedure TPrettyPrintVisitor.VisitCreateSeries(const Node: ICreateSeriesNode); function TPrettyPrintVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): TVoid;
begin begin
Append(Format('(new-series "%s")', [Node.Definition])); Append(Format('(new-series "%s")', [Node.Definition]));
end; end;
procedure TPrettyPrintVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode); function TPrettyPrintVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid;
begin begin
Append('(add-item '); Append('(add-item ');
Node.Series.Accept(Self); Node.Series.Accept(Self);
@@ -1109,12 +1109,12 @@ begin
Append(')'); Append(')');
end; end;
procedure TPrettyPrintVisitor.VisitNop(const Node: INopNode); function TPrettyPrintVisitor.VisitNop(const Node: INopNode): TVoid;
begin begin
Append('...'); Append('...');
end; end;
procedure TPrettyPrintVisitor.VisitSeriesLength(const Node: ISeriesLengthNode); function TPrettyPrintVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TVoid;
begin begin
Append('(count '); Append('(count ');
Node.Series.Accept(Self); Node.Series.Accept(Self);
+217 -455
View File
@@ -82,36 +82,37 @@ type
// Visit a node. // Visit a node.
function Accept(const Node: IAstNode): T; virtual; function Accept(const Node: IAstNode): T; virtual;
function VisitConstant(const Node: IConstantNode): T; virtual; abstract; // Default visitor functions implemented analogous to TAstVisitor
function VisitIdentifier(const Node: IIdentifierNode): T; virtual; abstract; function VisitConstant(const Node: IConstantNode): T; virtual;
function VisitKeyword(const Node: IKeywordNode): T; virtual; abstract; function VisitIdentifier(const Node: IIdentifierNode): T; virtual;
function VisitKeyword(const Node: IKeywordNode): T; virtual;
function VisitParameterList(const Node: IParameterList): T; virtual; abstract; function VisitParameterList(const Node: IParameterList): T; virtual;
function VisitArgumentList(const Node: IArgumentList): T; virtual; abstract; function VisitArgumentList(const Node: IArgumentList): T; virtual;
function VisitExpressionList(const Node: IExpressionList): T; virtual; abstract; function VisitExpressionList(const Node: IExpressionList): T; virtual;
function VisitRecordFieldList(const Node: IRecordFieldList): T; virtual; abstract; function VisitRecordFieldList(const Node: IRecordFieldList): T; virtual;
function VisitRecordField(const Node: IRecordFieldNode): T; virtual; abstract; function VisitRecordField(const Node: IRecordFieldNode): T; virtual;
function VisitIfExpression(const Node: IIfExpressionNode): T; virtual; abstract; function VisitIfExpression(const Node: IIfExpressionNode): T; virtual;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): T; virtual; abstract; function VisitTernaryExpression(const Node: ITernaryExpressionNode): T; virtual;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): T; virtual; abstract; function VisitLambdaExpression(const Node: ILambdaExpressionNode): T; virtual;
function VisitFunctionCall(const Node: IFunctionCallNode): T; virtual; abstract; function VisitFunctionCall(const Node: IFunctionCallNode): T; virtual;
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): T; virtual; abstract; function VisitMacroExpansionNode(const Node: IMacroExpansionNode): T; virtual;
function VisitBlockExpression(const Node: IBlockExpressionNode): T; virtual; abstract; function VisitBlockExpression(const Node: IBlockExpressionNode): T; virtual;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): T; virtual; abstract; function VisitVariableDeclaration(const Node: IVariableDeclarationNode): T; virtual;
function VisitAssignment(const Node: IAssignmentNode): T; virtual; abstract; function VisitAssignment(const Node: IAssignmentNode): T; virtual;
function VisitMacroDefinition(const Node: IMacroDefinitionNode): T; virtual; abstract; function VisitMacroDefinition(const Node: IMacroDefinitionNode): T; virtual;
function VisitQuasiquote(const Node: IQuasiquoteNode): T; virtual; abstract; function VisitQuasiquote(const Node: IQuasiquoteNode): T; virtual;
function VisitUnquote(const Node: IUnquoteNode): T; virtual; abstract; function VisitUnquote(const Node: IUnquoteNode): T; virtual;
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T; virtual; abstract; function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T; virtual;
function VisitIndexer(const Node: IIndexerNode): T; virtual; abstract; function VisitIndexer(const Node: IIndexerNode): T; virtual;
function VisitMemberAccess(const Node: IMemberAccessNode): T; virtual; abstract; function VisitMemberAccess(const Node: IMemberAccessNode): T; virtual;
function VisitRecordLiteral(const Node: IRecordLiteralNode): T; virtual; abstract; function VisitRecordLiteral(const Node: IRecordLiteralNode): T; virtual;
function VisitCreateSeries(const Node: ICreateSeriesNode): T; virtual; abstract; function VisitCreateSeries(const Node: ICreateSeriesNode): T; virtual;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): T; virtual; abstract; function VisitAddSeriesItem(const Node: IAddSeriesItemNode): T; virtual;
function VisitSeriesLength(const Node: ISeriesLengthNode): T; virtual; abstract; function VisitSeriesLength(const Node: ISeriesLengthNode): T; virtual;
function VisitRecurNode(const Node: IRecurNode): T; virtual; abstract; function VisitRecurNode(const Node: IRecurNode): T; virtual;
function VisitNop(const Node: INopNode): T; virtual; abstract; function VisitNop(const Node: INopNode): T; virtual;
end; end;
TAstTransformer = class abstract(TAstVisitor<IAstNode>) TAstTransformer = class abstract(TAstVisitor<IAstNode>)
@@ -148,105 +149,11 @@ type
function VisitNop(const Node: INopNode): IAstNode; override; function VisitNop(const Node: INopNode): IAstNode; override;
end; end;
TAstVisitor = class(TInterfacedObject, IAstVisitor) TVoid = record
strict private
// IAstVisitor explicit implementation (bridge methods)
function IAstVisitor.VisitConstant = DoVisitConstant;
function IAstVisitor.VisitIdentifier = DoVisitIdentifier;
function IAstVisitor.VisitKeyword = DoVisitKeyword;
function IAstVisitor.VisitParameterList = DoVisitParameterList;
function IAstVisitor.VisitArgumentList = DoVisitArgumentList;
function IAstVisitor.VisitExpressionList = DoVisitExpressionList;
function IAstVisitor.VisitRecordFieldList = DoVisitRecordFieldList;
function IAstVisitor.VisitRecordField = DoVisitRecordField;
function IAstVisitor.VisitIfExpression = DoVisitIfExpression;
function IAstVisitor.VisitTernaryExpression = DoVisitTernaryExpression;
function IAstVisitor.VisitLambdaExpression = DoVisitLambdaExpression;
function IAstVisitor.VisitFunctionCall = DoVisitFunctionCall;
function IAstVisitor.VisitMacroExpansionNode = DoVisitMacroExpansionNode;
function IAstVisitor.VisitBlockExpression = DoVisitBlockExpression;
function IAstVisitor.VisitVariableDeclaration = DoVisitVariableDeclaration;
function IAstVisitor.VisitAssignment = DoVisitAssignment;
function IAstVisitor.VisitMacroDefinition = DoVisitMacroDefinition;
function IAstVisitor.VisitQuasiquote = DoVisitQuasiquote;
function IAstVisitor.VisitUnquote = DoVisitUnquote;
function IAstVisitor.VisitUnquoteSplicing = DoVisitUnquoteSplicing;
function IAstVisitor.VisitIndexer = DoVisitIndexer;
function IAstVisitor.VisitMemberAccess = DoVisitMemberAccess;
function IAstVisitor.VisitRecordLiteral = DoVisitRecordLiteral;
function IAstVisitor.VisitCreateSeries = DoVisitCreateSeries;
function IAstVisitor.VisitAddSeriesItem = DoVisitAddSeriesItem;
function IAstVisitor.VisitSeriesLength = DoVisitSeriesLength;
function IAstVisitor.VisitRecurNode = DoVisitRecurNode;
function IAstVisitor.VisitNop = DoVisitNop;
// Private bridge method implementations
function DoVisitConstant(const Node: IConstantNode): TDataValue;
function DoVisitIdentifier(const Node: IIdentifierNode): TDataValue;
function DoVisitKeyword(const Node: IKeywordNode): TDataValue;
function DoVisitParameterList(const Node: IParameterList): TDataValue;
function DoVisitArgumentList(const Node: IArgumentList): TDataValue;
function DoVisitExpressionList(const Node: IExpressionList): TDataValue;
function DoVisitRecordFieldList(const Node: IRecordFieldList): TDataValue;
function DoVisitRecordField(const Node: IRecordFieldNode): TDataValue;
function DoVisitIfExpression(const Node: IIfExpressionNode): TDataValue;
function DoVisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
function DoVisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
function DoVisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
function DoVisitMacroExpansionNode(const Node: IMacroExpansionNode): TDataValue;
function DoVisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
function DoVisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
function DoVisitAssignment(const Node: IAssignmentNode): TDataValue;
function DoVisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue;
function DoVisitQuasiquote(const Node: IQuasiquoteNode): TDataValue;
function DoVisitUnquote(const Node: IUnquoteNode): TDataValue;
function DoVisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue;
function DoVisitIndexer(const Node: IIndexerNode): TDataValue;
function DoVisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
function DoVisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue;
function DoVisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
function DoVisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
function DoVisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
function DoVisitRecurNode(const Node: IRecurNode): TDataValue;
function DoVisitNop(const Node: INopNode): TDataValue;
protected
// Entry point for traversal
procedure Accept(const Node: IAstNode); virtual;
// Virtual procedures with default traversal implementation
procedure VisitConstant(const Node: IConstantNode); virtual;
procedure VisitIdentifier(const Node: IIdentifierNode); virtual;
procedure VisitKeyword(const Node: IKeywordNode); virtual;
procedure VisitParameterList(const Node: IParameterList); virtual;
procedure VisitArgumentList(const Node: IArgumentList); virtual;
procedure VisitExpressionList(const Node: IExpressionList); virtual;
procedure VisitRecordFieldList(const Node: IRecordFieldList); virtual;
procedure VisitRecordField(const Node: IRecordFieldNode); virtual;
procedure VisitIfExpression(const Node: IIfExpressionNode); virtual;
procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); virtual;
procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); virtual;
procedure VisitFunctionCall(const Node: IFunctionCallNode); virtual;
procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); virtual;
procedure VisitBlockExpression(const Node: IBlockExpressionNode); virtual;
procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); virtual;
procedure VisitAssignment(const Node: IAssignmentNode); virtual;
procedure VisitMacroDefinition(const Node: IMacroDefinitionNode); virtual;
procedure VisitQuasiquote(const Node: IQuasiquoteNode); virtual;
procedure VisitUnquote(const Node: IUnquoteNode); virtual;
procedure VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); virtual;
procedure VisitIndexer(const Node: IIndexerNode); virtual;
procedure VisitMemberAccess(const Node: IMemberAccessNode); virtual;
procedure VisitRecordLiteral(const Node: IRecordLiteralNode); virtual;
procedure VisitCreateSeries(const Node: ICreateSeriesNode); virtual;
procedure VisitAddSeriesItem(const Node: IAddSeriesItemNode); virtual;
procedure VisitSeriesLength(const Node: ISeriesLengthNode); virtual;
procedure VisitRecurNode(const Node: IRecurNode); virtual;
procedure VisitNop(const Node: INopNode); virtual;
end; end;
TAstVisitor = class(TAstVisitor<TVoid>);
implementation implementation
{ TAstVisitor<T> } { TAstVisitor<T> }
@@ -374,6 +281,191 @@ begin
Result := TDataValue.FromGeneric<T>(VisitNop(Node)); Result := TDataValue.FromGeneric<T>(VisitNop(Node));
end; end;
// --- Default implementations (analogous to TAstVisitor) ---
function TAstVisitor<T>.VisitConstant(const Node: IConstantNode): T;
begin
Result := Default(T);
end;
function TAstVisitor<T>.VisitIdentifier(const Node: IIdentifierNode): T;
begin
Result := Default(T);
end;
function TAstVisitor<T>.VisitKeyword(const Node: IKeywordNode): T;
begin
Result := Default(T);
end;
function TAstVisitor<T>.VisitParameterList(const Node: IParameterList): T;
begin
Result := Default(T);
for var Item in Node do
Accept(Item);
end;
function TAstVisitor<T>.VisitArgumentList(const Node: IArgumentList): T;
begin
Result := Default(T);
for var Item in Node do
Accept(Item);
end;
function TAstVisitor<T>.VisitExpressionList(const Node: IExpressionList): T;
begin
Result := Default(T);
for var Item in Node do
Accept(Item);
end;
function TAstVisitor<T>.VisitRecordFieldList(const Node: IRecordFieldList): T;
begin
Result := Default(T);
for var Item in Node do
Accept(Item);
end;
function TAstVisitor<T>.VisitRecordField(const Node: IRecordFieldNode): T;
begin
Result := Default(T);
Accept(Node.Key);
Accept(Node.Value);
end;
function TAstVisitor<T>.VisitIfExpression(const Node: IIfExpressionNode): T;
begin
Result := Default(T);
Accept(Node.Condition);
Accept(Node.ThenBranch);
Accept(Node.ElseBranch);
end;
function TAstVisitor<T>.VisitTernaryExpression(const Node: ITernaryExpressionNode): T;
begin
Result := Default(T);
Accept(Node.Condition);
Accept(Node.ThenBranch);
Accept(Node.ElseBranch);
end;
function TAstVisitor<T>.VisitLambdaExpression(const Node: ILambdaExpressionNode): T;
begin
Result := Default(T);
Accept(Node.Parameters);
Accept(Node.Body);
end;
function TAstVisitor<T>.VisitFunctionCall(const Node: IFunctionCallNode): T;
begin
Result := Default(T);
Accept(Node.Callee);
Accept(Node.Arguments);
end;
function TAstVisitor<T>.VisitMacroExpansionNode(const Node: IMacroExpansionNode): T;
begin
Result := Default(T);
Accept(Node.CallNode);
Accept(Node.ExpandedBody);
end;
function TAstVisitor<T>.VisitBlockExpression(const Node: IBlockExpressionNode): T;
begin
Result := Default(T);
Accept(Node.Expressions);
end;
function TAstVisitor<T>.VisitVariableDeclaration(const Node: IVariableDeclarationNode): T;
begin
Result := Default(T);
Accept(Node.Target);
Accept(Node.Initializer);
end;
function TAstVisitor<T>.VisitAssignment(const Node: IAssignmentNode): T;
begin
Result := Default(T);
Accept(Node.Target);
Accept(Node.Value);
end;
function TAstVisitor<T>.VisitMacroDefinition(const Node: IMacroDefinitionNode): T;
begin
Result := Default(T);
Accept(Node.Name);
Accept(Node.Parameters);
Accept(Node.Body);
end;
function TAstVisitor<T>.VisitQuasiquote(const Node: IQuasiquoteNode): T;
begin
Result := Default(T);
Accept(Node.Expression);
end;
function TAstVisitor<T>.VisitUnquote(const Node: IUnquoteNode): T;
begin
Result := Default(T);
Accept(Node.Expression);
end;
function TAstVisitor<T>.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T;
begin
Result := Default(T);
Accept(Node.Expression);
end;
function TAstVisitor<T>.VisitIndexer(const Node: IIndexerNode): T;
begin
Result := Default(T);
Accept(Node.Base);
Accept(Node.Index);
end;
function TAstVisitor<T>.VisitMemberAccess(const Node: IMemberAccessNode): T;
begin
Result := Default(T);
Accept(Node.Base);
Accept(Node.Member);
end;
function TAstVisitor<T>.VisitRecordLiteral(const Node: IRecordLiteralNode): T;
begin
Result := Default(T);
Accept(Node.Fields);
end;
function TAstVisitor<T>.VisitCreateSeries(const Node: ICreateSeriesNode): T;
begin
Result := Default(T);
end;
function TAstVisitor<T>.VisitAddSeriesItem(const Node: IAddSeriesItemNode): T;
begin
Result := Default(T);
Accept(Node.Series);
Accept(Node.Value);
Accept(Node.Lookback);
end;
function TAstVisitor<T>.VisitSeriesLength(const Node: ISeriesLengthNode): T;
begin
Result := Default(T);
Accept(Node.Series);
end;
function TAstVisitor<T>.VisitRecurNode(const Node: IRecurNode): T;
begin
Result := Default(T);
Accept(Node.Arguments);
end;
function TAstVisitor<T>.VisitNop(const Node: INopNode): T;
begin
Result := Default(T);
end;
{ TAstTransformer } { TAstTransformer }
// --- Base Virtual Implementations --- // --- Base Virtual Implementations ---
@@ -767,334 +859,4 @@ begin
Result := TRecurNode.Create(newArgs, Node.StaticType, Node.Identity); Result := TRecurNode.Create(newArgs, Node.StaticType, Node.Identity);
end; end;
{ TAstVisitor }
procedure TAstVisitor.Accept(const Node: IAstNode);
begin
if Assigned(Node) then
Node.Accept(Self);
end;
procedure TAstVisitor.VisitConstant(const Node: IConstantNode);
begin
end;
procedure TAstVisitor.VisitIdentifier(const Node: IIdentifierNode);
begin
end;
procedure TAstVisitor.VisitKeyword(const Node: IKeywordNode);
begin
end;
procedure TAstVisitor.VisitNop(const Node: INopNode);
begin
end;
procedure TAstVisitor.VisitCreateSeries(const Node: ICreateSeriesNode);
begin
end;
// List visitors iterate children by default
procedure TAstVisitor.VisitParameterList(const Node: IParameterList);
begin
for var item in Node do
Accept(item);
end;
procedure TAstVisitor.VisitArgumentList(const Node: IArgumentList);
begin
for var item in Node do
Accept(item);
end;
procedure TAstVisitor.VisitExpressionList(const Node: IExpressionList);
begin
for var item in Node do
Accept(item);
end;
procedure TAstVisitor.VisitRecordFieldList(const Node: IRecordFieldList);
begin
for var item in Node do
Accept(item);
end;
procedure TAstVisitor.VisitRecordField(const Node: IRecordFieldNode);
begin
Accept(Node.Key);
Accept(Node.Value);
end;
procedure TAstVisitor.VisitIfExpression(const Node: IIfExpressionNode);
begin
Accept(Node.Condition);
Accept(Node.ThenBranch);
Accept(Node.ElseBranch);
end;
procedure TAstVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode);
begin
Accept(Node.Condition);
Accept(Node.ThenBranch);
Accept(Node.ElseBranch);
end;
procedure TAstVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode);
begin
Accept(Node.Parameters);
Accept(Node.Body);
end;
procedure TAstVisitor.VisitFunctionCall(const Node: IFunctionCallNode);
begin
Accept(Node.Callee);
Accept(Node.Arguments);
end;
procedure TAstVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode);
begin
Accept(Node.CallNode);
Accept(Node.ExpandedBody);
end;
procedure TAstVisitor.VisitBlockExpression(const Node: IBlockExpressionNode);
begin
Accept(Node.Expressions);
end;
procedure TAstVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode);
begin
Accept(Node.Target);
Accept(Node.Initializer);
end;
procedure TAstVisitor.VisitAssignment(const Node: IAssignmentNode);
begin
Accept(Node.Target);
Accept(Node.Value);
end;
procedure TAstVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode);
begin
Accept(Node.Name);
Accept(Node.Parameters);
Accept(Node.Body);
end;
procedure TAstVisitor.VisitQuasiquote(const Node: IQuasiquoteNode);
begin
Accept(Node.Expression);
end;
procedure TAstVisitor.VisitUnquote(const Node: IUnquoteNode);
begin
Accept(Node.Expression);
end;
procedure TAstVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode);
begin
Accept(Node.Expression);
end;
procedure TAstVisitor.VisitIndexer(const Node: IIndexerNode);
begin
Accept(Node.Base);
Accept(Node.Index);
end;
procedure TAstVisitor.VisitMemberAccess(const Node: IMemberAccessNode);
begin
Accept(Node.Base);
Accept(Node.Member);
end;
procedure TAstVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode);
begin
Accept(Node.Fields);
end;
procedure TAstVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode);
begin
Accept(Node.Series);
Accept(Node.Value);
Accept(Node.Lookback);
end;
procedure TAstVisitor.VisitSeriesLength(const Node: ISeriesLengthNode);
begin
Accept(Node.Series);
end;
procedure TAstVisitor.VisitRecurNode(const Node: IRecurNode);
begin
Accept(Node.Arguments);
end;
// --- TAstVisitor (Non-Generic) Bridge Implementations ---
function TAstVisitor.DoVisitConstant(const Node: IConstantNode): TDataValue;
begin
VisitConstant(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitIdentifier(const Node: IIdentifierNode): TDataValue;
begin
VisitIdentifier(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitKeyword(const Node: IKeywordNode): TDataValue;
begin
VisitKeyword(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitParameterList(const Node: IParameterList): TDataValue;
begin
VisitParameterList(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitArgumentList(const Node: IArgumentList): TDataValue;
begin
VisitArgumentList(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitExpressionList(const Node: IExpressionList): TDataValue;
begin
VisitExpressionList(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitRecordFieldList(const Node: IRecordFieldList): TDataValue;
begin
VisitRecordFieldList(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitRecordField(const Node: IRecordFieldNode): TDataValue;
begin
VisitRecordField(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitIfExpression(const Node: IIfExpressionNode): TDataValue;
begin
VisitIfExpression(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
begin
VisitTernaryExpression(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
begin
VisitLambdaExpression(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
begin
VisitFunctionCall(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitMacroExpansionNode(const Node: IMacroExpansionNode): TDataValue;
begin
VisitMacroExpansionNode(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
begin
VisitBlockExpression(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
begin
VisitVariableDeclaration(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitAssignment(const Node: IAssignmentNode): TDataValue;
begin
VisitAssignment(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitMacroDefinition(const Node: IMacroDefinitionNode): TDataValue;
begin
VisitMacroDefinition(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitQuasiquote(const Node: IQuasiquoteNode): TDataValue;
begin
VisitQuasiquote(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitUnquote(const Node: IUnquoteNode): TDataValue;
begin
VisitUnquote(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TDataValue;
begin
VisitUnquoteSplicing(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitIndexer(const Node: IIndexerNode): TDataValue;
begin
VisitIndexer(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
begin
VisitMemberAccess(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitRecordLiteral(const Node: IRecordLiteralNode): TDataValue;
begin
VisitRecordLiteral(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
begin
VisitCreateSeries(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
begin
VisitAddSeriesItem(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
begin
VisitSeriesLength(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitRecurNode(const Node: IRecurNode): TDataValue;
begin
VisitRecurNode(Node);
Result := TDataValue.Void;
end;
function TAstVisitor.DoVisitNop(const Node: INopNode): TDataValue;
begin
VisitNop(Node);
Result := TDataValue.Void;
end;
end. end.
+2 -2
View File
@@ -37,7 +37,7 @@ type
FMap: TNodeMap; FMap: TNodeMap;
procedure ApplyType(const Node: IAstNode); procedure ApplyType(const Node: IAstNode);
protected protected
procedure Accept(const Node: IAstNode); override; function Accept(const Node: IAstNode): TVoid; override;
public public
constructor Create(AMap: TNodeMap); constructor Create(AMap: TNodeMap);
end; end;
@@ -968,7 +968,7 @@ begin
end; end;
end; end;
procedure TAstEditor.TTypePropagator.Accept(const Node: IAstNode); function TAstEditor.TTypePropagator.Accept(const Node: IAstNode): TVoid;
begin begin
if Node = nil then if Node = nil then
exit; exit;