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