Browse Source

fcl-passrc: scanner: implemented macros directive

git-svn-id: trunk@36131 -
Mattias Gaertner 8 years ago
parent
commit
d493980bb2
2 changed files with 32 additions and 8 deletions
  1. 28 8
      packages/fcl-passrc/src/pscanner.pp
  2. 4 0
      packages/fcl-passrc/tests/tcscanner.pas

+ 28 - 8
packages/fcl-passrc/src/pscanner.pp

@@ -42,6 +42,7 @@ const
   nErrInvalidMode = 1015;
   nErrInvalidModeSwitch = 1016;
   nUserDefined = 1017;
+  nErrXExpectedButYFound = 1018;
 
 // resourcestring patterns of messages
 resourcestring
@@ -62,6 +63,7 @@ resourcestring
   SErrInvalidMode = 'Invalid mode: "%s"';
   SErrInvalidModeSwitch = 'Invalid mode switch: "%s"';
   SErrUserDefined = 'User defined error: "%s"';
+  SErrXExpectedButYFound = '"%s" expected, but "%s" found';
 
 type
   TMessageType = (
@@ -425,6 +427,7 @@ type
     FCurLine: string;
     FMacros,
     FDefines: TStrings;
+    FMacrosOn: boolean;
     FOptions: TPOptions;
     FLogEvents: TPScannerLogEvents;
     FOnLog: TPScannerLogHandler;
@@ -464,6 +467,7 @@ type
     procedure HandleIncludeFile(Param: String); virtual;
     procedure HandleUnDefine(Param: String);virtual;
     function HandleInclude(const Param: String): TToken;virtual;
+    procedure HandleMacroDirective(const Param: String);virtual;
     procedure HandleMode(const Param: String);virtual;
     procedure HandleModeSwitch(const Param: String);virtual;
     function HandleMacro(AIndex: integer): TToken;virtual;
@@ -505,9 +509,10 @@ type
 
     property Defines: TStrings read FDefines;
     property Macros: TStrings read FMacros;
-    Property Options : TPOptions Read FOptions Write SetOptions;
-    Property LogEvents : TPScannerLogEvents Read FLogEvents Write FLogEvents;
-    Property OnLog : TPScannerLogHandler Read FOnLog Write FOnLog;
+    property Options : TPOptions Read FOptions Write SetOptions;
+    property LogEvents : TPScannerLogEvents Read FLogEvents Write FLogEvents;
+    property OnLog : TPScannerLogHandler Read FOnLog Write FOnLog;
+    property MacrosOn: boolean read FMacrosOn write FMacrosOn;
 
     property LastMsg: string read FLastMsg write FLastMsg;
     property LastMsgNumber: integer read FLastMsgNumber write FLastMsgNumber;
@@ -1620,6 +1625,16 @@ begin
     end
 end;
 
+procedure TPascalScanner.HandleMacroDirective(const Param: String);
+begin
+  if CompareText(Param,'on')=0 then
+    MacrosOn:=true
+  else if CompareText(Param,'off')=0 then
+    MacrosOn:=false
+  else
+    Error(nErrXExpectedButYFound,SErrXExpectedButYFound,['on',Param]);
+end;
+
 procedure TPascalScanner.HandleMode(const Param: String);
 
   procedure SetMode(const NeededModes, NewModeSwitches: TModeSwitches;
@@ -1830,6 +1845,9 @@ begin
   'INCLUDE':
     if not PPIsSkipping then
       Result:=HandleInclude(Param);
+  'MACRO':
+    if not PPIsSkipping then
+      HandleMacroDirective(Param);
   'MODE':
      if not PPIsSkipping then
       HandleMode(Param);
@@ -2279,11 +2297,13 @@ begin
             FCurToken := Result;
             exit;
           end;
-        Index:=FMacros.IndexOf(CurtokenString);
-        if (Index=-1) then
-          Result := tkIdentifier
-        else
-          Result:=HandleMacro(index);
+        Result := tkIdentifier;
+        if MacrosOn then
+          begin
+          Index:=FMacros.IndexOf(CurtokenString);
+          if Index>=0 then
+            Result:=HandleMacro(Index);
+          end;
       end;
   else
     if PPIsSkipping then

+ 4 - 0
packages/fcl-passrc/tests/tcscanner.pas

@@ -1511,6 +1511,7 @@ procedure TTestScanner.TestMacro1;
 begin
   FScanner.SkipWhiteSpace:=True;
   FScanner.SkipComments:=True;
+  FScanner.MacrosOn:=true;
   TestTokens([tkbegin,tkend,tkDot],'{$DEFINE MM:=begin end.}'#13#10'MM',True,False);
 end;
 
@@ -1518,6 +1519,7 @@ procedure TTestScanner.TestMacro2;
 begin
   FScanner.SkipWhiteSpace:=True;
   FScanner.SkipComments:=True;
+  FScanner.MacrosOn:=true;
   TestTokens([tkbegin,tkend,tkDot],'{$DEFINE MM:=begin end}'#13#10'MM .',True,False);
 end;
 
@@ -1525,6 +1527,7 @@ procedure TTestScanner.TestMacro3;
 begin
   FScanner.SkipComments:=True;
   FScanner.SkipWhiteSpace:=True;
+  FScanner.MacrosOn:=true;
   TestTokens([tkof],'{$DEFINE MM:=begin end}'#13#10'{$IFDEF MM} of {$ELSE} in {$ENDIF}');
 end;
 
@@ -1533,6 +1536,7 @@ begin
   TTestingPascalScanner(FScanner).DoSpecial:=True;
   FScanner.SkipComments:=True;
   FScanner.SkipWhiteSpace:=True;
+  FScanner.MacrosOn:=true;
   TestTokens([tkIdentifier],'{$DEFINE MM:=begin end}'#13#10'MM');
   AssertEQuals('Correct identifier', 'somethingweird',LastIdentifier);
 end;