Browse Source

Merged revisions 768-772 via svnmerge from
/trunk

git-svn-id: branches/fixes_2_0@878 -

peter 20 years ago
parent
commit
df939ca151
2 changed files with 51 additions and 5 deletions
  1. 35 4
      fcl/passrc/pparser.pp
  2. 16 1
      fcl/passrc/pscanner.pp

+ 35 - 4
fcl/passrc/pparser.pp

@@ -19,7 +19,7 @@ unit PParser;
 
 interface
 
-uses SysUtils, PasTree;
+uses SysUtils, PasTree, PScanner;
 
 resourcestring
   SErrNoSourceGiven = 'No source file specified';
@@ -82,7 +82,7 @@ function ParseSource(AEngine: TPasTreeContainer;
 
 implementation
 
-uses Classes, PScanner;
+uses Classes;
 
 type
 
@@ -109,6 +109,7 @@ type
     function CreateElement(AClass: TPTreeElement; const AName: String;
       AParent: TPasElement; AVisibility: TPasMemberVisibility): TPasElement;
   public
+    Options : set of TPOptions;
     constructor Create(AScanner: TPascalScanner; AFileResolver: TFileResolver;
       AEngine: TPasTreeContainer);
     function CurTokenName: String;
@@ -315,9 +316,19 @@ var
   Name, s: String;
   EnumValue: TPasEnumValue;
   Ref: TPasElement;
+  HadPackedModifier : Boolean;           // 12/04/04 - Dave - Added
 begin
   Result := nil;         // !!!: Remove in the future
+  HadPackedModifier := False;     { Assume not present }
   NextToken;
+  if CurToken = tkPacked then     { If PACKED modifier }
+     begin                        { Handle PACKED modifier for all situations }
+     NextToken;                   { Move to next token for rest of parse }
+     if CurToken in [tkArray, tkRecord, tkObject, tkClass] then  { If allowed }
+       HadPackedModifier := True  { rememeber for later }
+     else                         { otherwise, syntax error }
+       ParseExc(Format(SParserExpectTokenError,['ARRAY, RECORD, OBJECT or CLASS']))
+     end;
   case CurToken of
     tkIdentifier:
       begin
@@ -377,6 +388,7 @@ begin
     tkArray:
       begin
         Result := TPasArrayType(CreateElement(TPasArrayType, '', Parent));
+        TPasArrayType(Result).IsPacked := HadPackedModifier;
         ParseArrayType(TPasArrayType(Result));
       end;
     tkBraceOpen:
@@ -418,6 +430,7 @@ begin
     tkRecord:
       begin
         Result := TPasRecordType(CreateElement(TPasRecordType, '', Parent));
+        TPasRecordType(Result).IsPacked := HadPackedModifier;
 	try
           ParseRecordDecl(TPasRecordType(Result), False);
 	except
@@ -1324,7 +1337,13 @@ begin
       begin
         if CurToken = tkBraceOpen then
         begin
-	  ParseArgList(Parent, Element.Args, tkBraceClose);
+          NextToken;
+          if (CurToken = tkBraceClose) then
+          else
+            begin
+              UngetToken;
+              ParseArgList(Parent, Element.Args, tkBraceClose);
+            end;
 	  ExpectToken(tkColon);
 	end else if CurToken <> tkColon then
 	  ParseExc(SParserExpectedLBracketColon);
@@ -1337,7 +1356,13 @@ begin
       begin
         if CurToken = tkBraceOpen then
 	begin
-	  ParseArgList(Element, Element.Args, tkBraceClose);
+          NextToken;
+          if (CurToken = tkBraceClose) then
+          else
+            begin
+              UngetToken;
+              ParseArgList(Element, Element.Args, tkBraceClose);
+            end
 	end else if (CurToken = tkSemicolon) or (OfObjectPossible and (CurToken = tkOf)) then
 	  UngetToken
 	else
@@ -1914,6 +1939,12 @@ var
         'F':
           if s[3] = 'i' then
             FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
+        'S':
+          if s[3]='d' then
+            begin
+              include(Scanner.Options,po_delphi);
+              include(Parser.Options,po_delphi);
+            end;
       end;
     end else
       if Filename <> '' then

+ 16 - 1
fcl/passrc/pscanner.pp

@@ -168,6 +168,8 @@ type
   TPascalScannerPPSkipMode = (ppSkipNone, ppSkipIfBranch, ppSkipElseBranch,
     ppSkipAll);
 
+  TPOptions = (po_delphi);
+
   TPascalScanner = class
   private
     FFileResolver: TFileResolver;
@@ -194,6 +196,7 @@ type
     procedure Error(const Msg: string; Args: array of Const);
     function DoFetchToken: TToken;
   public
+    Options : set of TPOptions;
     constructor Create(AFileResolver: TFileResolver);
     destructor Destroy; override;
     procedure OpenFile(const AFilename: string);
@@ -558,6 +561,18 @@ begin
           Move(TokenStart^, FCurTokenString[1], SectionLength);
         Result := tkChar;
       end;
+    '&':
+      begin
+        TokenStart := TokenStr;
+        repeat
+          Inc(TokenStr);
+        until not (TokenStr[0] in ['0'..'7']);
+        SectionLength := TokenStr - TokenStart;
+        SetLength(FCurTokenString, SectionLength);
+        if SectionLength > 0 then
+          Move(TokenStart^, FCurTokenString[1], SectionLength);
+        Result := tkNumber;
+      end;
     '$':
       begin
         TokenStart := TokenStr;
@@ -831,7 +846,7 @@ begin
             TokenStart := TokenStr;
           end else
           begin
-            if TokenStr[0] = '{' then
+            if not(po_delphi in Options) and (TokenStr[0] = '{') then
               Inc(NestingLevel)
             else if TokenStr[0] = '}' then
               Dec(NestingLevel);