added checking for token=_ID after _POINT is parsed

This commit is contained in:
peter 2004-11-04 17:57:58 +00:00
parent e32e9da818
commit d804452dcc

View File

@ -1677,81 +1677,92 @@ implementation
do_resulttypepass(p1); do_resulttypepass(p1);
end; end;
case p1.resulttype.def.deftype of case p1.resulttype.def.deftype of
recorddef: recorddef:
begin begin
hsym:=tsym(trecorddef(p1.resulttype.def).symtable.search(pattern)); if token=_ID then
check_hints(hsym); begin
if assigned(hsym) and hsym:=tsym(trecorddef(p1.resulttype.def).symtable.search(pattern));
(hsym.typ=varsym) then
p1:=csubscriptnode.create(hsym,p1)
else
begin
Message1(sym_e_illegal_field,pattern);
p1.destroy;
p1:=cerrornode.create;
end;
consume(_ID);
end;
variantdef:
begin
end;
classrefdef:
begin
classh:=tobjectdef(tclassrefdef(p1.resulttype.def).pointertype.def);
hsym:=searchsym_in_class(classh,pattern);
check_hints(hsym);
if hsym=nil then
begin
Message1(sym_e_id_no_member,pattern);
p1.destroy;
p1:=cerrornode.create;
{ try to clean up }
consume(_ID);
end
else
begin
consume(_ID);
do_member_read(classh,getaddr,hsym,p1,again,[]);
end;
end;
objectdef:
begin
store_static:=allow_only_static;
allow_only_static:=false;
classh:=tobjectdef(p1.resulttype.def);
hsym:=searchsym_in_class(classh,pattern);
check_hints(hsym); check_hints(hsym);
allow_only_static:=store_static; if assigned(hsym) and
if hsym=nil then (hsym.typ=varsym) then
p1:=csubscriptnode.create(hsym,p1)
else
begin begin
Message1(sym_e_illegal_field,pattern);
p1.destroy;
p1:=cerrornode.create;
end;
end;
consume(_ID);
end;
variantdef:
begin
end;
classrefdef:
begin
if token=_ID then
begin
classh:=tobjectdef(tclassrefdef(p1.resulttype.def).pointertype.def);
hsym:=searchsym_in_class(classh,pattern);
check_hints(hsym);
if hsym=nil then
begin
Message1(sym_e_id_no_member,pattern); Message1(sym_e_id_no_member,pattern);
p1.destroy; p1.destroy;
p1:=cerrornode.create; p1:=cerrornode.create;
{ try to clean up } { try to clean up }
consume(_ID); consume(_ID);
end end
else else
begin begin
consume(_ID); consume(_ID);
do_member_read(classh,getaddr,hsym,p1,again,[]); do_member_read(classh,getaddr,hsym,p1,again,[]);
end; end;
end; end
else { Error }
pointerdef: Consume(_ID);
begin end;
Message(parser_e_invalid_qualifier); objectdef:
if tpointerdef(p1.resulttype.def).pointertype.def.deftype in [recorddef,objectdef,classrefdef] then begin
Message(parser_h_maybe_deref_caret_missing); if token=_ID then
end; begin
store_static:=allow_only_static;
else allow_only_static:=false;
begin classh:=tobjectdef(p1.resulttype.def);
Message(parser_e_invalid_qualifier); hsym:=searchsym_in_class(classh,pattern);
p1.destroy; check_hints(hsym);
p1:=cerrornode.create; allow_only_static:=store_static;
consume(_ID); if hsym=nil then
end; begin
Message1(sym_e_id_no_member,pattern);
p1.destroy;
p1:=cerrornode.create;
{ try to clean up }
consume(_ID);
end
else
begin
consume(_ID);
do_member_read(classh,getaddr,hsym,p1,again,[]);
end;
end
else { Error }
Consume(_ID);
end;
pointerdef:
begin
Message(parser_e_invalid_qualifier);
if tpointerdef(p1.resulttype.def).pointertype.def.deftype in [recorddef,objectdef,classrefdef] then
Message(parser_h_maybe_deref_caret_missing);
end;
else
begin
Message(parser_e_invalid_qualifier);
p1.destroy;
p1:=cerrornode.create;
{ Error }
consume(_ID);
end;
end; end;
end; end;
@ -2492,7 +2503,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.169 2004-11-01 15:32:12 peter Revision 1.170 2004-11-04 17:57:58 peter
added checking for token=_ID after _POINT is parsed
Revision 1.169 2004/11/01 15:32:12 peter
* support @labelsym * support @labelsym
Revision 1.168 2004/11/01 10:33:01 peter Revision 1.168 2004/11/01 10:33:01 peter