Browse Source

* Support for C-style assignments (bug 22007)

git-svn-id: trunk@22136 -
michael 13 years ago
parent
commit
c9e622b5a8
2 changed files with 76 additions and 9 deletions
  1. 27 2
      packages/fcl-passrc/src/pparser.pp
  2. 49 7
      packages/fcl-passrc/src/pscanner.pp

+ 27 - 2
packages/fcl-passrc/src/pparser.pp

@@ -245,6 +245,7 @@ function ParseSource(AEngine: TPasTreeContainer;
 Function IsHintToken(T : String; Out AHint : TPasMemberHint) : boolean;
 Function IsModifier(S : String; Out Pm : TProcedureModifier) : Boolean;
 Function IsCallingConvention(S : String; out CC : TCallingConvention) : Boolean;
+Function TokenToAssignKind( tk : TToken) : TAssignKind;
 
 implementation
 
@@ -327,6 +328,20 @@ begin
     end;
 end;
 
+Function TokenToAssignKind( tk : TToken) : TAssignKind;
+
+begin
+  case tk of
+    tkAssign         : Result:=akDefault;
+    tkAssignPlus     : Result:=akAdd;
+    tkAssignMinus    : Result:=akMinus;
+    tkAssignMul      : Result:=akMul;
+    tkAssignDivision : Result:=akDivision;
+  else
+    Raise Exception.CreateFmt('Not an assignment token : %s',[TokenInfos[tk]]);
+  end;
+end;
+
 function ParseSource(AEngine: TPasTreeContainer;
   const FPCCommandLine, OSTarget, CPUTarget: String;
   UseStreams  : Boolean = False): TPasModule;
@@ -353,6 +368,10 @@ var
       case s[2] of
         'd': // -d define
           Scanner.AddDefine(UpperCase(Copy(s, 3, Length(s))));
+        'S': // -d define
+          case S[3] of
+            'c' :Scanner.Options:=Scanner.Options+[c_assignments];
+          end;
         'F': // -F
           if (length(s)>2) and (s[3] = 'i') then // -Fi include path
             FileResolver.AddIncludePath(Copy(s, 4, Length(s)));
@@ -2974,7 +2993,7 @@ var
   left: TPasExpr;
   right: TPasExpr;
   el : TPasImplElement;
-
+  ak : TAssignKind;
 begin
   NewImplElement:=nil;
   CurBlock := Parent;
@@ -3305,14 +3324,20 @@ begin
     else
       left:=DoParseExpression(nil);
       case CurToken of
-        tkAssign:
+        tkAssign,
+        tkAssignPlus,
+        tkAssignMinus,
+        tkAssignMul,
+        tkAssignDivision:
         begin
           // assign statement
+          Ak:=TokenToAssignKind(CurToken);
           NextToken;
           right:=DoParseExpression(nil); // this may solve TPasImplWhileDo.AddElement BUG
           el:=TPasImplAssign(CreateElement(TPasImplAssign,'',CurBlock));
           TPasImplAssign(el).left:=Left;
           TPasImplAssign(el).right:=Right;
+          TPasImplAssign(el).Kind:=ak;
           CurBlock.AddElement(el);
           CmdElem:=TPasImplAssign(el);
           UngetToken;

+ 49 - 7
packages/fcl-passrc/src/pscanner.pp

@@ -76,6 +76,10 @@ type
     tkGreaterEqualThan,      // '>='
     tkPower,                 // '**'
     tkSymmetricalDifference, // '><'
+    tkAssignPlus,            // +=
+    tkAssignMinus,           // -=
+    tkAssignMul,             // *=
+    tkAssignDivision,        // /=
     // Reserved words
     tkabsolute,
     tkand,
@@ -288,7 +292,7 @@ type
 
   TPascalScannerPPSkipMode = (ppSkipNone, ppSkipIfBranch, ppSkipElseBranch, ppSkipAll);
 
-  TPOption = (po_delphi);
+  TPOption = (po_delphi,po_cassignments);
   TPOptions = set of TPOption;
 
   { TPascalScanner }
@@ -402,6 +406,10 @@ const
     '>=',
     '**',
     '><',
+    '+=',
+    '-=',
+    '*=',
+    '/=',
     // Reserved words
     'absolute',
     'and',
@@ -1368,13 +1376,30 @@ begin
         begin
           Inc(TokenStr);
           Result := tkPower;
-        end else
-          Result := tkMul;
+        end else if not (po_cassignments in options) then
+          Result := tkMul
+        else
+          begin
+          if TokenStr[0]='=' then
+            begin
+            Inc(TokenStr);
+            Result:=tkAssignMul;
+            end;
+          end
       end;
     '+':
       begin
         Inc(TokenStr);
-        Result := tkPlus;
+        if not (po_cassignments in options) then
+          Result := tkPlus
+        else
+          begin
+          if TokenStr[0]='=' then
+            begin
+            Inc(TokenStr);
+            Result:=tkAssignPlus;
+            end;
+          end
       end;
     ',':
       begin
@@ -1384,7 +1409,16 @@ begin
     '-':
       begin
         Inc(TokenStr);
-        Result := tkMinus;
+        if not (po_cassignments in options) then
+          Result := tkMinus
+        else
+          begin
+          if TokenStr[0]='=' then
+            begin
+            Inc(TokenStr);
+            Result:=tkAssignMinus;
+            end;
+          end
       end;
     '.':
       begin
@@ -1412,8 +1446,16 @@ begin
             Move(TokenStart^, FCurTokenString[1], SectionLength);
           Result := tkComment;
           //WriteLn('Einzeiliger Kommentar: "', CurTokenString, '"');
-        end else
-          Result := tkDivision;
+        end else if not (po_cassignments in options) then
+          Result := tkDivision
+        else
+          begin
+          if TokenStr[0]='=' then
+            begin
+            Inc(TokenStr);
+            Result:=tkAssignDivision;
+            end;
+          end
       end;
     '0'..'9':
       begin