Browse Source

+ auto dereferencing of pointers to structured types in delphi mode

florian 27 years ago
parent
commit
8cc7f2636e
1 changed files with 84 additions and 59 deletions
  1. 84 59
      compiler/pexpr.pas

+ 84 - 59
compiler/pexpr.pas

@@ -1091,16 +1091,21 @@ unit pexpr;
                 { try to recover }
                 repeat
                   case token of
-                   CARET : consume(CARET);
-                   POINT : begin
-                             consume(POINT);
-                             consume(ID);
-                           end;
-             LECKKLAMMER : begin
-                             repeat
-                               consume(token);
-                             until token in [RECKKLAMMER,SEMICOLON];
-                           end;
+                   CARET:
+                     consume(CARET);
+
+                   POINT:
+                     begin
+                        consume(POINT);
+                        consume(ID);
+                     end;
+
+                   LECKKLAMMER:
+                     begin
+                        repeat
+                          consume(token);
+                          until token in [RECKKLAMMER,SEMICOLON];
+                     end;
                   else
                     break;
                   end;
@@ -1109,7 +1114,8 @@ unit pexpr;
               end;
            { handle token }
              case token of
-          CARET : begin
+                CARET:
+                  begin
                     consume(CARET);
                     if pd^.deftype<>pointerdef then
                       begin
@@ -1125,7 +1131,9 @@ unit pexpr;
                          pd:=ppointerdef(pd)^.definition;
                       end;
                   end;
-    LECKKLAMMER : begin
+
+                LECKKLAMMER:
+                  begin
                     if (pd^.deftype=objectdef) and pobjectdef(pd)^.isclass then
                       begin
                         { default property }
@@ -1148,11 +1156,13 @@ unit pexpr;
                         consume(LECKKLAMMER);
                         repeat
                           case pd^.deftype of
-                    pointerdef : begin
+                            pointerdef:
+                                begin
                                    p2:=comp_expr(true);
                                    p1:=gennode(vecn,p1,p2);
                                    pd:=ppointerdef(pd)^.definition;
                                  end;
+
                      stringdef : begin
                                    p2:=comp_expr(true);
                                    p1:=gennode(vecn,p1,p2);
@@ -1210,55 +1220,67 @@ unit pexpr;
                   end;
           POINT : begin
                     consume(POINT);
+                    if (pd^.deftype=pointerdef) and
+                      (m_autoderef in aktmodeswitches) then
+                      begin
+                         p1:=gensinglenode(derefn,p1);
+                         pd:=ppointerdef(pd)^.definition;
+                      end;
                     case pd^.deftype of
-                  recorddef : begin
-                                sym:=pvarsym(precdef(pd)^.symtable^.search(pattern));
-                                consume(ID);
-                                if sym=nil then
-                                  begin
-                                    Message(sym_e_illegal_field);
-                                    disposetree(p1);
-                                    p1:=genzeronode(errorn);
-                                  end
-                                else
-                                  begin
-                                    p1:=gensubscriptnode(sym,p1);
-                                    pd:=sym^.definition;
-                                  end;
-                              end;
-                classrefdef : begin
-                                classh:=pobjectdef(pclassrefdef(pd)^.definition);
-                                sym:=nil;
-                                while assigned(classh) do
-                                 begin
-                                   sym:=pvarsym(classh^.publicsyms^.search(pattern));
-                                   srsymtable:=classh^.publicsyms;
-                                   if assigned(sym) then
-                                    break;
-                                   classh:=classh^.childof;
-                                 end;
-                                consume(ID);
-                                do_member_read(false,sym,p1,pd,again);
+                       recorddef:
+                         begin
+                            sym:=pvarsym(precdef(pd)^.symtable^.search(pattern));
+                            consume(ID);
+                            if sym=nil then
+                              begin
+                                Message(sym_e_illegal_field);
+                                disposetree(p1);
+                                p1:=genzeronode(errorn);
+                              end
+                            else
+                              begin
+                                p1:=gensubscriptnode(sym,p1);
+                                pd:=sym^.definition;
                               end;
-                  objectdef : begin
-                                classh:=pobjectdef(pd);
-                                sym:=nil;
-                                while assigned(classh) do
-                                 begin
-                                   sym:=pvarsym(classh^.publicsyms^.search(pattern));
-                                   srsymtable:=classh^.publicsyms;
-                                   if assigned(sym) then
-                                    break;
-                                   classh:=classh^.childof;
-                                 end;
-                                consume(ID);
-                                do_member_read(false,sym,p1,pd,again);
+                          end;
+
+                        classrefdef:
+                          begin
+                             classh:=pobjectdef(pclassrefdef(pd)^.definition);
+                             sym:=nil;
+                             while assigned(classh) do
+                              begin
+                                sym:=pvarsym(classh^.publicsyms^.search(pattern));
+                                srsymtable:=classh^.publicsyms;
+                                if assigned(sym) then
+                                 break;
+                                classh:=classh^.childof;
                               end;
-                 pointerdef : begin
-                                Message(cg_e_invalid_qualifier);
-                                if ppointerdef(pd)^.definition^.deftype in [recorddef,objectdef,classrefdef] then
-                                 Message(parser_h_maybe_deref_caret_missing);
+                             consume(ID);
+                             do_member_read(false,sym,p1,pd,again);
+                           end;
+
+                         objectdef:
+                           begin
+                             classh:=pobjectdef(pd);
+                             sym:=nil;
+                             while assigned(classh) do
+                              begin
+                                sym:=pvarsym(classh^.publicsyms^.search(pattern));
+                                srsymtable:=classh^.publicsyms;
+                                if assigned(sym) then
+                                 break;
+                                classh:=classh^.childof;
                               end;
+                             consume(ID);
+                             do_member_read(false,sym,p1,pd,again);
+                           end;
+                         pointerdef:
+                           begin
+                             Message(cg_e_invalid_qualifier);
+                             if ppointerdef(pd)^.definition^.deftype in [recorddef,objectdef,classrefdef] then
+                              Message(parser_h_maybe_deref_caret_missing);
+                           end;
                     else
                       begin
                         Message(cg_e_invalid_qualifier);
@@ -1843,7 +1865,10 @@ unit pexpr;
 end.
 {
   $Log$
-  Revision 1.62  1998-10-12 10:05:41  peter
+  Revision 1.63  1998-10-12 10:28:30  florian
+    + auto dereferencing of pointers to structured types in delphi mode
+
+  Revision 1.62  1998/10/12 10:05:41  peter
     * fixed mem leak with arrayconstrutor
 
   Revision 1.61  1998/10/05 13:57:15  peter