an update

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@384 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2008-03-25 08:18:55 +00:00
parent d2181a25d4
commit 8743c9552c

View File

@ -1,3 +1,15 @@
{
ObjCParserTypes.pas
Copyright (C) 2008 Dmitry 'Skalogryz' Boyarintsev
objc parsing unit
}
//todo: pre-compile directives
//todo: enum and struct and a lot of other types...
unit ObjCParserTypes; unit ObjCParserTypes;
interface interface
@ -12,7 +24,6 @@ type
TCharSet = set of Char; TCharSet = set of Char;
TTokenPair = record TTokenPair = record
Open : AnsiString; Open : AnsiString;
Close : AnsiString; Close : AnsiString;
@ -42,8 +53,9 @@ type
TEntity = class(TObject) TEntity = class(TObject)
public public
owner : TEntity;
Items : TList; Items : TList;
constructor Create; constructor Create(AOwner: TEntity);
destructor Destroy; override; destructor Destroy; override;
procedure Parse(AParser: TTextParser); virtual; abstract; procedure Parse(AParser: TTextParser); virtual; abstract;
end; end;
@ -53,6 +65,8 @@ type
TResultTypeDef = class(TEntity) TResultTypeDef = class(TEntity)
_isRef : Boolean; _isRef : Boolean;
_TypeName : AnsiString; _TypeName : AnsiString;
_isConst : Boolean; // (const Sometype)
_Prefix : AnsiString; // reserved-word type descriptors
procedure Parse(AParser: TTextParser); override; procedure Parse(AParser: TTextParser); override;
end; end;
@ -81,8 +95,16 @@ type
function GetResultType: TResultTypeDef; function GetResultType: TResultTypeDef;
end; end;
{ TClassDef } { TSubSection }
//todo: implement
TSubSection = class(TEntity) // for public, protected and private sections
_EntityName : AnsiString;
procedure Parse(AParser: TTextParser); override;
end;
{ TClassDef }
TClassDef = class(TEntity) TClassDef = class(TEntity)
public public
_ClassName : AnsiString; _ClassName : AnsiString;
@ -95,6 +117,7 @@ type
TObjCHeader = class(TEntity) TObjCHeader = class(TEntity)
public public
_FileName : AnsiString;
constructor Create; constructor Create;
procedure Parse(AParser: TTextParser); override; procedure Parse(AParser: TTextParser); override;
end; end;
@ -304,9 +327,10 @@ end;
{ TEntity } { TEntity }
constructor TEntity.Create; constructor TEntity.Create(AOwner: TEntity);
begin begin
inherited; inherited Create;
Owner := AOwner;
Items := TList.Create; Items := TList.Create;
end; end;
@ -351,7 +375,7 @@ begin
if s[1] ='#' then SkipLine(AParser.buf, AParser.Index); if s[1] ='#' then SkipLine(AParser.buf, AParser.Index);
if (s = '+') or (s = '-') then begin if (s = '+') or (s = '-') then begin
dec(AParser.Index ); // roll back a single character dec(AParser.Index ); // roll back a single character
mtd := TClassMethodDef.Create; mtd := TClassMethodDef.Create(Self);
mtd.Parse(AParser); mtd.Parse(AParser);
Items.Add(mtd); Items.Add(mtd);
end; end;
@ -363,13 +387,10 @@ end;
constructor TObjCHeader.Create; constructor TObjCHeader.Create;
begin begin
//obj-c header does not have any entity owners
inherited Create; inherited Create(nil);
end; end;
procedure TObjCHeader.Parse(AParser:TTextParser); procedure TObjCHeader.Parse(AParser:TTextParser);
var var
s : AnsiString; s : AnsiString;
@ -378,7 +399,7 @@ var
begin begin
while AParser.FindNextToken(s, tt) do begin while AParser.FindNextToken(s, tt) do begin
if s = '@interface' then begin if s = '@interface' then begin
cl := TClassDef.Create; cl := TClassDef.Create(Self);
cl.Parse(AParser); cl.Parse(AParser);
Items.Add(cl); Items.Add(cl);
end; end;
@ -425,7 +446,7 @@ begin
if (tt = tt_Symbol) and(s = '(') then begin if (tt = tt_Symbol) and(s = '(') then begin
// _Class methods can be with out type // _Class methods can be with out type
dec(AParser.Index); dec(AParser.Index);
res := TResultTypeDef.Create; res := TResultTypeDef.Create(Self);
res.Parse(AParser); res.Parse(AParser);
Items.Add(res); Items.Add(res);
end; end;
@ -438,11 +459,11 @@ begin
if s = ';' then if s = ';' then
Exit Exit
else if s = ':' then begin else if s = ':' then begin
para := TParameterDef.Create; para := TParameterDef.Create(Self);
para.Parse(AParser); para.Parse(AParser);
Items.Add(para); Items.Add(para);
end else if tt = tt_Ident then begin end else if tt = tt_Ident then begin
des := TParamDescr.Create; des := TParamDescr.Create(Self);
des._Descr := s; des._Descr := s;
Items.Add(des) Items.Add(des)
end; end;
@ -466,7 +487,7 @@ procedure TParameterDef.Parse(AParser:TTextParser);
var var
tt : TTokenType; tt : TTokenType;
begin begin
_Res := TResultTypeDef.Create; _Res := TResultTypeDef.Create(Self);
Items.Add(_Res); Items.Add(_Res);
_Res.Parse(AParser); _Res.Parse(AParser);
AParser.FindNextToken(_Name, tt) AParser.FindNextToken(_Name, tt)
@ -474,6 +495,22 @@ end;
{ TResultTypeDef } { TResultTypeDef }
const
TypeDefReserved : array [0..1] of AnsiString = (
'unsigned', 'const'
);
function IsTypeDefReserved(const s: AnsiString): Boolean;
var
i : integer;
begin
Result := false;
for i := 0 to length(TypeDefReserved) - 1 do
if TypeDefReserved[i] = s then begin
Result := true;
Exit;
end;
end;
procedure TResultTypeDef.Parse(AParser: TTextParser); procedure TResultTypeDef.Parse(AParser: TTextParser);
var var
@ -485,28 +522,24 @@ begin
if (tt <> tt_Symbol) and (s <> '(') then Exit; if (tt <> tt_Symbol) and (s <> '(') then Exit;
AParser.FindNextToken(_TypeName, tt); _prefix := '';
_TypeName := '';
if _TypeName = 'unsigned' then begin repeat
AParser.FindNextToken(s, tt); AParser.FindNextToken(s, tt);
if isTypeDefReserved(s) then begin
_TypeName := _TypeName + ' ' + s; _prefix := _prefix + s;
if s = 'unsigned' then _TypeName := _typeName + ' ' + s;
end; s := '';
end;
until s <> '';
_TypeName := _TypeName + s;
if tt <> tt_Ident then Exit; // an error if tt <> tt_Ident then Exit; // an error
AParser.FindNextToken(s, tt); AParser.FindNextToken(s, tt);
if (tt = tt_Symbol) and (s = '*') then begin if (tt = tt_Symbol) and (s = '*') then begin
_isRef := true; _isRef := true;
AParser.FindNextToken(s, tt); AParser.FindNextToken(s, tt);
end; end;
if s <> ')' then ; // an error if s <> ')' then ; // an error
@ -522,11 +555,14 @@ procedure TParamDescr.Parse(AParser: TTextParser);
var var
tt : TTokenType; tt : TTokenType;
begin begin
AParser.FindNextToken(_Descr, tt); AParser.FindNextToken(_Descr, tt);
end; end;
{ TSubSection }
procedure TSubSection.Parse(AParser: TTextParser);
begin
//todo:
end;
end. end.