DelphiAST
DelphiAST copied to clipboard
Libraries, programs, and packages should also be parsed.
The fix:
function TPasSyntaxTreeBuilder.Run(SourceStream: TStream): TSyntaxNode;
begin
Result:= nil;
try
FStack.Clear;
try
self.OnMessage := ParserMessage;
inherited Run('', SourceStream);
finally
Result:= FStack.Peek;
FStack.Pop;
end;
except
on E: EParserException do
raise ESyntaxTreeException.Create(E.Line, E.Col, Lexer.FileName, E.Message, Result);
on E: ESyntaxError do
raise ESyntaxTreeException.Create(E.PosXY.X, E.PosXY.Y, Lexer.FileName, E.Message, Result);
else
FreeAndNil(Result);
raise;
end;
Assert(FStack.Count = 0);
end;
procedure TPasSyntaxTreeBuilder.LibraryFile;
begin
//Assert(FStack.Peek.ParentNode = nil);
FStack.Push(TSyntaxNode.Create(ntLibary));
AssignLexerPositionToNode(Lexer, FStack.Peek);
inherited;
//Stack.pop is done in `Run`
end;
procedure TPasSyntaxTreeBuilder.ProgramFile;
begin
//Assert(FStack.Peek.ParentNode = nil);
FStack.Push(TSyntaxNode.Create(ntProgram));
AssignLexerPositionToNode(Lexer, FStack.Peek);
inherited;
//Stack.pop is done in `Run`
end;
procedure TPasSyntaxTreeBuilder.PackageFile;
begin
//Assert(FStack.Peek.ParentNode = nil);
FStack.Push(TSyntaxNode.Create(ntPackage));
AssignLexerPositionToNode(Lexer, FStack.Peek);
inherited;
//Stack.pop is done in `Run`
end;
procedure TPasSyntaxTreeBuilder.UnitFile;
begin
//Assert(FStack.Peek.ParentNode = nil);
FStack.Push(TSyntaxNode.Create(ntUnit));
AssignLexerPositionToNode(Lexer, FStack.Peek);
inherited;
//Stack.pop is done in `Run`
end;