@@ -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 ;
15021508end ;
15031509
1510+ procedure TPasSyntaxTreeBuilder.IncludeFile ;
1511+ begin
1512+ PushRootNode(ntInclude);
1513+ try
1514+ inherited ;
1515+ finally
1516+ FStack.Pop;
1517+ end ;
1518+ end ;
1519+
15041520procedure TPasSyntaxTreeBuilder.IndexOp ;
15051521begin
15061522 FStack.Push(ntIndexed);
@@ -1635,6 +1651,16 @@ procedure TPasSyntaxTreeBuilder.LabelId;
16351651 inherited ;
16361652end ;
16371653
1654+ procedure TPasSyntaxTreeBuilder.LibraryFile ;
1655+ begin
1656+ PushRootNode(ntLibrary);
1657+ try
1658+ inherited ;
1659+ finally
1660+ FStack.Pop;
1661+ end ;
1662+ end ;
1663+
16381664procedure TPasSyntaxTreeBuilder.MainUsedUnitStatement ;
16391665var
16401666 NameNode, PathNode, PathLiteralNode, Temp: TSyntaxNode;
@@ -1787,6 +1813,16 @@ procedure TPasSyntaxTreeBuilder.OutParameter;
17871813 end ;
17881814end ;
17891815
1816+ procedure TPasSyntaxTreeBuilder.PackageFile ;
1817+ begin
1818+ PushRootNode(ntPackage);
1819+ try
1820+ inherited ;
1821+ finally
1822+ FStack.Pop;
1823+ end ;
1824+ end ;
1825+
17901826procedure TPasSyntaxTreeBuilder.ParameterFormal ;
17911827begin
17921828 FStack.Push(ntParameters);
@@ -1868,6 +1904,16 @@ procedure TPasSyntaxTreeBuilder.PropertyName;
18681904 inherited PropertyName;
18691905end ;
18701906
1907+ procedure TPasSyntaxTreeBuilder.ProgramFile ;
1908+ begin
1909+ PushRootNode(ntProgramm);
1910+ try
1911+ inherited ;
1912+ finally
1913+ FStack.Pop;
1914+ end ;
1915+ end ;
1916+
18711917procedure TPasSyntaxTreeBuilder.PropertyParameterList ;
18721918var
18731919 TreeBuilderMethod: TTreeBuilderMethod;
@@ -2047,26 +2093,29 @@ class function TPasSyntaxTreeBuilder.Run(const FileName: string;
20472093
20482094function TPasSyntaxTreeBuilder.Run (SourceStream: TStream): TSyntaxNode;
20492095begin
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 );
20712120end ;
20722121
@@ -2458,12 +2507,13 @@ procedure TPasSyntaxTreeBuilder.UnaryMinus;
24582507end ;
24592508
24602509procedure TPasSyntaxTreeBuilder.UnitFile ;
2461- var
2462- Temp: TSyntaxNode;
24632510begin
2464- Temp := FStack.Peek;
2465- AssignLexerPositionToNode(Lexer, Temp);
2466- inherited ;
2511+ PushRootNode(ntUnit);
2512+ try
2513+ inherited ;
2514+ finally
2515+ FStack.Pop;
2516+ end ;
24672517end ;
24682518
24692519procedure TPasSyntaxTreeBuilder.UnitId ;
@@ -2730,6 +2780,16 @@ procedure TPasSyntaxTreeBuilder.WithStatement;
27302780 end ;
27312781end ;
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
27352795constructor ESyntaxTreeException.Create(Line, Col: Integer; const FileName, Msg: string;
0 commit comments