فهرست منبع

xpath.pp: replaced TXPathScanner.SaveState/RestoreState by PeekToken().

git-svn-id: trunk@13120 -
sergei 16 سال پیش
والد
کامیت
f3e64cf8ce
1فایلهای تغییر یافته به همراه21 افزوده شده و 36 حذف شده
  1. 21 36
      packages/fcl-xml/src/xpath.pp

+ 21 - 36
packages/fcl-xml/src/xpath.pp

@@ -343,13 +343,6 @@ type
 
 { XPath lexical scanner }
 
-  TXPathScannerState = class
-  private
-    FCurData: DOMPChar;
-    FCurToken: TXPathToken;
-    FCurTokenString: DOMString;
-  end;
-
   TXPathScanner = class
   private
     FExpressionString, FCurData: DOMPChar;
@@ -370,11 +363,11 @@ type
     function ParseAdditiveExpr: TXPathExprNode;    // [25]
     function ParseMultiplicativeExpr: TXPathExprNode;  // [26]
     function ParseUnaryExpr: TXPathExprNode;   // [27]
+    function GetToken: TXPathToken;
   public
     constructor Create(const AExpressionString: DOMString);
     function NextToken: TXPathToken;
-    function SaveState: TXPathScannerState;
-    procedure RestoreState(AState: TXPathScannerState);
+    function PeekToken: TXPathToken;
     property CurToken: TXPathToken read FCurToken;
     property CurTokenString: DOMString read FCurTokenString;
   end;
@@ -1537,7 +1530,24 @@ begin
   NextToken;
 end;
 
+function TXPathScanner.PeekToken: TXPathToken;
+var
+  save: DOMPChar;
+begin
+  save := FCurData;
+  Result := GetToken;
+  FCurData := save;
+end;
+
 function TXPathScanner.NextToken: TXPathToken;
+begin
+  Result := GetToken;
+  FCurToken := Result;
+  if Result in [tkIdentifier, tkNumber, tkString] then
+    SetString(FCurTokenString, FTokenStart, FTokenLength);
+end;
+
+function TXPathScanner.GetToken: TXPathToken;
 
   procedure GetNumber(HasDot: Boolean);
   begin
@@ -1690,26 +1700,6 @@ begin
   // We have processed at least one character now; eat it:
   if Result <> tkEndOfStream then
     Inc(FCurData);
-
-  FCurToken := Result;
-  if Result in [tkIdentifier, tkNumber, tkString] then
-    SetString(FCurTokenString, FTokenStart, FTokenLength);
-end;
-
-function TXPathScanner.SaveState: TXPathScannerState;
-begin
-  Result := TXPathScannerState.Create;
-  Result.FCurData := FCurData;
-  Result.FCurToken := FCurToken;
-  Result.FCurTokenString := FCurTokenString;
-end;
-
-procedure TXPathScanner.RestoreState(AState: TXPathScannerState);
-begin
-  FCurData := AState.FCurData;
-  FCurToken := AState.FCurToken;
-  FCurTokenString := AState.FCurTokenString;
-  AState.Free;
 end;
 
 procedure TXPathScanner.Error(const Msg: String);
@@ -1932,7 +1922,6 @@ end;
 
 function TXPathScanner.ParsePathExpr: TXPathExprNode;  // [19]
 var
-  ScannerState: TXPathScannerState;
   IsFunctionCall: Boolean;
   CurStep, NextStep: TStep;
 begin
@@ -1942,13 +1931,9 @@ begin
     (CurTokenString <> 'comment') and
     (CurTokenString <> 'text') and
     (CurTokenString <> 'processing-instruction') and
-    (CurTokenString <> 'node') then
-  begin
-    ScannerState := SaveState;
-    if NextToken = tkLeftBracket then
+    (CurTokenString <> 'node') and
+    (PeekToken = tkLeftBracket) then
       IsFunctionCall := True;
-    RestoreState(ScannerState);
-  end;
 
   Result := nil;
   CurStep := nil;