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
@@ -194,37 +194,37 @@ type
function GetResult: string;
function Execute(const RootNode: IAstNode): TDataValue;
procedure VisitConstant(const Node: IConstantNode); override;
procedure VisitIdentifier(const Node: IIdentifierNode); override;
procedure VisitKeyword(const Node: IKeywordNode); override;
function VisitConstant(const Node: IConstantNode): TVoid; override;
function VisitIdentifier(const Node: IIdentifierNode): TVoid; override;
function VisitKeyword(const Node: IKeywordNode): TVoid; override;
// List Visitors
procedure VisitParameterList(const Node: IParameterList); override;
procedure VisitArgumentList(const Node: IArgumentList); override;
procedure VisitExpressionList(const Node: IExpressionList); override;
procedure VisitRecordFieldList(const Node: IRecordFieldList); override;
procedure VisitRecordField(const Node: IRecordFieldNode); override;
function VisitParameterList(const Node: IParameterList): TVoid; override;
function VisitArgumentList(const Node: IArgumentList): TVoid; override;
function VisitExpressionList(const Node: IExpressionList): TVoid; override;
function VisitRecordFieldList(const Node: IRecordFieldList): TVoid; override;
function VisitRecordField(const Node: IRecordFieldNode): TVoid; override;
procedure VisitIfExpression(const Node: IIfExpressionNode); override;
procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); override;
procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); override;
procedure VisitMacroDefinition(const Node: IMacroDefinitionNode); override;
procedure VisitQuasiquote(const Node: IQuasiquoteNode); override;
procedure VisitUnquote(const Node: IUnquoteNode); override;
procedure VisitUnquoteSplicing(const Node: IUnquoteSplicingNode); override;
procedure VisitFunctionCall(const Node: IFunctionCallNode); override;
procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); override;
procedure VisitBlockExpression(const Node: IBlockExpressionNode); override;
procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); override;
procedure VisitAssignment(const Node: IAssignmentNode); override;
procedure VisitIndexer(const Node: IIndexerNode); override;
procedure VisitMemberAccess(const Node: IMemberAccessNode); override;
procedure VisitRecordLiteral(const Node: IRecordLiteralNode); override;
procedure VisitCreateSeries(const Node: ICreateSeriesNode); override;
procedure VisitAddSeriesItem(const Node: IAddSeriesItemNode); override;
procedure VisitSeriesLength(const Node: ISeriesLengthNode); override;
procedure VisitRecurNode(const Node: IRecurNode); override;
procedure VisitNop(const Node: INopNode); override;
function VisitIfExpression(const Node: IIfExpressionNode): TVoid; override;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid; override;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid; override;
function VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid; override;
function VisitQuasiquote(const Node: IQuasiquoteNode): TVoid; override;
function VisitUnquote(const Node: IUnquoteNode): TVoid; override;
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid; override;
function VisitFunctionCall(const Node: IFunctionCallNode): TVoid; override;
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid; override;
function VisitBlockExpression(const Node: IBlockExpressionNode): TVoid; override;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid; override;
function VisitAssignment(const Node: IAssignmentNode): TVoid; override;
function VisitIndexer(const Node: IIndexerNode): TVoid; override;
function VisitMemberAccess(const Node: IMemberAccessNode): TVoid; override;
function VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid; override;
function VisitCreateSeries(const Node: ICreateSeriesNode): TVoid; override;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid; override;
function VisitSeriesLength(const Node: ISeriesLengthNode): TVoid; override;
function VisitRecurNode(const Node: IRecurNode): TVoid; override;
function VisitNop(const Node: INopNode): TVoid; override;
end;
// -----------------------------------------------------------------------------
@@ -851,7 +851,7 @@ begin
Result := TDataValue.Void;
end;
procedure TPrettyPrintVisitor.VisitConstant(const Node: IConstantNode);
function TPrettyPrintVisitor.VisitConstant(const Node: IConstantNode): TVoid;
var
val: TDataValue;
begin
@@ -862,19 +862,19 @@ begin
Append(val.ToString);
end;
procedure TPrettyPrintVisitor.VisitIdentifier(const Node: IIdentifierNode);
function TPrettyPrintVisitor.VisitIdentifier(const Node: IIdentifierNode): TVoid;
begin
Append(Node.Name);
end;
procedure TPrettyPrintVisitor.VisitKeyword(const Node: IKeywordNode);
function TPrettyPrintVisitor.VisitKeyword(const Node: IKeywordNode): TVoid;
begin
Append(':' + Node.Value.Name);
end;
// --- List Visitors Implementation ---
procedure TPrettyPrintVisitor.VisitParameterList(const Node: IParameterList);
function TPrettyPrintVisitor.VisitParameterList(const Node: IParameterList): TVoid;
begin
Append('[');
for var i := 0 to Node.Count - 1 do
@@ -886,7 +886,7 @@ begin
Append(']');
end;
procedure TPrettyPrintVisitor.VisitArgumentList(const Node: IArgumentList);
function TPrettyPrintVisitor.VisitArgumentList(const Node: IArgumentList): TVoid;
begin
// Argument list does not have brackets of its own in Lisp call syntax
for var i := 0 to Node.Count - 1 do
@@ -896,7 +896,7 @@ begin
end;
end;
procedure TPrettyPrintVisitor.VisitExpressionList(const Node: IExpressionList);
function TPrettyPrintVisitor.VisitExpressionList(const Node: IExpressionList): TVoid;
begin
Indent;
for var item in Node do
@@ -908,7 +908,7 @@ begin
NewLine;
end;
procedure TPrettyPrintVisitor.VisitRecordFieldList(const Node: IRecordFieldList);
function TPrettyPrintVisitor.VisitRecordFieldList(const Node: IRecordFieldList): TVoid;
begin
Indent;
for var item in Node do
@@ -920,7 +920,7 @@ begin
NewLine;
end;
procedure TPrettyPrintVisitor.VisitRecordField(const Node: IRecordFieldNode);
function TPrettyPrintVisitor.VisitRecordField(const Node: IRecordFieldNode): TVoid;
begin
Node.Key.Accept(Self);
Append(' ');
@@ -929,7 +929,7 @@ end;
// --- Node Visitors ---
procedure TPrettyPrintVisitor.VisitIfExpression(const Node: IIfExpressionNode);
function TPrettyPrintVisitor.VisitIfExpression(const Node: IIfExpressionNode): TVoid;
begin
Append('(if ');
Node.Condition.Accept(Self);
@@ -946,7 +946,7 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode);
function TPrettyPrintVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid;
begin
Append('(? ');
Node.Condition.Accept(Self);
@@ -960,7 +960,7 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode);
function TPrettyPrintVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid;
begin
Append('(fn ');
Node.Parameters.Accept(Self);
@@ -972,7 +972,7 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode);
function TPrettyPrintVisitor.VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid;
begin
Append('(defmacro ');
Node.Name.Accept(Self);
@@ -986,25 +986,25 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitQuasiquote(const Node: IQuasiquoteNode);
function TPrettyPrintVisitor.VisitQuasiquote(const Node: IQuasiquoteNode): TVoid;
begin
Append('`');
Node.Expression.Accept(Self);
end;
procedure TPrettyPrintVisitor.VisitUnquote(const Node: IUnquoteNode);
function TPrettyPrintVisitor.VisitUnquote(const Node: IUnquoteNode): TVoid;
begin
Append('~');
Node.Expression.Accept(Self);
end;
procedure TPrettyPrintVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode);
function TPrettyPrintVisitor.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid;
begin
Append('~@');
Node.Expression.Accept(Self);
end;
procedure TPrettyPrintVisitor.VisitFunctionCall(const Node: IFunctionCallNode);
function TPrettyPrintVisitor.VisitFunctionCall(const Node: IFunctionCallNode): TVoid;
begin
if (Node.Callee.Kind = akIdentifier) and (Node.Callee.AsIdentifier.Name = 'quote') and (Node.Arguments.Count = 1) then
begin
@@ -1019,26 +1019,26 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode);
function TPrettyPrintVisitor.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid;
begin
VisitFunctionCall(Node.CallNode);
end;
procedure TPrettyPrintVisitor.VisitRecurNode(const Node: IRecurNode);
function TPrettyPrintVisitor.VisitRecurNode(const Node: IRecurNode): TVoid;
begin
Append('(recur');
Node.Arguments.Accept(Self);
Append(')');
end;
procedure TPrettyPrintVisitor.VisitBlockExpression(const Node: IBlockExpressionNode);
function TPrettyPrintVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): TVoid;
begin
Append('(do');
Node.Expressions.Accept(Self);
Append(')');
end;
procedure TPrettyPrintVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode);
function TPrettyPrintVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid;
begin
Append('(def ');
Node.Target.Accept(Self);
@@ -1050,7 +1050,7 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitAssignment(const Node: IAssignmentNode);
function TPrettyPrintVisitor.VisitAssignment(const Node: IAssignmentNode): TVoid;
begin
Append('(assign ');
Node.Target.Accept(Self);
@@ -1059,7 +1059,7 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitIndexer(const Node: IIndexerNode);
function TPrettyPrintVisitor.VisitIndexer(const Node: IIndexerNode): TVoid;
begin
Append('(get ');
Node.Base.Accept(Self);
@@ -1068,7 +1068,7 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitMemberAccess(const Node: IMemberAccessNode);
function TPrettyPrintVisitor.VisitMemberAccess(const Node: IMemberAccessNode): TVoid;
begin
Append('(.');
Node.Member.Accept(Self);
@@ -1077,7 +1077,7 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode);
function TPrettyPrintVisitor.VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid;
begin
if Node.Fields.Count = 0 then
begin
@@ -1090,12 +1090,12 @@ begin
Append('}');
end;
procedure TPrettyPrintVisitor.VisitCreateSeries(const Node: ICreateSeriesNode);
function TPrettyPrintVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): TVoid;
begin
Append(Format('(new-series "%s")', [Node.Definition]));
end;
procedure TPrettyPrintVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode);
function TPrettyPrintVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid;
begin
Append('(add-item ');
Node.Series.Accept(Self);
@@ -1109,12 +1109,12 @@ begin
Append(')');
end;
procedure TPrettyPrintVisitor.VisitNop(const Node: INopNode);
function TPrettyPrintVisitor.VisitNop(const Node: INopNode): TVoid;
begin
Append('...');
end;
procedure TPrettyPrintVisitor.VisitSeriesLength(const Node: ISeriesLengthNode);
function TPrettyPrintVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TVoid;
begin
Append('(count ');
Node.Series.Accept(Self);