📄 dxjs_scanner.old
字号:
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 + -