fcl-passrc
From Free Pascal wiki
Jump to navigationJump to searchThe printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
This package contains some useful units for dealing with Pascal source files: Parsing, creating structures in memory, and output to files.
Used by: fpdoc
Units
Unit | Comment |
---|---|
pastree | Pascal parse tree classes, for storing a complete Pascal module in memory. |
paswrite | A class and helper functions for creating Pascal source files from parse trees |
pparser | Parser for Pascal source files. Reads files via the pscanner unit and stores all parsed data in a parse tree, as implemented in the pastree unit. |
pscanner | Lexical scanner class for Pascal sources |
An example
{$mode objfpc}{$H+}
uses SysUtils, Classes, PParser, PasTree;
type
{ We have to override abstract TPasTreeContainer methods.
See utils/fpdoc/dglobals.pp for an implementation of TFPDocEngine,
a "real" engine. }
TSimpleEngine = class(TPasTreeContainer)
public
function CreateElement(AClass: TPTreeElement; const AName: String;
AParent: TPasElement; AVisibility: TPasMemberVisibility;
const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
override;
function FindElement(const AName: String): TPasElement; override;
end;
function TSimpleEngine.CreateElement(AClass: TPTreeElement; const AName: String;
AParent: TPasElement; AVisibility: TPasMemberVisibility;
const ASourceFilename: String; ASourceLinenumber: Integer): TPasElement;
begin
Result := AClass.Create(AName, AParent);
Result.Visibility := AVisibility;
Result.SourceFilename := ASourceFilename;
Result.SourceLinenumber := ASourceLinenumber;
end;
function TSimpleEngine.FindElement(const AName: String): TPasElement;
begin
{ dummy implementation, see TFPDocEngine.FindElement for a real example }
Result := nil;
end;
var
M: TPasModule;
E: TPasTreeContainer;
I: Integer;
Decls: {$ifdef VER2_6} TList {$else} { for FPC > 2.6.0 } TFPList {$endif};
begin
E := TSimpleEngine.Create;
try
M := ParseSource(E, ParamStr(1), 'linux', 'i386');
{ Cool, we successfully parsed the module.
Now output some info about it. }
if M.InterfaceSection <> nil then
begin
Decls := M.InterfaceSection.Declarations;
for I := 0 to Decls.Count - 1 do
Writeln('Interface item ', I, ': ' +
(TObject(Decls[I]) as TPasElement).Name);
end else
Writeln('No interface section --- this is not a unit, this is a ', M.ClassName);
if M.ImplementationSection <> nil then // may be nil in case of a simple program
begin
Decls := M.ImplementationSection.Declarations;
for I := 0 to Decls.Count - 1 do
Writeln('Implementation item ', I, ': ' +
(TObject(Decls[I]) as TPasElement).Name);
end;
FreeAndNil(M);
finally FreeAndNil(E) end;
end.
Go to back Packages List