You've already forked lazarus-ccr
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:
@ -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.
|
||||||
|
Reference in New Issue
Block a user