Ast visitor refactoring
This commit is contained in:
+56
-56
@@ -31,37 +31,37 @@ type
|
||||
|
||||
protected
|
||||
// Override abstract PROCEDURES from TAstVisitor
|
||||
procedure VisitConstant(const Node: IConstantNode); override;
|
||||
procedure VisitIdentifier(const Node: IIdentifierNode); override;
|
||||
procedure VisitKeyword(const Node: IKeywordNode); override;
|
||||
procedure VisitIfExpression(const Node: IIfExpressionNode); override;
|
||||
procedure VisitTernaryExpression(const Node: ITernaryExpressionNode); override;
|
||||
procedure VisitLambdaExpression(const Node: ILambdaExpressionNode); override;
|
||||
procedure VisitFunctionCall(const Node: IFunctionCallNode); override;
|
||||
procedure VisitMacroExpansionNode(const Node: IMacroExpansionNode); override;
|
||||
procedure VisitRecurNode(const Node: IRecurNode); override;
|
||||
procedure VisitBlockExpression(const Node: IBlockExpressionNode); override;
|
||||
procedure VisitVariableDeclaration(const Node: IVariableDeclarationNode); override;
|
||||
procedure VisitAssignment(const Node: IAssignmentNode); 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 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 VisitNop(const Node: INopNode); override;
|
||||
function VisitConstant(const Node: IConstantNode): TVoid; override;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): TVoid; override;
|
||||
function VisitKeyword(const Node: IKeywordNode): TVoid; override;
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): TVoid; override;
|
||||
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid; override;
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid; override;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): TVoid; override;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid; override;
|
||||
function VisitRecurNode(const Node: IRecurNode): TVoid; override;
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): TVoid; override;
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid; override;
|
||||
function VisitAssignment(const Node: IAssignmentNode): 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 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 VisitNop(const Node: INopNode): TVoid; override;
|
||||
|
||||
// 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.
|
||||
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;
|
||||
|
||||
public
|
||||
constructor Create(const AOutput: TStrings);
|
||||
@@ -151,12 +151,12 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitConstant(const Node: IConstantNode);
|
||||
function TAstDumper.VisitConstant(const Node: IConstantNode): TVoid;
|
||||
begin
|
||||
LogFmt('Constant: %s', [Node.Value.ToString], Node);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitIdentifier(const Node: IIdentifierNode);
|
||||
function TAstDumper.VisitIdentifier(const Node: IIdentifierNode): TVoid;
|
||||
var
|
||||
adr: TResolvedAddress;
|
||||
begin
|
||||
@@ -167,12 +167,12 @@ begin
|
||||
LogFmt('Identifier: %s (unbound)', [Node.Name], Node);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitKeyword(const Node: IKeywordNode);
|
||||
function TAstDumper.VisitKeyword(const Node: IKeywordNode): TVoid;
|
||||
begin
|
||||
LogFmt('Keyword: :%s', [Node.Value.Name], Node);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitIfExpression(const Node: IIfExpressionNode);
|
||||
function TAstDumper.VisitIfExpression(const Node: IIfExpressionNode): TVoid;
|
||||
begin
|
||||
Log('IfExpression', Node);
|
||||
Indent;
|
||||
@@ -188,7 +188,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitTernaryExpression(const Node: ITernaryExpressionNode);
|
||||
function TAstDumper.VisitTernaryExpression(const Node: ITernaryExpressionNode): TVoid;
|
||||
begin
|
||||
Log('TernaryExpression', Node);
|
||||
Indent;
|
||||
@@ -201,7 +201,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitLambdaExpression(const Node: ILambdaExpressionNode);
|
||||
function TAstDumper.VisitLambdaExpression(const Node: ILambdaExpressionNode): TVoid;
|
||||
var
|
||||
upvalueAddr: TResolvedAddress;
|
||||
symbols: TArray<string>;
|
||||
@@ -265,7 +265,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitFunctionCall(const Node: IFunctionCallNode);
|
||||
function TAstDumper.VisitFunctionCall(const Node: IFunctionCallNode): TVoid;
|
||||
var
|
||||
arg: IAstNode;
|
||||
staticStatus: string;
|
||||
@@ -309,7 +309,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitMacroExpansionNode(const Node: IMacroExpansionNode);
|
||||
function TAstDumper.VisitMacroExpansionNode(const Node: IMacroExpansionNode): TVoid;
|
||||
var
|
||||
arg: IAstNode;
|
||||
begin
|
||||
@@ -335,7 +335,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitRecurNode(const Node: IRecurNode);
|
||||
function TAstDumper.VisitRecurNode(const Node: IRecurNode): TVoid;
|
||||
var
|
||||
arg: IAstNode;
|
||||
begin
|
||||
@@ -349,7 +349,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitBlockExpression(const Node: IBlockExpressionNode);
|
||||
function TAstDumper.VisitBlockExpression(const Node: IBlockExpressionNode): TVoid;
|
||||
var
|
||||
expr: IAstNode;
|
||||
begin
|
||||
@@ -360,7 +360,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitVariableDeclaration(const Node: IVariableDeclarationNode);
|
||||
function TAstDumper.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TVoid;
|
||||
begin
|
||||
LogFmt('VariableDeclaration (IsBoxed: %s)', [Node.IsBoxed.ToString(TUseBoolStrs.True)], Node);
|
||||
Indent;
|
||||
@@ -373,7 +373,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitAssignment(const Node: IAssignmentNode);
|
||||
function TAstDumper.VisitAssignment(const Node: IAssignmentNode): TVoid;
|
||||
begin
|
||||
Log('Assignment', Node);
|
||||
Indent;
|
||||
@@ -383,7 +383,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitMacroDefinition(const Node: IMacroDefinitionNode);
|
||||
function TAstDumper.VisitMacroDefinition(const Node: IMacroDefinitionNode): TVoid;
|
||||
begin
|
||||
Log('MacroDefinition', Node);
|
||||
Indent;
|
||||
@@ -407,7 +407,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitQuasiquote(const Node: IQuasiquoteNode);
|
||||
function TAstDumper.VisitQuasiquote(const Node: IQuasiquoteNode): TVoid;
|
||||
begin
|
||||
Log('Quasiquote', Node);
|
||||
Indent;
|
||||
@@ -415,7 +415,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitUnquote(const Node: IUnquoteNode);
|
||||
function TAstDumper.VisitUnquote(const Node: IUnquoteNode): TVoid;
|
||||
begin
|
||||
Log('Unquote', Node);
|
||||
Indent;
|
||||
@@ -423,7 +423,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode);
|
||||
function TAstDumper.VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): TVoid;
|
||||
begin
|
||||
Log('UnquoteSplicing', Node);
|
||||
Indent;
|
||||
@@ -431,7 +431,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitIndexer(const Node: IIndexerNode);
|
||||
function TAstDumper.VisitIndexer(const Node: IIndexerNode): TVoid;
|
||||
begin
|
||||
Log('Indexer', Node);
|
||||
Indent;
|
||||
@@ -442,7 +442,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitMemberAccess(const Node: IMemberAccessNode);
|
||||
function TAstDumper.VisitMemberAccess(const Node: IMemberAccessNode): TVoid;
|
||||
begin
|
||||
Log('MemberAccess', Node);
|
||||
Indent;
|
||||
@@ -453,7 +453,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitRecordLiteral(const Node: IRecordLiteralNode);
|
||||
function TAstDumper.VisitRecordLiteral(const Node: IRecordLiteralNode): TVoid;
|
||||
var
|
||||
field: IRecordFieldNode;
|
||||
begin
|
||||
@@ -470,12 +470,12 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitCreateSeries(const Node: ICreateSeriesNode);
|
||||
function TAstDumper.VisitCreateSeries(const Node: ICreateSeriesNode): TVoid;
|
||||
begin
|
||||
LogFmt('CreateSeries: %s', [Node.Definition], Node);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitAddSeriesItem(const Node: IAddSeriesItemNode);
|
||||
function TAstDumper.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TVoid;
|
||||
begin
|
||||
Log('AddSeriesItem', Node);
|
||||
Indent;
|
||||
@@ -491,7 +491,7 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitSeriesLength(const Node: ISeriesLengthNode);
|
||||
function TAstDumper.VisitSeriesLength(const Node: ISeriesLengthNode): TVoid;
|
||||
begin
|
||||
Log('SeriesLength', Node);
|
||||
Indent;
|
||||
@@ -500,14 +500,14 @@ begin
|
||||
Unindent;
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitNop(const Node: INopNode);
|
||||
function TAstDumper.VisitNop(const Node: INopNode): TVoid;
|
||||
begin
|
||||
Log('Nop', Node);
|
||||
end;
|
||||
|
||||
// --- List Visitors Implementation ---
|
||||
|
||||
procedure TAstDumper.VisitParameterList(const Node: IParameterList);
|
||||
function TAstDumper.VisitParameterList(const Node: IParameterList): TVoid;
|
||||
begin
|
||||
// Usually handled by Parent Node iteration (Lambda),
|
||||
// but if visited directly:
|
||||
@@ -515,25 +515,25 @@ begin
|
||||
item.Accept(Self);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitArgumentList(const Node: IArgumentList);
|
||||
function TAstDumper.VisitArgumentList(const Node: IArgumentList): TVoid;
|
||||
begin
|
||||
for var item in Node do
|
||||
item.Accept(Self);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitExpressionList(const Node: IExpressionList);
|
||||
function TAstDumper.VisitExpressionList(const Node: IExpressionList): TVoid;
|
||||
begin
|
||||
for var item in Node do
|
||||
item.Accept(Self);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitRecordFieldList(const Node: IRecordFieldList);
|
||||
function TAstDumper.VisitRecordFieldList(const Node: IRecordFieldList): TVoid;
|
||||
begin
|
||||
for var item in Node do
|
||||
item.Accept(Self);
|
||||
end;
|
||||
|
||||
procedure TAstDumper.VisitRecordField(const Node: IRecordFieldNode);
|
||||
function TAstDumper.VisitRecordField(const Node: IRecordFieldNode): TVoid;
|
||||
begin
|
||||
// If visited directly (e.g. inside a list)
|
||||
LogFmt('Field :%s', [Node.Key.Value.Name]);
|
||||
|
||||
+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);
|
||||
|
||||
+217
-455
@@ -82,36 +82,37 @@ type
|
||||
// Visit a node.
|
||||
function Accept(const Node: IAstNode): T; virtual;
|
||||
|
||||
function VisitConstant(const Node: IConstantNode): T; virtual; abstract;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): T; virtual; abstract;
|
||||
function VisitKeyword(const Node: IKeywordNode): T; virtual; abstract;
|
||||
// Default visitor functions implemented analogous to TAstVisitor
|
||||
function VisitConstant(const Node: IConstantNode): T; virtual;
|
||||
function VisitIdentifier(const Node: IIdentifierNode): T; virtual;
|
||||
function VisitKeyword(const Node: IKeywordNode): T; virtual;
|
||||
|
||||
function VisitParameterList(const Node: IParameterList): T; virtual; abstract;
|
||||
function VisitArgumentList(const Node: IArgumentList): T; virtual; abstract;
|
||||
function VisitExpressionList(const Node: IExpressionList): T; virtual; abstract;
|
||||
function VisitRecordFieldList(const Node: IRecordFieldList): T; virtual; abstract;
|
||||
function VisitRecordField(const Node: IRecordFieldNode): T; virtual; abstract;
|
||||
function VisitParameterList(const Node: IParameterList): T; virtual;
|
||||
function VisitArgumentList(const Node: IArgumentList): T; virtual;
|
||||
function VisitExpressionList(const Node: IExpressionList): T; virtual;
|
||||
function VisitRecordFieldList(const Node: IRecordFieldList): T; virtual;
|
||||
function VisitRecordField(const Node: IRecordFieldNode): T; virtual;
|
||||
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): T; virtual; abstract;
|
||||
function VisitTernaryExpression(const Node: ITernaryExpressionNode): T; virtual; abstract;
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): T; virtual; abstract;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): T; virtual; abstract;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): T; virtual; abstract;
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): T; virtual; abstract;
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): T; virtual; abstract;
|
||||
function VisitAssignment(const Node: IAssignmentNode): T; virtual; abstract;
|
||||
function VisitMacroDefinition(const Node: IMacroDefinitionNode): T; virtual; abstract;
|
||||
function VisitQuasiquote(const Node: IQuasiquoteNode): T; virtual; abstract;
|
||||
function VisitUnquote(const Node: IUnquoteNode): T; virtual; abstract;
|
||||
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T; virtual; abstract;
|
||||
function VisitIndexer(const Node: IIndexerNode): T; virtual; abstract;
|
||||
function VisitMemberAccess(const Node: IMemberAccessNode): T; virtual; abstract;
|
||||
function VisitRecordLiteral(const Node: IRecordLiteralNode): T; virtual; abstract;
|
||||
function VisitCreateSeries(const Node: ICreateSeriesNode): T; virtual; abstract;
|
||||
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): T; virtual; abstract;
|
||||
function VisitSeriesLength(const Node: ISeriesLengthNode): T; virtual; abstract;
|
||||
function VisitRecurNode(const Node: IRecurNode): T; virtual; abstract;
|
||||
function VisitNop(const Node: INopNode): T; virtual; abstract;
|
||||
function VisitIfExpression(const Node: IIfExpressionNode): T; virtual;
|
||||
function VisitTernaryExpression(const Node: ITernaryExpressionNode): T; virtual;
|
||||
function VisitLambdaExpression(const Node: ILambdaExpressionNode): T; virtual;
|
||||
function VisitFunctionCall(const Node: IFunctionCallNode): T; virtual;
|
||||
function VisitMacroExpansionNode(const Node: IMacroExpansionNode): T; virtual;
|
||||
function VisitBlockExpression(const Node: IBlockExpressionNode): T; virtual;
|
||||
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): T; virtual;
|
||||
function VisitAssignment(const Node: IAssignmentNode): T; virtual;
|
||||
function VisitMacroDefinition(const Node: IMacroDefinitionNode): T; virtual;
|
||||
function VisitQuasiquote(const Node: IQuasiquoteNode): T; virtual;
|
||||
function VisitUnquote(const Node: IUnquoteNode): T; virtual;
|
||||
function VisitUnquoteSplicing(const Node: IUnquoteSplicingNode): T; virtual;
|
||||
function VisitIndexer(const Node: IIndexerNode): T; virtual;
|
||||
function VisitMemberAccess(const Node: IMemberAccessNode): T; virtual;
|
||||
function VisitRecordLiteral(const Node: IRecordLiteralNode): T; virtual;
|
||||
function VisitCreateSeries(const Node: ICreateSeriesNode): T; virtual;
|
||||
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): T; virtual;
|
||||
function VisitSeriesLength(const Node: ISeriesLengthNode): T; virtual;
|
||||
function VisitRecurNode(const Node: IRecurNode): T; virtual;
|
||||
function VisitNop(const Node: INopNode): T; virtual;
|
||||
end;
|
||||
|
||||
TAstTransformer = class abstract(TAstVisitor<IAstNode>)
|
||||
@@ -148,105 +149,11 @@ type
|
||||
function VisitNop(const Node: INopNode): IAstNode; override;
|
||||
end;
|
||||
|
||||
TAstVisitor = class(TInterfacedObject, IAstVisitor)
|
||||
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;
|
||||
TVoid = record
|
||||
end;
|
||||
|
||||
TAstVisitor = class(TAstVisitor<TVoid>);
|
||||
|
||||
implementation
|
||||
|
||||
{ TAstVisitor<T> }
|
||||
@@ -374,6 +281,191 @@ begin
|
||||
Result := TDataValue.FromGeneric<T>(VisitNop(Node));
|
||||
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 }
|
||||
|
||||
// --- Base Virtual Implementations ---
|
||||
@@ -767,334 +859,4 @@ begin
|
||||
Result := TRecurNode.Create(newArgs, Node.StaticType, Node.Identity);
|
||||
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.
|
||||
|
||||
@@ -37,7 +37,7 @@ type
|
||||
FMap: TNodeMap;
|
||||
procedure ApplyType(const Node: IAstNode);
|
||||
protected
|
||||
procedure Accept(const Node: IAstNode); override;
|
||||
function Accept(const Node: IAstNode): TVoid; override;
|
||||
public
|
||||
constructor Create(AMap: TNodeMap);
|
||||
end;
|
||||
@@ -968,7 +968,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAstEditor.TTypePropagator.Accept(const Node: IAstNode);
|
||||
function TAstEditor.TTypePropagator.Accept(const Node: IAstNode): TVoid;
|
||||
begin
|
||||
if Node = nil then
|
||||
exit;
|
||||
|
||||
Reference in New Issue
Block a user