Ast visitor refactoring
This commit is contained in:
+56
-56
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user