Skip to content

Commit 6aa7ccf

Browse files
committed
Rootnode can now be of multiple types (not just Unit)
1 parent 69c370e commit 6aa7ccf

File tree

2 files changed

+82
-16
lines changed

2 files changed

+82
-16
lines changed

Source/DelphiAST.Consts.pas

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ interface
6565
ntImplementation,
6666
ntImplements,
6767
ntIn,
68+
ntInclude,
6869
ntIndex,
6970
ntIndexed,
7071
ntInherited,
@@ -73,6 +74,7 @@ interface
7374
ntIs,
7475
ntLabel,
7576
ntLHS,
77+
ntLibrary,
7678
ntLiteral,
7779
ntLower,
7880
ntLowerEqual,
@@ -90,6 +92,7 @@ interface
9092
ntParameters,
9193
ntPath,
9294
ntPositionalArgument,
95+
ntProgramm,
9396
ntProtected,
9497
ntPrivate,
9598
ntProperty,
@@ -220,6 +223,7 @@ interface
220223
'implementation',
221224
'implements',
222225
'in',
226+
'include',
223227
'index',
224228
'indexed',
225229
'inherited',
@@ -228,6 +232,7 @@ interface
228232
'is',
229233
'label',
230234
'lhs',
235+
'library',
231236
'literal',
232237
'lower',
233238
'lowerequal',
@@ -245,6 +250,7 @@ interface
245250
'parameters',
246251
'path',
247252
'positionalargument',
253+
'programm',
248254
'protected',
249255
'private',
250256
'property',

Source/DelphiAST.pas

Lines changed: 76 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ TPasSyntaxTreeBuilder = class(TmwSimplePasParEx)
6161
procedure CallInheritedPropertyParameterList;
6262
procedure SetCurrentCompoundNodesEndPosition;
6363
procedure DoOnComment(Sender: TObject; const Text: string);
64+
procedure PushRootNode(Typ: TSyntaxNodeType);
6465
protected
66+
FRootNode: TSyntaxNode;
6567
FStack: TNodeStack;
6668
FComments: TObjectList<TCommentNode>;
6769
procedure AccessSpecifier; override;
@@ -145,6 +147,7 @@ TPasSyntaxTreeBuilder = class(TmwSimplePasParEx)
145147
procedure Identifier; override;
146148
procedure ImplementationSection; override;
147149
procedure ImplementsSpecifier; override;
150+
procedure IncludeFile; override;
148151
procedure IndexSpecifier; override;
149152
procedure IndexOp; override;
150153
procedure InheritedStatement; override;
@@ -157,6 +160,7 @@ TPasSyntaxTreeBuilder = class(TmwSimplePasParEx)
157160
procedure InterfaceSection; override;
158161
procedure InterfaceType; override;
159162
procedure LabelId; override;
163+
procedure LibraryFile; override;
160164
procedure MainUsesClause; override;
161165
procedure MainUsedUnitStatement; override;
162166
procedure MethodKind; override;
@@ -166,6 +170,7 @@ TPasSyntaxTreeBuilder = class(TmwSimplePasParEx)
166170
procedure Number; override;
167171
procedure ObjectNameOfMethod; override;
168172
procedure OutParameter; override;
173+
procedure PackageFile; override;
169174
procedure ParameterFormal; override;
170175
procedure ParameterName; override;
171176
procedure PointerSymbol; override;
@@ -174,6 +179,7 @@ TPasSyntaxTreeBuilder = class(TmwSimplePasParEx)
174179
procedure ProcedureHeading; override;
175180
procedure ProcedureDeclarationSection; override;
176181
procedure ProcedureProcedureName; override;
182+
procedure ProgramFile; override;
177183
procedure PropertyName; override;
178184
procedure PropertyParameterList; override;
179185
procedure RaiseStatement; override;
@@ -1501,6 +1507,16 @@ procedure TPasSyntaxTreeBuilder.ImplementsSpecifier;
15011507
end;
15021508
end;
15031509

1510+
procedure TPasSyntaxTreeBuilder.IncludeFile;
1511+
begin
1512+
PushRootNode(ntInclude);
1513+
try
1514+
inherited;
1515+
finally
1516+
FStack.Pop;
1517+
end;
1518+
end;
1519+
15041520
procedure TPasSyntaxTreeBuilder.IndexOp;
15051521
begin
15061522
FStack.Push(ntIndexed);
@@ -1635,6 +1651,16 @@ procedure TPasSyntaxTreeBuilder.LabelId;
16351651
inherited;
16361652
end;
16371653

1654+
procedure TPasSyntaxTreeBuilder.LibraryFile;
1655+
begin
1656+
PushRootNode(ntLibrary);
1657+
try
1658+
inherited;
1659+
finally
1660+
FStack.Pop;
1661+
end;
1662+
end;
1663+
16381664
procedure TPasSyntaxTreeBuilder.MainUsedUnitStatement;
16391665
var
16401666
NameNode, PathNode, PathLiteralNode, Temp: TSyntaxNode;
@@ -1787,6 +1813,16 @@ procedure TPasSyntaxTreeBuilder.OutParameter;
17871813
end;
17881814
end;
17891815

1816+
procedure TPasSyntaxTreeBuilder.PackageFile;
1817+
begin
1818+
PushRootNode(ntPackage);
1819+
try
1820+
inherited;
1821+
finally
1822+
FStack.Pop;
1823+
end;
1824+
end;
1825+
17901826
procedure TPasSyntaxTreeBuilder.ParameterFormal;
17911827
begin
17921828
FStack.Push(ntParameters);
@@ -1868,6 +1904,16 @@ procedure TPasSyntaxTreeBuilder.PropertyName;
18681904
inherited PropertyName;
18691905
end;
18701906

1907+
procedure TPasSyntaxTreeBuilder.ProgramFile;
1908+
begin
1909+
PushRootNode(ntProgramm);
1910+
try
1911+
inherited;
1912+
finally
1913+
FStack.Pop;
1914+
end;
1915+
end;
1916+
18711917
procedure TPasSyntaxTreeBuilder.PropertyParameterList;
18721918
var
18731919
TreeBuilderMethod: TTreeBuilderMethod;
@@ -2047,26 +2093,29 @@ class function TPasSyntaxTreeBuilder.Run(const FileName: string;
20472093

20482094
function TPasSyntaxTreeBuilder.Run(SourceStream: TStream): TSyntaxNode;
20492095
begin
2050-
Result := TSyntaxNode.Create(ntUnit);
20512096
try
2097+
FRootNode := nil;
20522098
FStack.Clear;
2053-
FStack.Push(Result);
2054-
try
2055-
self.OnMessage := ParserMessage;
2056-
inherited Run('', SourceStream);
2057-
finally
2058-
FStack.Pop;
2059-
end;
2099+
self.OnMessage := ParserMessage;
2100+
inherited Run('', SourceStream);
20602101
except
20612102
on E: EParserException do
2062-
raise ESyntaxTreeException.Create(E.Line, E.Col, Lexer.FileName, E.Message, Result);
2103+
if FRootNode <> nil then
2104+
raise ESyntaxTreeException.Create(E.Line, E.Col, Lexer.FileName, E.Message, FRootNode)
2105+
else
2106+
raise;
20632107
on E: ESyntaxError do
2064-
raise ESyntaxTreeException.Create(E.PosXY.X, E.PosXY.Y, Lexer.FileName, E.Message, Result);
2108+
if FRootNode <> nil then
2109+
raise ESyntaxTreeException.Create(E.PosXY.X, E.PosXY.Y, Lexer.FileName, E.Message, FRootNode)
2110+
else
2111+
raise;
20652112
else
2066-
FreeAndNil(Result);
2113+
FreeAndNil(FRootNode);
20672114
raise;
20682115
end;
20692116

2117+
Result := FRootNode;
2118+
20702119
Assert(FStack.Count = 0);
20712120
end;
20722121

@@ -2458,12 +2507,13 @@ procedure TPasSyntaxTreeBuilder.UnaryMinus;
24582507
end;
24592508

24602509
procedure TPasSyntaxTreeBuilder.UnitFile;
2461-
var
2462-
Temp: TSyntaxNode;
24632510
begin
2464-
Temp := FStack.Peek;
2465-
AssignLexerPositionToNode(Lexer, Temp);
2466-
inherited;
2511+
PushRootNode(ntUnit);
2512+
try
2513+
inherited;
2514+
finally
2515+
FStack.Pop;
2516+
end;
24672517
end;
24682518

24692519
procedure TPasSyntaxTreeBuilder.UnitId;
@@ -2730,6 +2780,16 @@ procedure TPasSyntaxTreeBuilder.WithStatement;
27302780
end;
27312781
end;
27322782

2783+
procedure TPasSyntaxTreeBuilder.PushRootNode(Typ: TSyntaxNodeType);
2784+
begin
2785+
Assert(FRootNode = nil);
2786+
Assert(FStack.Count = 0);
2787+
2788+
FRootNode := TSyntaxNode.Create(Typ);
2789+
2790+
FStack.Push(FRootNode);
2791+
end;
2792+
27332793
{ ESyntaxTreeException }
27342794

27352795
constructor ESyntaxTreeException.Create(Line, Col: Integer; const FileName, Msg: string;

0 commit comments

Comments
 (0)