Browse Source

* Better operator as identifier mechanism

git-svn-id: trunk@36702 -
michael 8 years ago
parent
commit
cf1bd813a8
2 changed files with 59 additions and 15 deletions
  1. 7 5
      packages/fcl-passrc/src/pparser.pp
  2. 52 10
      packages/fcl-passrc/src/pscanner.pp

+ 7 - 5
packages/fcl-passrc/src/pparser.pp

@@ -904,7 +904,7 @@ begin
     begin
     // Get token from buffer
     //writeln('TPasParser.NextToken REUSE Start=',FTokenRingStart,' Cur=',FTokenRingCur,' End=',FTokenRingEnd,' Cur=',CurTokenString);
-    FCurToken := P^.Token;
+    FCurToken := Scanner.CheckToken(P^.Token,P^.AsString);
     FCurTokenString := P^.AsString;
     end
   else
@@ -2893,6 +2893,10 @@ begin
   CurBlock := declNone;
   while True do
   begin
+    if CurBlock=DeclNone then
+      Scanner.SetTokenOption(toOperatorToken)
+    else
+      Scanner.UnSetTokenOption(toOperatorToken);
     NextToken;
   //  writeln('TPasParser.ParseSection Token=',CurTokenString,' ',CurToken, ' ',scanner.CurFilename);
     case CurToken of
@@ -2974,7 +2978,6 @@ begin
         end;
       tkIdentifier:
         begin
-          Scanner.PushNonToken(tkOperator);
           SaveComments;
           case CurBlock of
             declConst:
@@ -3072,7 +3075,6 @@ begin
           else
             ParseExcSyntaxError;
           end;
-        Scanner.PopNonToken(tkOperator);
         end;
       tkGeneric:
         begin
@@ -5454,7 +5456,7 @@ begin
         if isClass then
           ParseExc(nParserTypeSyntaxError,SParserTypeSyntaxError);
         isClass:=True;
-        Scanner.PopNonToken(tkOperator);
+        Scanner.SetTokenOption(toOperatorToken);
         end;
       tkProperty:
         begin
@@ -5522,7 +5524,7 @@ begin
     If CurToken<>tkClass then
       begin
       isClass:=False;
-      Scanner.PushNonToken(tkOperator);
+      Scanner.UnSetTokenOption(toOperatorToken);
       end;
     if CurToken<>AEndToken then
       NextToken;

+ 52 - 10
packages/fcl-passrc/src/pscanner.pp

@@ -265,7 +265,7 @@ type
   );
   TModeSwitches = Set of TModeSwitch;
 
-  TTokenOption = (toForceCaret,toOperatorIdentifier);
+  TTokenOption = (toForceCaret,toOperatorToken);
   TTokenOptions = Set of TTokenOption;
 
 
@@ -508,7 +508,6 @@ type
     FAllowedModeSwitches: TModeSwitches;
     FConditionEval: TCondDirectiveEvaluator;
     FCurrentModeSwitches: TModeSwitches;
-    FForceCaret: Boolean;
     FLastMsg: string;
     FLastMsgArgs: TMessageArgs;
     FLastMsgNumber: integer;
@@ -535,6 +534,7 @@ type
     FReadOnlyModeSwitches: TModeSwitches;
     FSkipComments: Boolean;
     FSkipWhiteSpace: Boolean;
+    FTokenOptions: TTokenOptions;
     TokenStr: PChar;
     FIncludeStack: TFPList;
 
@@ -545,6 +545,7 @@ type
     PPSkipModeStack: array[0..255] of TPascalScannerPPSkipMode;
     PPIsSkippingStack: array[0..255] of Boolean;
     function GetCurColumn: Integer;
+    function GetForceCaret: Boolean;
     function OnCondEvalFunction(Sender: TCondDirectiveEvaluator; Name,
       Param: String; out Value: string): boolean;
     procedure OnCondEvalLog(Sender: TCondDirectiveEvaluator;
@@ -593,8 +594,11 @@ type
     constructor Create(AFileResolver: TBaseFileResolver);
     destructor Destroy; override;
     procedure OpenFile(const AFilename: string);
-    Procedure PushNonToken(aToken : TToken);
-    Procedure PopNonToken(aToken : TToken);
+    Procedure SetNonToken(aToken : TToken);
+    Procedure UnsetNonToken(aToken : TToken);
+    Procedure SetTokenOption(aOption : TTokenoption);
+    Procedure UnSetTokenOption(aOption : TTokenoption);
+    Function CheckToken(aToken : TToken; const ATokenString : String) : TToken;
     function FetchToken: TToken;
     function ReadNonPascalTillEndToken(StopAtLineEnd: boolean): TToken;
     function AddDefine(const aName: String; Quiet: boolean = false): boolean;
@@ -620,6 +624,7 @@ type
     property CurTokenString: string read FCurTokenString;
     Property PreviousToken : TToken Read FPreviousToken;
     Property NonTokens : TTokens Read FNonTokens;
+    Property TokenOptions : TTokenOptions Read FTokenOptions Write FTokenOptions;
     property Defines: TStrings read FDefines;
     property Macros: TStrings read FMacros;
     property MacrosOn: boolean read FMacrosOn write FMacrosOn;
@@ -628,7 +633,7 @@ type
     property ReadOnlyModeSwitches: TModeSwitches Read FReadOnlyModeSwitches Write SetReadOnlyModeSwitches;// always set, cannot be disabled
     property CurrentModeSwitches: TModeSwitches Read FCurrentModeSwitches Write SetCurrentModeSwitches;
     property Options : TPOptions Read FOptions Write SetOptions;
-    property ForceCaret : Boolean Read FForceCaret;
+    property ForceCaret : Boolean Read GetForceCaret;
     property LogEvents : TPScannerLogEvents Read FLogEvents Write FLogEvents;
     property OnLog : TPScannerLogHandler Read FOnLog Write FOnLog;
     property ConditionEval: TCondDirectiveEvaluator read FConditionEval;
@@ -2218,14 +2223,32 @@ begin
   FileResolver.BaseDirectory := IncludeTrailingPathDelimiter(ExtractFilePath(AFilename));
 end;
 
-procedure TPascalScanner.PushNonToken(aToken: TToken);
+procedure TPascalScanner.SetNonToken(aToken: TToken);
 begin
-  Include(FNonTokens,AToken);
+  Include(FNonTokens,aToken);
 end;
 
-procedure TPascalScanner.PopNonToken(aToken: TToken);
+procedure TPascalScanner.UnsetNonToken(aToken: TToken);
 begin
-  Exclude(FNonTokens,AToken);
+  Exclude(FNonTokens,aToken);
+end;
+
+procedure TPascalScanner.SetTokenOption(aOption: TTokenoption);
+begin
+  Include(FTokenOptions,aOption);
+end;
+
+procedure TPascalScanner.UnSetTokenOption(aOption: TTokenoption);
+begin
+  Exclude(FTokenOptions,aOption);
+end;
+
+function TPascalScanner.CheckToken(aToken: TToken; const ATokenString: String): TToken;
+begin
+  Result:=atoken;
+  if (aToken=tkIdentifier) and (CompareText(aTokenString,'operator')=0) then
+    if (toOperatorToken in TokenOptions) then
+      Result:=tkoperator;
 end;
 
 function TPascalScanner.FetchToken: TToken;
@@ -2275,6 +2298,17 @@ begin
       if not (FSkipComments or PPIsSkipping) then
         Break;
       end;
+    tkOperator:
+      begin
+      if Not (toOperatorToken in FTokenOptions) then
+        begin
+        FCurToken:=tkIdentifier;
+        Result:=FCurToken;
+        end;
+      if not (FSkipComments or PPIsSkipping) then
+        Break;
+      end;
+
     else
       if not PPIsSkipping then
         break;
@@ -3353,6 +3387,11 @@ begin
     Result := 1;
 end;
 
+function TPascalScanner.GetForceCaret: Boolean;
+begin
+  Result:=toForceCaret in FTokenOptions;
+end;
+
 function TPascalScanner.OnCondEvalFunction(Sender: TCondDirectiveEvaluator;
   Name, Param: String; out Value: string): boolean;
 begin
@@ -3661,7 +3700,10 @@ end;
 function TPascalScanner.SetForceCaret(AValue: Boolean): Boolean;
 
 begin
-  FForceCaret:=AValue;
+  if aValue then
+    Include(FTokenOptions,toForceCaret)
+  else
+    Exclude(FTokenOptions,toForceCaret)
 end;