You've already forked lazarus-ccr
chelper: fix structs and c-types parsing and improve error reporting
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1294 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -288,7 +288,8 @@ type
|
|||||||
|
|
||||||
var
|
var
|
||||||
ParseNextEntity: function (AParser: TTextParser): TEntity = nil;
|
ParseNextEntity: function (AParser: TTextParser): TEntity = nil;
|
||||||
ParseNamePart : function (Parser: TTextParser): TNamePart = nil;
|
ParseNamePart: function (Parser: TTextParser): TNamePart = nil;
|
||||||
|
ParsePreproc: function (AParser: TTextParser): TEntity = nil;
|
||||||
|
|
||||||
function ParseNextCEntity(AParser: TTextParser): TEntity; // default ParseNextEntity
|
function ParseNextCEntity(AParser: TTextParser): TEntity; // default ParseNextEntity
|
||||||
function ParseCNamePart(Parser: TTextParser): TNamePart; // default ParseNamePart
|
function ParseCNamePart(Parser: TTextParser): TNamePart; // default ParseNamePart
|
||||||
@ -1512,6 +1513,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function ParseDefPreproc(AParser: TTextParser): TEntity;
|
||||||
|
begin
|
||||||
|
Result:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure ErrorExpect(Parser:TTextParser;const Expect:AnsiString);
|
procedure ErrorExpect(Parser:TTextParser;const Expect:AnsiString);
|
||||||
begin
|
begin
|
||||||
Parser.SetError('expected: "'+ Expect + '" but "'+Parser.Token+'" found');
|
Parser.SetError('expected: "'+ Expect + '" but "'+Parser.Token+'" found');
|
||||||
@ -1538,8 +1544,9 @@ end;
|
|||||||
function ParseCType(Parser: TTextParser): TEntity;
|
function ParseCType(Parser: TTextParser): TEntity;
|
||||||
var
|
var
|
||||||
simple : TSimpleType;
|
simple : TSimpleType;
|
||||||
isunsig : Boolean;
|
issig : Boolean;
|
||||||
islong : Boolean;
|
islong : Boolean;
|
||||||
|
nm : AnsiString;
|
||||||
begin
|
begin
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
if (Parser.Token='struct') then
|
if (Parser.Token='struct') then
|
||||||
@ -1551,39 +1558,54 @@ begin
|
|||||||
else begin
|
else begin
|
||||||
if Parser.TokenType<>tt_Ident then Exit;
|
if Parser.TokenType<>tt_Ident then Exit;
|
||||||
|
|
||||||
|
nm:='';
|
||||||
simple:=TSimpleType.Create(Parser.TokenPos);
|
simple:=TSimpleType.Create(Parser.TokenPos);
|
||||||
simple.Name:=Parser.Token;
|
//simple.Name:=Parser.Token;
|
||||||
|
|
||||||
isunsig:=(simple.Name='unsigned') or (simple.Name='signed');
|
issig:=(Parser.Token='unsigned') or (simple.Name='signed');
|
||||||
islong:=(simple.Name='long');
|
if issig then begin
|
||||||
|
nm:=nm+Parser.Token+' ';
|
||||||
|
Parser.NextToken;
|
||||||
|
end;
|
||||||
|
|
||||||
|
islong:=Parser.Token='long';
|
||||||
|
if islong then begin
|
||||||
|
nm:=nm+Parser.Token+' ';
|
||||||
|
Parser.NextToken;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (Parser.Token='long') then begin
|
||||||
|
nm:=nm+Parser.Token+' ';
|
||||||
|
Parser.NextToken;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (Parser.Token='short') then begin
|
||||||
|
nm:=nm+Parser.Token+' ';
|
||||||
|
Parser.NextToken;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (Parser.Token='char') then begin
|
||||||
|
nm:=nm+Parser.Token+' ';
|
||||||
|
Parser.NextToken
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (Parser.Token='int') then begin
|
||||||
|
nm:=nm+Parser.Token+' ';
|
||||||
|
Parser.NextToken
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (Parser.Token='double') then begin
|
||||||
|
nm:=nm+Parser.Token+' ';
|
||||||
|
Parser.NextToken;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if nm<>'' then
|
||||||
|
simple.name:=Copy(nm, 1, length(nm)-1)
|
||||||
|
else begin
|
||||||
|
simple.name:=Parser.Token;
|
||||||
|
Parser.NextToken;
|
||||||
|
end;
|
||||||
Result:=simple;
|
Result:=simple;
|
||||||
Parser.NextToken;
|
|
||||||
|
|
||||||
if (Parser.Token='long') and islong then begin
|
|
||||||
simple.name:=simple.name+' '+Parser.Token;
|
|
||||||
Parser.NextToken;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if isunsig and (Parser.Token='short') then begin
|
|
||||||
simple.name:=simple.name+' '+Parser.Token;
|
|
||||||
Parser.NextToken;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if isunsig and (Parser.Token='char') then begin
|
|
||||||
simple.name:=simple.name+' '+Parser.Token;
|
|
||||||
Parser.NextToken
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (Parser.Token='int') and (isunsig or islong) then begin
|
|
||||||
simple.name:=simple.name+' '+Parser.Token;
|
|
||||||
Parser.NextToken
|
|
||||||
end;
|
|
||||||
|
|
||||||
if islong and (Parser.Token='double') then begin
|
|
||||||
simple.name:=simple.name+' '+Parser.Token;
|
|
||||||
Parser.NextToken
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1758,6 +1780,7 @@ begin
|
|||||||
if not Result then Exit;
|
if not Result then Exit;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
Result:=False;
|
||||||
repeat
|
repeat
|
||||||
Name:=ParseNamePart(Parser);
|
Name:=ParseNamePart(Parser);
|
||||||
if Assigned(Name) then Names.Add(Name);
|
if Assigned(Name) then Names.Add(Name);
|
||||||
@ -1774,6 +1797,7 @@ begin
|
|||||||
Parser.NextToken;
|
Parser.NextToken;
|
||||||
end;
|
end;
|
||||||
until done;
|
until done;
|
||||||
|
Result:=True;
|
||||||
finally
|
finally
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1865,35 +1889,39 @@ begin
|
|||||||
if AParser.Token<>'struct' then Exit;
|
if AParser.Token<>'struct' then Exit;
|
||||||
|
|
||||||
st:=TStructType.Create(AParser.TokenPos);
|
st:=TStructType.Create(AParser.TokenPos);
|
||||||
AParser.NextToken;
|
try
|
||||||
|
|
||||||
Result:=st;
|
|
||||||
if AParser.TokenType=tt_Ident then begin
|
|
||||||
Result.Name:=AParser.Token;
|
|
||||||
AParser.NextToken;
|
AParser.NextToken;
|
||||||
end;
|
|
||||||
|
|
||||||
if AParser.Token='{' then begin
|
Result:=st;
|
||||||
AParser.NextToken;
|
if AParser.TokenType=tt_Ident then begin
|
||||||
repeat
|
Result.Name:=AParser.Token;
|
||||||
v:=TVarFuncEntity.Create(AParser.TokenPos);
|
AParser.NextToken;
|
||||||
if not ParseNames(AParser, v.RetType, v.Names,[';',':']) then begin
|
end;
|
||||||
ErrorExpect(AParser, 'type name');
|
|
||||||
v.Free;
|
|
||||||
Exit;
|
|
||||||
end;
|
|
||||||
i:=st.AddField(v);
|
|
||||||
if AParser.Token=':' then begin
|
|
||||||
AParser.NextToken;
|
|
||||||
st.fields[i].isbitted:=True;
|
|
||||||
st.fields[i].bits:=ParseCExpr(AParser);
|
|
||||||
end;
|
|
||||||
if AParser.Token=';' then AParser.NextToken;
|
|
||||||
until (AParser.Token='}');
|
|
||||||
|
|
||||||
ConsumeToken(AParser, '}');
|
if AParser.Token='{' then begin
|
||||||
|
AParser.NextToken;
|
||||||
|
repeat
|
||||||
|
v:=TVarFuncEntity.Create(AParser.TokenPos);
|
||||||
|
if not ParseNames(AParser, v.RetType, v.Names,[';',':']) then begin
|
||||||
|
ErrorExpect(AParser, 'type name');
|
||||||
|
v.Free;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
i:=st.AddField(v);
|
||||||
|
if AParser.Token=':' then begin
|
||||||
|
AParser.NextToken;
|
||||||
|
st.fields[i].isbitted:=True;
|
||||||
|
st.fields[i].bits:=ParseCExpr(AParser);
|
||||||
|
end;
|
||||||
|
if AParser.Token=';' then AParser.NextToken;
|
||||||
|
until (AParser.Token='}');
|
||||||
|
|
||||||
|
if not ConsumeToken(AParser, '}') then Exit;
|
||||||
|
end;
|
||||||
|
Result:=st;
|
||||||
|
finally
|
||||||
|
if not Assigned(Result) then st.Free;
|
||||||
end;
|
end;
|
||||||
Result:=st;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function ParseUnion(AParser:TTextParser):TUnionType;
|
function ParseUnion(AParser:TTextParser):TUnionType;
|
||||||
@ -2047,6 +2075,7 @@ end;
|
|||||||
initialization
|
initialization
|
||||||
ParseNextEntity:=@ParseNextCEntity;
|
ParseNextEntity:=@ParseNextCEntity;
|
||||||
ParseNamePart:=@ParseCNamePart;
|
ParseNamePart:=@ParseCNamePart;
|
||||||
|
ParsePreproc:=@ParseDefPreproc;
|
||||||
|
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
@ -869,7 +869,7 @@ begin
|
|||||||
NeedOffset:=False;
|
NeedOffset:=False;
|
||||||
end;
|
end;
|
||||||
WriteCommentToPas(cmt, false);
|
WriteCommentToPas(cmt, false);
|
||||||
LastOffset:=cmt.Offset;
|
if cmt.Offset>LastOffset then LastOffset:=cmt.Offset;
|
||||||
inc(c);
|
inc(c);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1217,7 +1217,7 @@ begin
|
|||||||
n:=nm.owner;
|
n:=nm.owner;
|
||||||
|
|
||||||
if not Assigned(n) then begin
|
if not Assigned(n) then begin
|
||||||
if nm.Id<>basetype.Name then wr.W(nm.Id+' = '+basetype.Name)
|
if nm.Id<>basetype.Name then wr.W(nm.Id+' = '+GetPasTypeName( basetype, nil))
|
||||||
else Continue;
|
else Continue;
|
||||||
end else begin
|
end else begin
|
||||||
fn:=n.owner;
|
fn:=n.owner;
|
||||||
@ -1295,7 +1295,6 @@ begin
|
|||||||
wr.W( GetIdFromPart(st.fields[i].v.FirstName) + ' : 0..'+xp+';');
|
wr.W( GetIdFromPart(st.fields[i].v.FirstName) + ' : 0..'+xp+';');
|
||||||
end else
|
end else
|
||||||
WriteFuncOrVar(st.fields[i].v, False, True);
|
WriteFuncOrVar(st.fields[i].v, False, True);
|
||||||
WriteLnCommentForOffset(st.fields[i].v.Offset);
|
|
||||||
end;
|
end;
|
||||||
wr.DecIdent;
|
wr.DecIdent;
|
||||||
wr.W('end');
|
wr.W('end');
|
||||||
|
Reference in New Issue
Block a user