chelper: cleanup error message generator. added obj-c class bit sized fields support

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3983 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
skalogryz
2015-03-03 03:42:45 +00:00
parent bacca9d664
commit 3a121294b0
2 changed files with 34 additions and 6 deletions

View File

@ -28,7 +28,7 @@ uses
const
Err_Ident = 'Identifier';
Err_Expect = '%s, excepted, but "%s" found';
Err_Expect = 'Token "%s" excepted, but "%s" found';
Err_BadPrecompile = 'Bad precompile directive';
type
@ -322,7 +322,7 @@ type
TCustomEntityProc = function (Parent: TEntity; Parser: TTextParser): TEntity;
procedure ErrorExpect(Parser: TTextParser; const Expect: AnsiString);
function ConsumeToken(Parser: TTextParser; const Token: AnsiString): Boolean;
function ConsumeToken(Parser: TTextParser; const Token: AnsiString; const comment: string = ''): Boolean;
function ConsumeIdentifier(Parser: TTextParser; var Id: AnsiString): Boolean;
function ParseCType(Parser: TTextParser): TEntity;
@ -424,6 +424,7 @@ end;
function ErrExpectStr(const Expected, Found: AnsiString): AnsiString;
begin
//todo: duplication ?
Result := Format(Err_Expect, [Expected, Found]);
end;
@ -1556,14 +1557,15 @@ end;
procedure ErrorExpect(Parser:TTextParser;const Expect:AnsiString);
begin
Parser.SetError('expected: "'+ Expect + '" but "'+Parser.Token+'" found');
//todo: duplication ?
Parser.SetError( ErrExpectStr( Expect, Parser.Token) );
end;
function ConsumeToken(Parser:TTextParser;const Token:AnsiString):Boolean;
function ConsumeToken(Parser:TTextParser;const Token: AnsiString; const comment: string):Boolean;
begin
Result:=Parser.Token=Token;
if Result then Parser.NextToken
else Parser.SetError('Token expected: '+Token);
else Parser.SetError( ErrExpectStr( Token, Parser.Token)+comment);
end;
function ConsumeIdentifier(Parser: TTextParser; var Id: AnsiString): Boolean;

View File

@ -71,6 +71,8 @@ type
public
scope : TObjCScope;
v : TVarFuncEntity;
bits : TExpression;
isbitted : Boolean;
destructor Destroy; override;
end;
@ -179,6 +181,8 @@ var
iv : TObjCInstVar;
s : AnsiString;
scope : TObjCScope;
isbitted : Boolean;
bits : TExpression;
begin
Result:=True;
if AParser.Token<>'{' then Exit;
@ -201,10 +205,21 @@ begin
AParser.NextToken;
end else begin
v:=TVarFuncEntity.Create(AParser.TokenPos);
if not ParseNames(AParser, v.RetType, v.Names, [';']) then Exit;
if not ParseNames(AParser, v.RetType, v.Names, [';',':']) then Exit;
if AParser.Token=':' then begin
AParser.NextToken;
isbitted:=True;
bits:=ParseCExpr(AParser);
end else begin
isbitted:=false;
bits:=nil;
end;
iv:=TObjCInstVar.Create(v.Offset);
iv.v:=v;
iv.scope:=scope;
iv.isbitted:=isbitted;
iv.bits:=bits;
Vars.Add(iv);
if AParser.Token=';' then AParser.NextToken;
end;
@ -219,6 +234,7 @@ var
itf : TObjCInterface;
i : Integer;
nm : AnsiString;
ent : TEntity;
begin
Result:=nil;
if AParser.Token<>'@interface' then Exit;
@ -258,6 +274,14 @@ begin
AParser.NextToken;
end;
{ todo: typedef could be found within class
while APArser.Token='typedef' do begin
ent := ParseTypeDef(APArser );
if not Assigned(ent) then Exit;
itf.Vars.Add(ent);
end;
}
ParseInstVars(AParser, itf.Vars);
end;
@ -428,6 +452,7 @@ begin
if ConsumeToken(AParser,'...') then m.VarParams:=True
else ErrorExpect(AParser, '...');
end;
if not ConsumeToken(AParser, ';') then Exit;
Result:=m;
@ -506,6 +531,7 @@ end;
destructor TObjCInstVar.Destroy;
begin
v.Free;
bits.Free;
inherited Destroy;
end;