parent
a89d92ad42
commit
1abe441ca6
|
|
@ -1231,606 +1231,40 @@ type TINISynHigLighter = class(TSynHighLighter)
|
|||
return r;
|
||||
end
|
||||
end
|
||||
type TJsonSynHighLighter = class(TSynHighLighter)
|
||||
function Create(AOwner);
|
||||
type TJsonSynHighLighter = class(tcustomsynhighlighter)
|
||||
function create(AOwner);
|
||||
begin
|
||||
inherited;
|
||||
Clean();
|
||||
FChangeDeal := true;
|
||||
end
|
||||
function Clean();override;
|
||||
begin
|
||||
// { "
|
||||
FTokens := array();
|
||||
FSates := array(0); //状态
|
||||
FBBStates := array(new TBBState(")"));
|
||||
FBEStates := array(new TBBState("}"));
|
||||
FMBStates := array(new TBBState("]"));
|
||||
FSatesCount := 1; //改变的行
|
||||
|
||||
end
|
||||
function Recycling();override;
|
||||
begin
|
||||
|
||||
inherited;
|
||||
Clean();
|
||||
end
|
||||
function SetInValidateIndex(idx); override; //当前改变的行
|
||||
begin
|
||||
idx := max(1,idx);
|
||||
if not(FChangeDeal) and idx>FSatesCount then return ;
|
||||
fdolastline := idx-2;
|
||||
if length(FSates)>=idx then
|
||||
FSatesCount := idx;
|
||||
else FSatesCount := length(FSates)-1;
|
||||
if FSatesCount = 1 then Clean();
|
||||
FChangeDeal := false;
|
||||
end
|
||||
function ParserTokenLines(s,b,e,cst,tokens);
|
||||
begin
|
||||
label L_XCDG;
|
||||
if cst=0 then
|
||||
begin
|
||||
idx := b;
|
||||
ttk := "";
|
||||
while idx<=e do
|
||||
begin
|
||||
vi := s[idx];
|
||||
case vi of
|
||||
" ","\t":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
end
|
||||
"(",")":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,")");
|
||||
end
|
||||
"{","}":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,"}");
|
||||
end
|
||||
"[","]":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,"]");
|
||||
end
|
||||
":",",":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,vi);
|
||||
end
|
||||
'"':
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,'"');
|
||||
return ParserTokenLines(s,idx+1,e,'"',tokens);
|
||||
end else
|
||||
begin
|
||||
ttk+=vi;
|
||||
end
|
||||
|
||||
end ;
|
||||
idx++;
|
||||
end
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
end else //查找
|
||||
begin
|
||||
if b>e then return cst;
|
||||
r := FindRightChar(cst,s,b,e,"\\");
|
||||
if r=0 then //没找到
|
||||
begin
|
||||
Setttoken(tokens,s[b:],e,cst);
|
||||
return cst;
|
||||
end else //找到
|
||||
if r<=e then
|
||||
begin
|
||||
if b<r then
|
||||
begin
|
||||
Setttoken(tokens,s[b:r-1],r-1,cst);
|
||||
end
|
||||
Setttoken(tokens,s[r:r],r,cst);
|
||||
if r<e then
|
||||
begin
|
||||
//消除递归
|
||||
b := r+1;
|
||||
cst := 0;
|
||||
goto L_XCDG;
|
||||
//return ParserTokenLines(s,r+1,e,0,tokens); //递归方式
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function InsureTokenParserd(LastLine);override; //解析
|
||||
begin
|
||||
ls := Lines;
|
||||
FChangeDeal := true;
|
||||
if fdolastline>=LastLine then return ;
|
||||
fdolastline := LastLine;
|
||||
for i:= FSatesCount-1 to LastLine do
|
||||
begin
|
||||
if i<0 then continue;
|
||||
s := ls.GetStringByIndex(i);
|
||||
cst := FSates[i];
|
||||
tks := array();
|
||||
FCBBState := FBBStates[i].Clone;
|
||||
FCBEState := FBEStates[i].Clone;
|
||||
FCMBState := FMBStates[i].Clone;
|
||||
FSates[i+1] := ParserTokenLines(s,1,length(s),cst,tks);
|
||||
FBBStates[i+1] :=FCBBState;//.Clone;
|
||||
FBEStates[i+1] := FCBEState;//.Clone;
|
||||
FMBStates[i+1] := FCMBState;
|
||||
FSatesCount := i+1;
|
||||
FTokens[i] := tks;
|
||||
end
|
||||
end
|
||||
function GetLineTokens(idx);override;
|
||||
begin
|
||||
if idx<FSatesCount then
|
||||
return FTokens[idx];
|
||||
end
|
||||
protected
|
||||
function SetTToken(tokens,ttk,idx,ext);virtual; //设置token
|
||||
begin
|
||||
d := inherited;
|
||||
if not d then return ;
|
||||
tk := d.FValue;
|
||||
if ext in array(")","]","}") then d.FFColor := 0xFF0000;
|
||||
if ext="}" and tk="{" then
|
||||
begin
|
||||
FCBEState.GetLeft();
|
||||
d.FMATe := FCBEState.GetSate();
|
||||
end else
|
||||
if ext="}" and tk="}" then
|
||||
begin
|
||||
FCBEState.GetRight();
|
||||
d.FMATe := FCBEState.GetSate();
|
||||
end else
|
||||
if ext="]" and tk="[" then
|
||||
begin
|
||||
FCMBState.GetLeft();
|
||||
d.FMATe := FCMBState.GetSate();
|
||||
|
||||
end else
|
||||
if ext="]" and tk="]" then
|
||||
begin
|
||||
FCMBState.GetRight();
|
||||
d.FMATe := FCMBState.GetSate();
|
||||
end else
|
||||
if ext=")" and tk="(" then
|
||||
begin
|
||||
FCBBState.GetLeft();
|
||||
d.FMATe := FCBBState.GetSate();
|
||||
|
||||
end else
|
||||
if ext=")" and tk=")" then
|
||||
begin
|
||||
FCBBState.GetRight();
|
||||
d.FMATe := FCBBState.GetSate();
|
||||
end else
|
||||
if ext='"' then
|
||||
begin
|
||||
D.FFColor := 0x8B008B;
|
||||
end else
|
||||
if tk in array("true","false","null") then
|
||||
begin
|
||||
d.FFColor := 0x0000FF;
|
||||
end else
|
||||
if tk in array(":",",") then
|
||||
begin
|
||||
d.FFColor := 0x0000FF;
|
||||
end else
|
||||
if StrIsANumber(tk) then d.FFColor := 0x666666;
|
||||
return d;
|
||||
|
||||
end
|
||||
private
|
||||
function StrIsANumber(s);
|
||||
begin
|
||||
if not s then return 0;
|
||||
r := (1=ParseRegExpr("^[+-]?[\\d]+",s,"",result,MPos,Mlen)) ;
|
||||
return r;
|
||||
end
|
||||
function FindRightChar(c,s,b,e,zy); //查找封闭的字符
|
||||
begin
|
||||
i := b;
|
||||
while i<=e do
|
||||
begin
|
||||
si := s[i];
|
||||
if si=zy then
|
||||
begin
|
||||
i+=2;
|
||||
if i>e then return 0;
|
||||
continue;
|
||||
end
|
||||
if s[i]=c then //找到了
|
||||
begin
|
||||
return i;
|
||||
end
|
||||
i++;
|
||||
end
|
||||
return 0; //没找到
|
||||
for i := b to e do
|
||||
begin
|
||||
if s[i]=c then //找到了
|
||||
begin
|
||||
return i;
|
||||
end
|
||||
ExecuteCommand("string",array(('"',"\\")));
|
||||
ExecuteCommand("keywords",array("null","true","false"));
|
||||
ExecuteCommand("rowannotes",array());
|
||||
ExecuteCommand("blockannotes",array());
|
||||
ExecuteCommand("syms",array("{","}","[","]","<",">",":",",","="));
|
||||
ExecuteCommand("pairs",array(("{","}"),("[","]")));
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
private
|
||||
fdolastline;
|
||||
FTokens;
|
||||
FSates;
|
||||
FSatesCount;
|
||||
|
||||
FCBBState;
|
||||
FCBEState;
|
||||
FCMBState;
|
||||
FBBStates;
|
||||
FBEStates;
|
||||
FMBStates ;
|
||||
end
|
||||
type ttfmhighlighter = class(TSynHighLighter)
|
||||
function Create(AOwner);
|
||||
type ttfmhighlighter = class(tcustomsynhighlighter)
|
||||
function create(AOwner);
|
||||
begin
|
||||
inherited;
|
||||
Clean();
|
||||
FChangeDeal := true;
|
||||
end
|
||||
function Clean();override;
|
||||
begin
|
||||
// { "
|
||||
FTokens := array();
|
||||
FSates := array(0); //状态
|
||||
FBBStates := array(new TBBState(")"));
|
||||
FBEStates := array(new TBBState("}"));
|
||||
FMBStates := array(new TBBState("]"));
|
||||
FbgedStates := array(new TBBState("end"));
|
||||
FjkhStates := array(new TBBState(">"));
|
||||
FSatesCount := 1; //改变的行
|
||||
end
|
||||
function Recycling();override;
|
||||
begin
|
||||
|
||||
inherited;
|
||||
Clean();
|
||||
end
|
||||
function SetInValidateIndex(idx); override; //当前改变的行
|
||||
begin
|
||||
idx := max(1,idx);
|
||||
if not(FChangeDeal) and idx>FSatesCount then return ;
|
||||
fdolastline := idx-2;
|
||||
if length(FSates)>=idx then
|
||||
FSatesCount := idx;
|
||||
else FSatesCount := length(FSates)-1;
|
||||
if FSatesCount = 1 then Clean();
|
||||
FChangeDeal := false;
|
||||
end
|
||||
function ParserTokenLines(s,b,e,cst,tokens);
|
||||
begin
|
||||
label L_XCDG;
|
||||
if cst=0 then
|
||||
begin
|
||||
idx := b;
|
||||
ttk := "";
|
||||
while idx<=e do
|
||||
begin
|
||||
vi := s[idx];
|
||||
case vi of
|
||||
" ","\t":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
end
|
||||
"(",")":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,")");
|
||||
end
|
||||
"{","}":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,"}");
|
||||
end
|
||||
"[","]":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,"]");
|
||||
end
|
||||
"<",">":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,">");
|
||||
end
|
||||
":",",":
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,vi);
|
||||
end
|
||||
'"':
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,vi,idx,'"');
|
||||
return ParserTokenLines(s,idx+1,e,'"',tokens);
|
||||
end else
|
||||
begin
|
||||
ttk+=vi;
|
||||
end
|
||||
|
||||
end ;
|
||||
idx++;
|
||||
end
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
end else //查找
|
||||
begin
|
||||
if b>e then return cst;
|
||||
r := FindRightChar(cst,s,b,e,"\\");
|
||||
if r=0 then //没找到
|
||||
begin
|
||||
Setttoken(tokens,s[b:],e,cst);
|
||||
return cst;
|
||||
end else //找到
|
||||
if r<=e then
|
||||
begin
|
||||
if b<r then
|
||||
begin
|
||||
Setttoken(tokens,s[b:r-1],r-1,cst);
|
||||
end
|
||||
Setttoken(tokens,s[r:r],r,cst);
|
||||
if r<e then
|
||||
begin
|
||||
//消除递归
|
||||
b := r+1;
|
||||
cst := 0;
|
||||
goto L_XCDG;
|
||||
//return ParserTokenLines(s,r+1,e,0,tokens); //递归方式
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function InsureTokenParserd(LastLine);override; //解析
|
||||
begin
|
||||
ls := Lines;
|
||||
FChangeDeal := true;
|
||||
if fdolastline>=LastLine then return ;
|
||||
fdolastline := LastLine;
|
||||
for i:= FSatesCount-1 to LastLine do
|
||||
begin
|
||||
if i<0 then continue;
|
||||
s := ls.GetStringByIndex(i);
|
||||
cst := FSates[i];
|
||||
tks := array();
|
||||
FCBBState := FBBStates[i].Clone;
|
||||
FCBEState := FBEStates[i].Clone;
|
||||
FCMBState := FMBStates[i].Clone;
|
||||
fcbgesate := FbgedStates[i].Clone;
|
||||
fcjkhState := FjkhStates[i].Clone;
|
||||
FSates[i+1] := ParserTokenLines(s,1,length(s),cst,tks);
|
||||
FBBStates[i+1] :=FCBBState;//.Clone;
|
||||
FBEStates[i+1] := FCBEState;//.Clone;
|
||||
FMBStates[i+1] := FCMBState;
|
||||
FbgedStates[i+1] := fcbgesate;
|
||||
FjkhStates[i+1] := fcjkhState;
|
||||
FSatesCount := i+1;
|
||||
FTokens[i] := tks;
|
||||
end
|
||||
end
|
||||
function GetLineTokens(idx);override;
|
||||
begin
|
||||
if idx<FSatesCount then
|
||||
return FTokens[idx];
|
||||
end
|
||||
protected
|
||||
function SetTToken(tokens,ttk,idx,ext);virtual; //设置token
|
||||
begin
|
||||
d := inherited;
|
||||
if not d then return ;
|
||||
tk := d.FValue;
|
||||
if ext in array(")","]","}",">") then d.FFColor := 0xFF0000;
|
||||
if ext=">" and tk="<" then
|
||||
begin
|
||||
fcjkhState.GetLeft();
|
||||
d.FMATe := fcjkhState.GetSate();
|
||||
end else
|
||||
if ext=">" and tk=">" then
|
||||
begin
|
||||
fcjkhState.GetRight();
|
||||
d.FMATe := fcjkhState.GetSate();
|
||||
end else
|
||||
if ext="}" and tk="{" then
|
||||
begin
|
||||
FCBEState.GetLeft();
|
||||
d.FMATe := FCBEState.GetSate();
|
||||
end else
|
||||
if ext="}" and tk="}" then
|
||||
begin
|
||||
FCBEState.GetRight();
|
||||
d.FMATe := FCBEState.GetSate();
|
||||
end else
|
||||
if ext="]" and tk="[" then
|
||||
begin
|
||||
FCMBState.GetLeft();
|
||||
d.FMATe := FCMBState.GetSate();
|
||||
|
||||
end else
|
||||
if ext="]" and tk="]" then
|
||||
begin
|
||||
FCMBState.GetRight();
|
||||
d.FMATe := FCMBState.GetSate();
|
||||
end else
|
||||
if ext=")" and tk="(" then
|
||||
begin
|
||||
FCBBState.GetLeft();
|
||||
d.FMATe := FCBBState.GetSate();
|
||||
|
||||
end else
|
||||
if ext=")" and tk=")" then
|
||||
begin
|
||||
FCBBState.GetRight();
|
||||
d.FMATe := FCBBState.GetSate();
|
||||
end else
|
||||
if ext='"' then
|
||||
begin
|
||||
D.FFColor := 0x8B008B;
|
||||
end else
|
||||
if tk in array("true","false","null") then
|
||||
begin
|
||||
d.FFColor := 0x0000FF;
|
||||
end else
|
||||
if tk ="object" then
|
||||
begin
|
||||
d.FFColor := 0x0000FF;
|
||||
fcbgesate.GetLeft();
|
||||
d.FMATe := fcbgesate.GetSate();
|
||||
end else
|
||||
if tk="end" then
|
||||
begin
|
||||
d.FFColor := 0x0000FF;
|
||||
fcbgesate.GetRight();
|
||||
d.FMATe := fcbgesate.GetSate();
|
||||
end else
|
||||
if tk in array(":",",") then
|
||||
begin
|
||||
d.FFColor := 0x0000FF;
|
||||
end else
|
||||
if StrIsANumber(tk) then d.FFColor := 0x666666;
|
||||
return d;
|
||||
|
||||
end
|
||||
private
|
||||
function StrIsANumber(s);
|
||||
begin
|
||||
if not s then return 0;
|
||||
r := (1=ParseRegExpr("^[+-]?[\\d]+",s,"",result,MPos,Mlen)) ;
|
||||
return r;
|
||||
end
|
||||
function FindRightChar(c,s,b,e,zy); //查找封闭的字符
|
||||
begin
|
||||
i := b;
|
||||
while i<=e do
|
||||
begin
|
||||
si := s[i];
|
||||
if si=zy then
|
||||
begin
|
||||
i+=2;
|
||||
if i>e then return 0;
|
||||
continue;
|
||||
end
|
||||
if s[i]=c then //找到了
|
||||
begin
|
||||
return i;
|
||||
end
|
||||
i++;
|
||||
end
|
||||
return 0; //没找到
|
||||
for i := b to e do
|
||||
begin
|
||||
if s[i]=c then //找到了
|
||||
begin
|
||||
return i;
|
||||
end
|
||||
ExecuteCommand("string",array(('"',"\\")));
|
||||
ExecuteCommand("keywords",array("object","end"));
|
||||
ExecuteCommand("rowannotes",array());
|
||||
ExecuteCommand("blockannotes",array());
|
||||
ExecuteCommand("syms",array("{","}","[","]","<",">",":",",","="));
|
||||
ExecuteCommand("pairs",array(("{","}"),("[","]"),("<",">"),("object","end")));
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
private
|
||||
fdolastline;
|
||||
FTokens;
|
||||
FSates;
|
||||
FSatesCount;
|
||||
|
||||
FCBBState;
|
||||
FCBEState;
|
||||
FCMBState;
|
||||
FBBStates;
|
||||
FBEStates;
|
||||
FMBStates ;
|
||||
FbgedStates;
|
||||
FjkhStates;
|
||||
fcbgesate;
|
||||
fcjkhState;
|
||||
end
|
||||
implementation
|
||||
type TBBState =class //括号状态
|
||||
type TBBState =class(tpairstate) //À¨ºÅ״̬
|
||||
function Create(t);
|
||||
begin
|
||||
FType := ifstring(t)?t:"";
|
||||
FCJ := 0;
|
||||
FState := 0;
|
||||
FIndexs := array(0);
|
||||
FIndex := 0;
|
||||
FCstate := false;
|
||||
inherited;
|
||||
end
|
||||
function GetLeft();
|
||||
begin
|
||||
FCstate := true;
|
||||
if FState then // 上一个是左括号
|
||||
begin
|
||||
FCJ++;
|
||||
FIndex++;
|
||||
FIndexs[FIndex]:=0;
|
||||
end else //上一个非左括号
|
||||
begin
|
||||
|
||||
FIndexs[FIndex]++;
|
||||
end
|
||||
FState := true;
|
||||
end
|
||||
function GetRight();
|
||||
begin
|
||||
FCstate := true;
|
||||
//if FCJ=0 then return ;
|
||||
if FState then // 上一个是左括号
|
||||
begin
|
||||
|
||||
//FIndexs[FIndex]++;
|
||||
end else //上一个非左括号
|
||||
begin
|
||||
if FCJ>0 then
|
||||
begin
|
||||
FCJ--;
|
||||
DeleteIndex(FIndexs,FIndex);
|
||||
FIndex--;
|
||||
end else
|
||||
begin
|
||||
FCstate := false;
|
||||
end
|
||||
end
|
||||
FState := false;
|
||||
end
|
||||
function GetSate();
|
||||
begin
|
||||
if FCstate then
|
||||
begin
|
||||
//return inttostr(FIndexs[FCJ])+FType;
|
||||
return tostn(FIndexs)+FType;// inttostr(FCJ)+"+"+inttostr(FIndexs[FIndex])+FType; length(FIndexs)+FType ;//
|
||||
end
|
||||
end
|
||||
function Show();
|
||||
begin
|
||||
echo "层级:",FCJ," 序号:",FIndexs[FIndex],"状态:", FCstate;
|
||||
end
|
||||
function Clone();
|
||||
begin
|
||||
r := new TBBState(FType);
|
||||
r.FCstate := FCstate;
|
||||
r.FState := FState;
|
||||
r.FCJ := FCJ;
|
||||
r.FIndexs := FIndexs;
|
||||
r.FIndex := FIndex;
|
||||
return r;
|
||||
end
|
||||
protected
|
||||
FCstate;
|
||||
FState;
|
||||
FCJ;
|
||||
FIndexs;
|
||||
FIndex;
|
||||
FType;
|
||||
|
||||
end
|
||||
type TTsfFileParser = class //文件解析
|
||||
private
|
||||
|
|
|
|||
|
|
@ -3014,6 +3014,450 @@ type TSynHighLighter = class(TComponent) //
|
|||
Flines;
|
||||
FMemo;
|
||||
|
||||
end
|
||||
type tcustomsynhighlighter = class(TSynHighLighter)
|
||||
{**
|
||||
@explan(说明) 通用的语法高亮类
|
||||
支持单行注释,块注释,配对,字符串定义,关键字,符号%%
|
||||
@data(20220915)
|
||||
**}
|
||||
function create(AOwner);
|
||||
begin
|
||||
inherited;
|
||||
fsymcolor := 0xa000a0;
|
||||
fkeywordcolor := 0x0000ff;
|
||||
fstringcolor := 0xff00ff;
|
||||
fannotationcolor := 0xff0000;
|
||||
fignorecase := false;//忽略大小写
|
||||
FChangeDeal := true;
|
||||
FTokens := array();
|
||||
setkeyword(array("null","true","false"));
|
||||
setblockannote(array(
|
||||
("/*","*/"),
|
||||
));
|
||||
setrowannote(array("//"));
|
||||
setsyms(array("+","-","*","/",";","(",")","{","}",":"));
|
||||
setstring(array(
|
||||
("'","\\"),
|
||||
('"',"\\"),
|
||||
));
|
||||
setpairs(array(
|
||||
("(",")"),
|
||||
("{","}"),
|
||||
));
|
||||
clean();
|
||||
end
|
||||
function ExecuteCommand(cmd,pm);override;
|
||||
begin
|
||||
{**
|
||||
@explan(说明) 对外接口 %%
|
||||
@param(cmd)(string) 命令%%
|
||||
@param(pm)(array) 参数 %%
|
||||
**}
|
||||
case cmd of
|
||||
"strings":
|
||||
begin
|
||||
return setstring(pm);
|
||||
end
|
||||
"rowannotes":
|
||||
begin
|
||||
return setrowannote(pm);
|
||||
end
|
||||
"blockannotes":
|
||||
begin
|
||||
return setblockannote(pm);
|
||||
end
|
||||
"keywords":
|
||||
begin
|
||||
return setkeyword(pm);
|
||||
end
|
||||
"syms":
|
||||
begin
|
||||
return setsyms(pm);
|
||||
end
|
||||
"pairs":
|
||||
begin
|
||||
return setpairs(pm);
|
||||
end
|
||||
end ;
|
||||
return inherited;
|
||||
end
|
||||
function SetInValidateIndex(idx);override; //当前改变的行
|
||||
begin
|
||||
idx := max(1,idx);
|
||||
fdolastline := idx-2;
|
||||
if not(FChangeDeal)and idx>FSatesCount then return;
|
||||
if length(FSates)>= idx then FSatesCount := idx;
|
||||
else FSatesCount := length(FSates)-1;
|
||||
if FSatesCount=1 then clean();
|
||||
FChangeDeal := false;
|
||||
end
|
||||
|
||||
function InsureTokenParserd(LastLine);override; //解析
|
||||
begin
|
||||
ls := Lines;
|
||||
FChangeDeal := true;
|
||||
if fdolastline>=LastLine then return ;
|
||||
fdolastline := LastLine;
|
||||
for i := FSatesCount-1 to LastLine do
|
||||
begin
|
||||
if i<0 then continue;
|
||||
s := ls.GetStringByIndex(i);
|
||||
cst := FSates[i];
|
||||
tks := array();
|
||||
fcbgestate := array();
|
||||
for jj,j in mrows(Fbgedstates,1) do
|
||||
begin
|
||||
v := Fbgedstates[j][i];
|
||||
vj := v.Clone;
|
||||
fcbgestate[j]:= vj;
|
||||
Fbgedstates[j][i+1]:= vj;
|
||||
end
|
||||
FSates[i+1]:= ParserTokenLines(s,1,length(s),cst,tks);
|
||||
FSatesCount := i+1;
|
||||
FTokens[i]:= tks;
|
||||
end
|
||||
end
|
||||
function GetLineTokens(idx);override;
|
||||
begin
|
||||
if idx<FSatesCount then return FTokens[idx];
|
||||
end
|
||||
function SetTToken(tokens,ttk,idx,ext);override; //设置token
|
||||
begin
|
||||
bttk := ttk;
|
||||
d := inherited;
|
||||
if not d then return ;
|
||||
if not ext then
|
||||
begin
|
||||
if ifkeywords(bttk) then
|
||||
begin
|
||||
d.FFColor := fkeywordcolor;
|
||||
end
|
||||
dopair(d,bttk);
|
||||
end else
|
||||
if ifarray(ext) then
|
||||
begin
|
||||
if ext[0]="str" then
|
||||
begin
|
||||
d.FFColor := fstringcolor;
|
||||
end else
|
||||
if ext[0] = "annote" then
|
||||
begin
|
||||
d.FFColor := fannotationcolor;
|
||||
end else
|
||||
if ext[0]= "sym" then
|
||||
begin
|
||||
d.FFColor := fsymcolor;
|
||||
dopair(d,bttk);
|
||||
end
|
||||
end
|
||||
return d;
|
||||
end
|
||||
|
||||
function clean();override; //初始化
|
||||
begin
|
||||
FTokens := array();
|
||||
FSates := array(0);
|
||||
Fbgedstates := array();
|
||||
FSatesCount := 0;
|
||||
for i,v in fswordpairs do
|
||||
begin
|
||||
Fbgedstates[i,0]:= new tpairstate(i);
|
||||
end
|
||||
inherited;
|
||||
end
|
||||
property keywordcolor:color read fkeywordcolor write fkeywordcolor;
|
||||
property stringcolor:color read fstringcolor write fstringcolor;
|
||||
property annotationcolor:color read fannotationcolor write fannotationcolor;
|
||||
property symcolor:color read fsymcolor write fsymcolor;
|
||||
private
|
||||
function dopair(d,bttk); //处理配对信息
|
||||
begin
|
||||
n := fswordpairshash[bttk];
|
||||
if n then
|
||||
begin
|
||||
st := fcbgestate[n];
|
||||
if fswordpairs[n][0]=bttk then
|
||||
begin
|
||||
st.GetLeft();
|
||||
end else
|
||||
begin
|
||||
st.GetRight();
|
||||
end
|
||||
d.FMATe := st.GetSate();
|
||||
end
|
||||
end
|
||||
function ParserTokenLines(s,b,e,cst,tokens); //解析字符
|
||||
begin
|
||||
label L_XCDG;
|
||||
if cst=0 then //普通情况
|
||||
begin
|
||||
idx := b;
|
||||
ttk := "";
|
||||
while idx <= e do
|
||||
begin
|
||||
vi := s[idx];
|
||||
if vi=" " or vi="\t" then //分隔符
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
end else
|
||||
if ifrowannote(s,e,idx,oidx,ostr) then
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
bostr := ostr;
|
||||
SetTToken(tokens,ostr,oidx-1,array("annote",bostr));
|
||||
if oidx<=e then
|
||||
begin
|
||||
SetTToken(tokens,s[oidx:],e,array("annote",bostr));
|
||||
end
|
||||
return 0;
|
||||
end else
|
||||
if ifblockannote(s,e,idx,oidx,ostr) then //查找块注释
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
bostr := ostr;
|
||||
ncost := array("annote",bostr,fblockstiresb[bostr]);
|
||||
SetTToken(tokens,ostr,oidx-1);
|
||||
idx := oidx-1;
|
||||
return ParserTokenLines(s,idx+1,e,ncost,tokens);
|
||||
end else
|
||||
if ifstringstart(s,e,idx,oidx,ostr) then //查找字符串
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
bostr := ostr;
|
||||
ncost := array("str",bostr,fstrstires[bostr],fstrstires_zy[cst]);
|
||||
SetTToken(tokens,ostr,oidx-1,ncost);
|
||||
idx := oidx-1;
|
||||
return ParserTokenLines(s,idx+1,e,ncost,tokens);
|
||||
end else
|
||||
if ifdefsym(s,e,idx,oidx,ostr) then //符号
|
||||
begin
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
SetTToken(tokens,ostr,oidx-1,array("sym",ostr));
|
||||
idx := oidx-1;
|
||||
end else
|
||||
begin
|
||||
ttk+=vi;
|
||||
end
|
||||
idx++;
|
||||
end
|
||||
SetTToken(tokens,ttk,idx-1);
|
||||
end else //查找
|
||||
begin
|
||||
if b>e then return cst;
|
||||
if ifarray(cst) and (cst[0]="str" or cst[0]="annote") then
|
||||
begin
|
||||
cst1 := cst[1];
|
||||
cstL := length(cst1);
|
||||
r := FindRightChar(cst[2],s,b,e,cst[3]);
|
||||
if r=0 then //没找到
|
||||
begin
|
||||
Setttoken(tokens,s[b:],e,cst);
|
||||
return cst;
|
||||
end else //找到
|
||||
if r <= e then
|
||||
begin
|
||||
if b<r then
|
||||
begin
|
||||
Setttoken(tokens,s[b:r-1],r-1,cst);
|
||||
end
|
||||
Setttoken(tokens,s[r:(r-1+cstL)],(r-1+cstL),cst);
|
||||
if r<e then
|
||||
begin
|
||||
//消除递归
|
||||
b := r+cstL;
|
||||
cst := 0;
|
||||
goto L_XCDG;
|
||||
//return ParserTokenLines(s,r+1,e,0,tokens); //递归方式
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
function setstring(d); //设置字符串信息
|
||||
begin
|
||||
fstrstires := array();
|
||||
fstrstires_zy := array();
|
||||
for i,v in d do
|
||||
begin
|
||||
if not ifarray(v) then continue;
|
||||
v0 := v[0];
|
||||
v1 := v[1];
|
||||
if ifstring(v0) and v0 then
|
||||
begin
|
||||
st := new TTire();
|
||||
fstrstires[v0] := st;
|
||||
st.add(v0);
|
||||
fstrstires_zy[v0] := v1;
|
||||
end
|
||||
end
|
||||
end
|
||||
function setkeyword(ws); //设置关键字
|
||||
begin
|
||||
st := new TTire();
|
||||
for i,v in ws do
|
||||
begin
|
||||
if v and ifstring(v) then st.add(v);
|
||||
end
|
||||
fkeystires := array(st);
|
||||
end
|
||||
function setblockannote(d); //设置块注释
|
||||
begin
|
||||
fblockstiresa := array();
|
||||
fblockstiresb := array();
|
||||
for i,v in d do
|
||||
begin
|
||||
if not ifarray(d) then continue ;
|
||||
v0 := v[0];
|
||||
v1 := v[1];
|
||||
if ifstring(v0) and ifstring(v1) and v0 and v1 then
|
||||
begin
|
||||
st := new TTire();
|
||||
st.add(v0);
|
||||
fblockstiresa[v0] := st;
|
||||
st := new TTire();
|
||||
st.add(v1);
|
||||
fblockstiresb[v0] := st;
|
||||
end
|
||||
end
|
||||
end
|
||||
function setrowannote(d);//设置行注释
|
||||
begin
|
||||
frowstires := array();
|
||||
for i,v in d do
|
||||
begin
|
||||
if v and ifstring(v) then
|
||||
begin
|
||||
st := new TTire();
|
||||
frowstires[v] := st;
|
||||
st.add("//");
|
||||
end
|
||||
end
|
||||
end
|
||||
function setsyms(d);//设置符号
|
||||
begin
|
||||
st := new TTire();
|
||||
fsymstires := array(st);
|
||||
for i,v in d do
|
||||
begin
|
||||
if ifstring(v) and v then
|
||||
begin
|
||||
st.add(v);
|
||||
end
|
||||
end
|
||||
end
|
||||
function setpairs(d);//设置配对
|
||||
begin
|
||||
fswordpairs := array();
|
||||
fswordpairshash := array();
|
||||
for i,v in d do
|
||||
begin
|
||||
if not ifarray(v) then continue;
|
||||
v0 := v[0];
|
||||
v1 := v[1];
|
||||
if ifstring(v0) and ifstring(v1) and v0 and v1 then
|
||||
begin
|
||||
fswordpairs[v0,0]:= v0;
|
||||
fswordpairs[v0,1]:= v1;
|
||||
fswordpairshash[v0]:=v0;
|
||||
fswordpairshash[v1]:=v0;
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
function cyclefind(cys,s,l,idx,oidx,ostr,tidx);
|
||||
begin
|
||||
r := 0;
|
||||
for i,v in cys do //字符串
|
||||
begin
|
||||
if v.find(s,l,idx,oidx,ostr) then
|
||||
begin
|
||||
r := 1;
|
||||
tidx := i;
|
||||
break;
|
||||
end
|
||||
end
|
||||
return r;
|
||||
end
|
||||
function ifblockannote(s,l,idx,oidx,ostr,tidx);//是否为块注释
|
||||
begin
|
||||
return cyclefind(fblockstiresa,s,l,idx,oidx,ostr,tidx);
|
||||
end
|
||||
function ifrowannote(s,l,idx,oidx,ostr,tidx);//是为
|
||||
begin
|
||||
return cyclefind(frowstires,s,l,idx,oidx,ostr,tidx);
|
||||
end
|
||||
function ifstringstart(s,l,idx,oidx,ostr,tidx); //字符串判断
|
||||
begin
|
||||
return cyclefind(fstrstires,s,l,idx,oidx,ostr,tidx);
|
||||
end
|
||||
function ifkeywords(s);//关键字判断
|
||||
begin
|
||||
for i,v in fkeystires do
|
||||
begin
|
||||
if v.find(s,length(s),1,idx,ostr) and (ostr=s) then
|
||||
return true;
|
||||
end
|
||||
end
|
||||
function ifdefsym(s,l,idx,oidx,ostr,tidx); //符号判断
|
||||
begin
|
||||
return cyclefind(fsymstires,s,l,idx,oidx,ostr,tidx);
|
||||
end
|
||||
function FindRightChar(vo,s,b,e,zy); //查找封闭的字符
|
||||
begin
|
||||
i := b;
|
||||
if not vo then return 1;
|
||||
while i <= e do
|
||||
begin
|
||||
si := s[i];
|
||||
if si=zy then
|
||||
begin
|
||||
i += 2;
|
||||
if i>e then return 0;
|
||||
continue;
|
||||
end
|
||||
if vo.find(s,e,i,oidx,ostr) then
|
||||
begin
|
||||
return i;
|
||||
end
|
||||
i++;
|
||||
end
|
||||
return 0; //没找到
|
||||
end
|
||||
|
||||
private
|
||||
FSatesCount ;// 状态行号
|
||||
FChangeDeal;//改变flag
|
||||
fignorecase; //忽略大小写
|
||||
//前后匹配
|
||||
Fbgedstates;
|
||||
fcbgestate;//当前匹配
|
||||
|
||||
///
|
||||
FSates; //当前状态
|
||||
FTokens;
|
||||
fdolastline; //已经处理到行
|
||||
|
||||
|
||||
///////tire树/////////////
|
||||
fkeystires;
|
||||
fstrstires;
|
||||
fstrstires_zy;
|
||||
fsymstires;
|
||||
frowstires;
|
||||
fblockstiresa;
|
||||
fblockstiresb;
|
||||
/////
|
||||
fkeywordcolor;
|
||||
fstringcolor;
|
||||
fannotationcolor;
|
||||
fsymcolor;
|
||||
|
||||
//
|
||||
fswordpairs;
|
||||
fswordpairshash;
|
||||
|
||||
end
|
||||
type TSynCustomMemo = class(TCustomMemo)
|
||||
{**
|
||||
|
|
|
|||
|
|
@ -1695,6 +1695,84 @@ type TTire = class
|
|||
end
|
||||
FRoot;
|
||||
end
|
||||
type tpairstate =class //括号状态
|
||||
function Create(t);
|
||||
begin
|
||||
FType := ifstring(t)?t:"";
|
||||
FCJ := 0;
|
||||
FState := 0;
|
||||
FIndexs := array(0);
|
||||
FIndex := 0;
|
||||
FCstate := false;
|
||||
end
|
||||
function GetLeft();
|
||||
begin
|
||||
FCstate := true;
|
||||
if FState then // 上一个是左括号
|
||||
begin
|
||||
FCJ++;
|
||||
FIndex++;
|
||||
FIndexs[FIndex]:=0;
|
||||
end else //上一个非左括号
|
||||
begin
|
||||
|
||||
FIndexs[FIndex]++;
|
||||
end
|
||||
FState := true;
|
||||
end
|
||||
function GetRight();
|
||||
begin
|
||||
FCstate := true;
|
||||
//if FCJ=0 then return ;
|
||||
if FState then // 上一个是左括号
|
||||
begin
|
||||
|
||||
//FIndexs[FIndex]++;
|
||||
end else //上一个非左括号
|
||||
begin
|
||||
if FCJ>0 then
|
||||
begin
|
||||
FCJ--;
|
||||
DeleteIndex(FIndexs,FIndex);
|
||||
FIndex--;
|
||||
end else
|
||||
begin
|
||||
FCstate := false;
|
||||
end
|
||||
end
|
||||
FState := false;
|
||||
end
|
||||
function GetSate();
|
||||
begin
|
||||
if FCstate then
|
||||
begin
|
||||
//return inttostr(FIndexs[FCJ])+FType;
|
||||
return tostn(FIndexs)+FType;// inttostr(FCJ)+"+"+inttostr(FIndexs[FIndex])+FType; length(FIndexs)+FType ;//
|
||||
end
|
||||
end
|
||||
function Show();
|
||||
begin
|
||||
echo "层级:",FCJ," 序号:",FIndexs[FIndex],"状态:", FCstate;
|
||||
end
|
||||
function Clone();
|
||||
begin
|
||||
r := new tpairstate(FType);
|
||||
r.FCstate := FCstate;
|
||||
r.FState := FState;
|
||||
r.FCJ := FCJ;
|
||||
r.FIndexs := FIndexs;
|
||||
r.FIndex := FIndex;
|
||||
return r;
|
||||
end
|
||||
protected
|
||||
FCstate;
|
||||
FState;
|
||||
FCJ;
|
||||
FIndexs;
|
||||
FIndex;
|
||||
FType;
|
||||
|
||||
end
|
||||
implementation
|
||||
function includestate(u,s);
|
||||
begin
|
||||
|
|
|
|||
Loading…
Reference in New Issue