Difference between revisions of "fcl-passrc"
From Free Pascal wiki
Jump to navigationJump to search (Initial page) |
(+ example source code using fcl-passrc) |
||
Line 1: | Line 1: | ||
− | |||
This package contains some useful units for dealing with Pascal source | This package contains some useful units for dealing with Pascal source | ||
files: Parsing, creating structures in memory, and output to files. | files: Parsing, creating structures in memory, and output to files. | ||
Line 21: | Line 20: | ||
|---- | |---- | ||
|} | |} | ||
+ | |||
+ | = 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 [[Package_List|Packages List]] | Go to back [[Package_List|Packages List]] |
Revision as of 02:17, 26 April 2010
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