fcl-passrc

From Free Pascal wiki
Revision as of 02:17, 26 April 2010 by Michalis (talk | contribs) (+ example source code using fcl-passrc)
Jump to navigationJump to search

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

<pascal> {$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: TList;

begin

 E := TSimpleEngine.Create;
 try
   M := ParseSource(E, ParamStr(1), 'linux', 'i386');
   { Cool, we successfully parsed the unit.
     Now output some info about it. }
   Decls := M.InterfaceSection.Declarations;
   for I := 0 to Decls.Count - 1 do
     Writeln('Interface item ', I, ': ' +
       (TObject(Decls[I]) as TPasElement).Name);
   FreeAndNil(M);
 finally FreeAndNil(E) end;

end. </pascal>

Go to back Packages List