⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxjs_scanner.old

📁 Well known and usefull component for delphi 7
💻 OLD
📖 第 1 页 / 共 2 页
字号:
         end;

         Exit;
      end
      else if c='|' then begin
         Token.ID:=OP_BITWISE_OR;
         Token.AClass:=classOPER;
         Token.Text:=c;

         if LA (1) ='=' then begin
            c:=GetNextChar;
            Token.ID:=OP_ASSIGN_BITWISE_OR;
            Token.AClass:=classOPER;
            Token.Text:=Token.Text+c;
         end
         else if LA (1) ='|' then begin
            c:=GetNextChar;
            Token.ID:=OP_LOGICAL_OR;
            Token.AClass:=classOPER;
            Token.Text:=Token.Text+c;
         end;

         Exit;
      end
      else if c='(' then begin
         Token.ID:=SP_ROUND_BRACKET_L;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c=')' then begin
         Token.ID:=SP_ROUND_BRACKET_R;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c='[' then begin
         Token.ID:=SP_BRACKET_L;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c=']' then begin
         Token.ID:=SP_BRACKET_R;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c='{' then begin
         Token.ID:=SP_BRACE_L;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c='}' then begin
         Token.ID:=SP_BRACE_R;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c='.' then begin
         if (LA (1) in ['0'..'9']) then begin
            S:='0'+DecimalSeparator;
            goto Number;
         end;

         Token.ID:=SP_POINT;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c=';' then begin
         Token.ID:=SP_SEMICOLON;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c=':' then begin
         Token.ID:=SP_COLON;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c=',' then begin
         Token.ID:=SP_COMMA;
         Token.AClass:=classSPECIAL;
         Token.Text:=c;
         Exit;
      end
      else if c='!' then begin
         Token.ID:=OP_LOGICAL_NOT;
         Token.AClass:=classOPER;
         Token.Text:=c;

         if LA (1) ='=' then begin
            c:=GetNextChar;
            Token.ID:=OP_NE;
            Token.AClass:=classOPER;
            Token.Text:=Token.Text+c;

            if LA (1) ='=' then begin
               c:=GetNextChar;
               Token.ID:=OP_NI;
               Token.AClass:=classOPER;
               Token.Text:=Token.Text+c;
            end;
         end;

         Exit;
      end
      else if c='=' then begin
         Token.ID:=OP_ASSIGN;
         Token.AClass:=classOPER;
         Token.Text:=c;

         if LA (1) ='=' then begin
            c:=GetNextChar;
            Token.ID:=OP_EQ;
            Token.AClass:=classOPER;
            Token.Text:=Token.Text+c;

            if LA (1) ='=' then begin
               c:=GetNextChar;
               Token.ID:=OP_ID;
               Token.AClass:=classOPER;
               Token.Text:=Token.Text+c;
            end;
         end;

         Exit;
      end
      else if IsApostrophe (c) then begin
         S:='';
         repeat
            c:=GetNextChar;

            if c='\' then
               case LA (1) of
                  'b':begin
                        GetNextChar;
                        S:=S+#$08;
                     end;
                  't':begin
                        GetNextChar;
                        S:=S+#$09;
                     end;
                  'n':begin
                        GetNextChar;
                        S:=S+#$0A;
                     end;
                  'v':begin
                        GetNextChar;
                        S:=S+#$0B;
                     end;
                  'f':begin
                        GetNextChar;
                        S:=S+#$0C;
                     end;
                  'r':begin
                        GetNextChar;
                        S:=S+#$0D;
                     end;
                  '"':begin
                        GetNextChar;
                        S:=S+#$22;
                     end;
                  '''':begin
                        GetNextChar;
                        S:=S+#$27;
                     end;
                  '\':begin
                        GetNextChar;
                        S:=S+#$5C;
                     end;
               else
                  S:=S+c+GetNextChar;
               end
            else
               if not IsApostrophe (c) then
               S:=S+c;

            if c=#13 then
               raise TScriptFailure.Create (peSyntaxError) ;
         until IsApostrophe (c) ;

         Token.AClass:=classCONST;
         Token.Text:=S;
         Token.ID:=TJScript (JScript) .SymbolTable.CodeStringConst (S) ;
         Exit;
      end
      else if IsDoubleApostrophe (c) then begin
         S:='';
         repeat
            c:=GetNextChar;

            if c='\' then
               case LA (1) of
                  'b':begin
                        GetNextChar;
                        S:=S+#$08;
                     end;
                  't':begin
                        GetNextChar;
                        S:=S+#$09;
                     end;
                  'n':begin
                        GetNextChar;
                        S:=S+#$0A;
                     end;
                  'v':begin
                        GetNextChar;
                        S:=S+#$0B;
                     end;
                  'f':begin
                        GetNextChar;
                        S:=S+#$0C;
                     end;
                  'r':begin
                        GetNextChar;
                        S:=S+#$0D;
                     end;
                  '"':begin
                        GetNextChar;
                        S:=S+#$22;
                     end;
                  '''':begin
                        GetNextChar;
                        S:=S+#$27;
                     end;
                  '\':begin
                        GetNextChar;
                        S:=S+#$5C;
                     end;
               else
                  S:=S+c+GetNextChar;
               end
            else
               if not IsDoubleApostrophe (c) then
               S:=S+c;

            if c=#13 then
               raise TScriptFailure.Create (peSyntaxError) ;
         until IsDoubleApostrophe (c) ;

         Token.AClass:=classCONST;
         Token.Text:=S;
         Token.ID:=TJScript (JScript) .SymbolTable.CodeStringConst (S) ;
         Exit;
      end
      else if IsDigit (c) then begin
         S:=c;

         if (c='0') and (LA (1) in ['x','X']) then begin
            S:=S+GetNextChar;
            while IsHexDigit (LA (1) ) do
               S:=S+GetNextChar;
            Token.AClass:=classCONST;
            Token.Text:=S;
            Token.ID:=TJScript (JScript) .SymbolTable.CodeNumberConst (S) ;
            Exit;
         end;

         if (c='0') and (LA (1) in ['b','B']) then begin
            S:=S+GetNextChar;
            while LA (1) in ['0'..'1'] do
               S:=S+GetNextChar;
            Token.AClass:=classCONST;
            Token.Text:=S;
            Token.ID:=TJScript (JScript) .SymbolTable.CodeNumberConst (S) ;
            Exit;
         end;

         Number:

         Token.AClass:=classCONST;
         while IsDigit (LA (1) ) do
            S:=S+GetNextChar;

         if LA (1) in ['b','B','d','D','h','H'] then
            S:=S+DXString.UpperCase (GetNextChar)
         else if IsHexDigit (LA (1) ) then begin
            S:=S+GetNextChar;
            while IsHexDigit (LA (1) ) do
               S:=S+GetNextChar;
            c:=GetNextChar;
            if not (c in ['h','H']) then
               raise TScriptFailure.Create (peSyntaxError)
            else
               S:=S+'H';
         end
         else begin
            if LA (1) ='.' then begin
               GetNextChar;
               S:=S+DecimalSeparator;

               while IsDigit (LA (1) ) do
                  S:=S+GetNextChar;
            end;

            if (UpCase (LA (1) ) ='E') then begin
               S:=S+GetNextChar;
               if (LA (1) in ['+','-']) then
                  S:=S+GetNextChar;
               if (IsDigit (LA (1) ) ) then
                  while (IsDigit (LA (1) ) ) do
                     S:=S+GetNextChar
               else
                  raise TScriptFailure.Create (peSyntaxError) ;
            end;
         end;
         Token.Text:=S;
         Token.ID:=TJScript (JScript) .SymbolTable.CodeNumberConst (S) ;

         Exit;
      end
      else if IsAlpha (c) then begin
         S:=c;
         while IsAlpha (LA (1) ) or IsDigit (LA (1) ) do
            S:=S+GetNextChar;

         I:=-1;
         for J:=0 to Keywords.Count-1 do
            if Keywords[J]=S then begin
               I:=J;
               break;
            end;

         if I>=0 then begin
            Token.ID:=BOUND_KEYWORD-I;
            Token.AClass:=classKEYWORD;
            Token.Text:=S;
            Exit;
         end;

         Token.AClass:=classID;
         Token.Text:=S;
         Exit;
      end
      else
         raise TScriptFailure.Create (peSyntaxError) ;
   until false;
end;

function TScanner.GetText (Pos1,Pos2:Integer) :string;
var
   L:Integer;
begin
   L:=Pos2-Pos1+1;
   if L<=0 then begin
      result:='';
      Exit;
   end;
   SetLength (result,L) ;
   Move (Buff[Pos1],result[1],L) ;
end;

function TScanner.GetNextToken (var Token:TToken) :boolean;
var
   K,tempP,tempLineNumber,tempLineCount,tempPosNumber{, L,
  TempDefCard}:Integer;
begin
   K:=TJScript (JScript) .SymbolTable.Card;
   tempP:=P;
   tempLineNumber:=LineNumber;
   tempPosNumber:=PosNumber;
   tempLineCount:=TJScript (JScript) .LineCount;

   result:=GetToken (Token) ;

   LineNumber:=tempLineNumber;
   TJScript (JScript) .LineCount:=tempLineCount;
   PosNumber:=tempPosNumber;
   P:=tempP;
   TJScript (JScript) .SymbolTable.EraseTail (K) ;
end;

function TScanner.GetRegExpBody:string;
var
   c:Char;
begin
   result:='';
   while LA (1) <>'/' do begin
      c:=GetNextChar;
      if IsEOF (c) then Exit;
      result:=result+c;
   end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -