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

📄 dxjs_scanner.pas

📁 Well known and usefull component for delphi 7
💻 PAS
📖 第 1 页 / 共 2 页
字号:
            tmpC:=LA (1);
            case tmpC of
               '=':Begin
                  c:=GetNextChar;
                  Token.ID:=OP_ASSIGN_BITWISE_AND;
                  Token.AClass:=classOPER;
                  Token.Text:=Token.Text+c;
               end;
               '&':Begin
                  c:=GetNextChar;
                  Token.ID:=OP_LOGICAL_AND;
                  Token.AClass:=classOPER;
                  Token.Text:=Token.Text+c;
               end;
            end;
            Exit;
         end;
         '|':Begin
            Token.ID:=OP_BITWISE_OR;
            Token.AClass:=classOPER;
            Token.Text:=c;
            tmpC:=LA (1);
            Case tmpC of
               '=':Begin
                  c:=GetNextChar;
                  Token.ID:=OP_ASSIGN_BITWISE_OR;
                  Token.AClass:=classOPER;
                  Token.Text:=Token.Text+c;
               end;
               '|':Begin
                  c:=GetNextChar;
                  Token.ID:=OP_LOGICAL_OR;
                  Token.AClass:=classOPER;
                  Token.Text:=Token.Text+c;
               end;
            end;
            Exit;
         end;
         '(':Begin
            Token.ID:=SP_ROUND_BRACKET_L;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         ')':Begin
            Token.ID:=SP_ROUND_BRACKET_R;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         '[':Begin
            Token.ID:=SP_BRACKET_L;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         ']':Begin
            Token.ID:=SP_BRACKET_R;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         '{':Begin
            Token.ID:=SP_BRACE_L;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         '}':Begin
            Token.ID:=SP_BRACE_R;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         '.':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;
         ';':Begin
            Token.ID:=SP_SEMICOLON;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         ':':Begin
            Token.ID:=SP_COLON;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         ',':Begin
            Token.ID:=SP_COMMA;
            Token.AClass:=classSPECIAL;
            Token.Text:=c;
            Exit;
         end;
         '!':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;
         '=':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;
         #39:Begin
            S:='';
            repeat
               c:=GetNextChar;
               if c='\' then Begin
                  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;
                     #39:begin
                        GetNextChar;
                        S:=S+#$27;
                     end;
                     '\':begin
                        GetNextChar;
                        S:=S+#$5C#$5C; // August 8th
                     end;
                  else
                     S:=S+c+GetNextChar;
                  end; {case}
               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;
         '"':Begin
            S:='';
            repeat
               c:=GetNextChar;
               if c='\' then Begin
                  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;
                     #39:begin
                        GetNextChar;
                        S:=S+#$27;
                     end;
                     '\':begin
                        GetNextChar;
                        S:=S+#$5C#$5C; // August 8th
                     end;
                  else
                     S:=S+c+GetNextChar;
                  end; {case}
               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;
         '0'..'9':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+UpCase (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 begin
                     while (IsDigit (LA (1) ) ) do S:=S+GetNextChar;
                  end
                  else raise TScriptFailure.Create (peSyntaxError) ;
               end;
            end;
            Token.Text:=S;
            Token.ID:=TJScript (JScript) .SymbolTable.CodeNumberConst (S) ;
            Exit;
         end;
         'A'..'Z','a'..'z','_','$':Begin
            S:=c;
            while IsAlpha (LA (1) ) or IsDigit (LA (1) ) do S:=S+GetNextChar;
            I:=-1;
            for J:=0 to MaxKeywords do
               if strKeywords[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) ;
      end; {case}
   until false;
end;

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

function TScanner.GetNextToken (var Token:TToken) :boolean; // Sept 2003
var
   K,tempP,tempLineNumber,tempLineCount,tempPosNumber:Integer;
begin
   if BuffToken.Text <> '' then begin
     Token:=BuffToken;
     Result:=True;
     Exit;
   end;

   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 + -