precompiler added

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@389 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2008-03-27 15:27:00 +00:00
parent ad5806519e
commit 794bde9c44

View File

@ -14,22 +14,69 @@ program Project1;
uses uses
Classes, SysUtils, ObjCParserUtils, ObjCParserTypes; Classes, SysUtils, ObjCParserUtils, ObjCParserTypes;
type
// this object is used only for precomile directives handling
TPrecompileHandler = class(TObject)
public
hdr : TObjCHeader;
procedure OnPrecompile(Sender: TObject);
constructor Create(AHeader: TObjCHeader);
end;
procedure TPrecompileHandler.OnPrecompile(Sender: TObject);
var
parser : TTextParser;
preEntity : TPrecompiler;
lst : TEntity;
prc : TNotifyEvent;
begin
parser := Sender as TTextParser;
//todo: change for something nicier =)
prc := parser.OnPrecompile;
parser.OnPrecompile := nil;
try
if parser.Stack.Count > 0 then
lst := TEntity(parser.Stack[parser.Stack.Count-1])
else
lst := nil;
preEntity := TPrecompiler.Create(lst);
preEntity.Parse(parser);
//writeln('added to: ', lst.ClassName, ' ', preEntity._Directive + preEntity._Params);
lst.Items.Add(preEntity);
//write('// debug: ');
//writeln('precompile: ', preEntity._Directive, ', params:', preEntity._Params);
finally
parser.OnPrecompile := prc;
end;
end;
constructor TPrecompileHandler.Create(AHeader: TObjCHeader);
begin
hdr := AHeader;
end;
procedure ReadAndParseFile(const FileName: AnsiString; outdata: TStrings); procedure ReadAndParseFile(const FileName: AnsiString; outdata: TStrings);
var var
hdr : TObjCHeader; hdr : TObjCHeader;
txt : TTextParser; txt : TTextParser;
s : AnsiString; prec : TPrecompileHandler;
s : AnsiString;
begin begin
if not FileExists(FileName) then if not FileExists(FileName) then
Exit; Exit;
s := StrFromFile(FileName); s := StrFromFile(FileName);
hdr := TObjCHeader.Create; hdr := TObjCHeader.Create;
prec := TPrecompileHandler.Create(hdr);
txt := TTextParser.Create; txt := TTextParser.Create;
txt.TokenTable := CreateObjCTokenTable; txt.TokenTable := CreateObjCTokenTable;
try try
txt.Buf := s; txt.Buf := s;
try try
txt.TokenTable.Precompile := '#';
txt.OnPrecompile := prec.OnPrecompile;
hdr._FileName := ExtractFileName(FileName); hdr._FileName := ExtractFileName(FileName);
hdr.Parse(txt); hdr.Parse(txt);
except except
@ -39,6 +86,7 @@ begin
hdr.Free; hdr.Free;
txt.TokenTable.Free; txt.TokenTable.Free;
txt.Free; txt.Free;
prec.Free;
end; end;
end; end;