📄 syntax.cpp
字号:
case _REBOL:
strAllSynWord = _T(" about,absolute,add,alias,all,and,any,any-block!,any-block?,any-function!,any-function?,any-string!,any-string?,any-type!,any-type?,any-word!,any-word?,append,arccosine,arcsine,arctangent,array,ask,at,back,binary!,binary?,bind,bitset!,bitset?,block!,block?,break,catch,change,change-dir,char!,char?,charset,checksum,clear,close,comment,complement,compress,copy,cosine,datatype!,datatype?,date!,date?,decimal!,decimal?,decompress,delete,detab,dir?,disarm,divide,do,echo,either,email!,email?,empty?,entab,equal?,error!,error?,even?,exists?,exit,exp,false,fifth,file!,file?,find,first,for,forall,foreach,form,forskip,found?,fourth,func,function,function!,function?,get,get-word!,get-word?,greater?,greater-or-equal?,halt,hash!,hash?,head,head?,help,if,in,index?,info?,input,input?,insert,integer!,integer?,issue!,issue?,join,last,length?,lesser?,lesser-or-equal?,license,list!,list?,list-dir,lit-word!,lit-word?,load,log-10,log-2,log-e,logic!,logic?,loop,lowercase,make,make-dir,maximum,minimum,modified?,mold,money!,money?,multiply,native!,native?,negate,negative?,newline,next,");
strAllSynWord+= _T("no,none,none!,none?,not,not-equal?,now,number!,number?,object!,object?,odd?,op!,op?,open,or,paren!,paren?,parse,path!,path?,pick,poke,port!,port?,positive?,power,prin,print,probe,query,quit,random,read,recycle,reduce,refinement!,refinement?,reform,rejoin,remainder,remold,remove,rename,repeat,return,same?,save,script?,second,secure,select,send,series!,series?,set,set-net,set-path!,set-path?,set-word!,set-word?,sine,size?,skip,sort,source,square-root,strict-equal?,strict-not-equal?,string!,string?,subtract,symbol!,symbol?,system,tag!,tag?,tail,tail?,tangent,third,throw,time!,time?,to-binary,to-bitset,to-block,to-char,to-date,to-decimal,to-email,to-file,to-get-word,to-hash,to-hex,to-idate,to-integer,to-issue,to-list,to-lit-word,to-logic,to-money,to-none,to-paren,to-refinement,to-set-path,to-set-word,to-string,to-tag,to-time,to-tuple,to-url,to-word,trace,trim,true,try,tuple!,tuple?,type?,unset,unset?,until,update,uppercase,url!,url?,usage,use,value?,wait,what,what-dir,while,word!,word?,write,xor,yes,zero?,");
strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_REBOL"), strAllSynWord);
break;
case _REXX:
strAllSynWord = _T(" address,arg,by,call,digits,do,drop,else,end,engineering,exit,expose,for,forever,form,fuzz,if,interpret,iterate,leave,linein,name,nop,numeric,off,on,options,otherwise,parse,procedure,pull,push,queue,return,say,scientific,select,signal,source,then,to,trace,until,upper,value,var,version,when,while,with,abbrev,abs,address,arg,b2x,bitand,bitor,bitxor,c2d,c2x,center,charin,charout,chars,compare,condition,copies,d2c,d2x,datatype,date,delstr,delword,digits,errortext,form,format,fuzz,insert,lastpos,left,length,linein,lineout,lines,max,min,overlay,pos,queued,random,reverse,right,sign,sourceline,space,stream,strip,substr,subword,symbol,time,trace,translate,trunc,value,verify,word,wordindex,wordlength,wordpos,words,x2b,x2c,x2d,xrange,");
strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_REXX"), strAllSynWord);
break;
case _RUBY:
strAllSynWord = _T(" alias,and,begin,BEGIN,break,case,class,def,defined,do,else,elsif,end,END,ensure,false,for,if,in,module,next,nil,not,or,redo,rescue,retry,return,self,super,then,true,undef,unless,until,when,while,yield,__FILE__,__LINE__,Array,Float,Integer,String,abort,at_exit,autoload,binding,caller,callcc,catch,chop,chop!,chomp,chomp!,eval,exec,exit,exit!,fork,gets,readline,global_variables,gsub,gsub!,iterator?,block_given?,load,local_variables,loop,open,p,print,printf,proc,lambda,putc,puts,raise,fail,rand,readlines,require,scan,select,set_trace_func,sleep,split,sprintf,format,srand,sub,sub!,syscall,system,test,throw,trace_var,trap,untrace_var,TRUE,FALSE,NIL,STDIN,STDOUT,STDERR,ENV,ARGF,ARGV,DATA,TOPLEVEL_BINDING,RUBY_VERSION,RUBY_RELEASE_DATE,RUBY_PLATFORM,VERSION,RELEASE_DATE,PLATFORM,Object,Array,Binding,Continuation,Data,Exception,Dir,FalseClass,File,Hash,IO,File,MatchData,Method,UnboundMethod,Module,Class,Numeric,Integer,Bignum,Fixnum,Float,Proc,Process,Range,Regexp,String,Struct,Symbol,Thread,ThreadGroup,Time,TrueClass,NilClass,Object,Exception,Interrupt,NoMemoryError,ScriptError,LoadError,NameError,NotImplementedError,SyntaxError,SignalException,Interrupt,StandardError,ArgumentError,IndexError,IOError,EOFError,LocalJumpError,NoMethodError,RangeError,FloatDomainError,RegexpError,RuntimeError,SecurityError,SystemCallError,Errno,SystemStackError,ThreadError,TypeError,ZeroDivisionError,SystemExit,fatal,Comparable,Enumerable,Errno,FileTest,GC,Kernel,Marshal,Math,ObjectSpace,Precision,Process,");
strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_RUBY"), strAllSynWord);
break;
case _SMALLTALK:
strAllSynWord = _T(" and,at,collect,do,ifFalse,ifTrue,or,put,reject,select,to,whileFalse,whileTrue,with,Array,Bag,Character,FCB,LargeNegativeInteger,LargePositiveInteger,Point,SmallInteger,String,SwappedOutObject,Symbol,UndefinedObject,abs,add,add:withOccurrences,addAll,addAllFirst,addAllLast,addFirst,addLast,allMask,and,anyMask,arcCos,arcSin,arcTan,asArray,asBag,asCharacter,asciiValue,asDictionary,asFloat,asInteger,asList,asLowercase,asSet,asString,asSymbol,asUppercase,at,at:ifAbsent,at:put,atAll:put,between:and,binaryDo,bitAnd,bitAt,bitInvert,bitOr,bitShift,bitXor,block,ceiling,checkBucket,class,clearScreen,coerce,collect,compareError,copy,copyFrom:length,copyFrom:to,copyWith,copyWithout,cos,current,currentKey,date,debug,deepCopy,detect,detect:ifAbsent,digitValue,display,displayAssign,dist,do,doPrimitive:withArguments,edit,equals:startingAt,eqv,error,even,exp,factorial,false,findAssociation:inList,findFirst,findFirst:ifAbsent,findLast,findLast:ifAbsent,first,firstKey,floor,fork,forkWith,fractionPart,from:to:by,gamma,gcd,getList,getString,grow,hashNumber,highBit,ifFalse,ifFalse:ifTrue,ifTrue,ifTrue:ifFalse,includes,includesKey,indexOf,indexOf:ifAbsent,");
strAllSynWord+= _T(" indexOfSubCollection:startingAt,indexOfSubCollection:startingAt:ifAbsent,inject:into,inRange,integerPart,isAlphaNumeric,isBits,isBytes,isCharacter,isDigit,isEmpty,isKindOf,isLetter,isLowercase,isMemberOf,isNil,isSeparator,isUppercase,isVariable,isVowel,keys,keysDo,keysSelect,last,lastKey,lcm,list,ln,log,max,maxtype,min,modeCharacter,modeInteger,modeString,negated,negative,new,newProcess,newProcessWith,next,nil,noDisplay,noMask,not,nothing,notNil,occurrencesOf,odd,open,open:for,or,padTo,pen,perform:withArguments,pi,positive,print,printAt,printNoReturn,printString,prompt,quo,radians,radix,raisedTo,randInteger,randomize,read,reciprocal,reject,rem,remove,remove:ifAbsent,removeError,removeFirst,removeKey,removeKey:ifAbsent,removeLast,replaceFrom:to:with,replaceFrom:to:with:startingAt,respondsTo,resume,reversed,reverseDo,rounded,roundTo,sameAs,select,sh,shallowCopy,sign,signal,sin,size,sort,sqrt,squared,state,strictlyPositive,superClass,suspend,tan,termErr,terminate,time,timesRepeat,to,to:by,transpose,true,truncated,truncateTo,unblock,value,values,variables,view,wait,whileFalse,whileTrue,with:do,write,x,x:y,xor,y,yield,");
strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_SMALLTALK"), strAllSynWord);
break;
case _SQL:
strAllSynWord = _T(" 1CE,1OL,ABS,AFTER,ALTER,AND,AS,AVG,BEFORE,BEGIN,BETWEEN,BODY,BREAK,BUFFER,BY,CHAR,CHAR,CLEAR,CLOSE,CLUSTER,COMMIT,COMPUTE,CONSTANT,CONSTRAINT,COS,COSH,COUNT,CREATE,CURSOR,DATABASE,DATAFILE,DATATYPE,DATE,DB1CE,DECIMAL,DECLARE,DEFAULT,DEFINE,DELETE,DROP,DUMP,ECHO,ELSE,ELSIF,END,EXCEPTION,EXCEPTION_INIT,EXECUTE,EXIT,EXP,EXPLAIN,FEEDBACK,FETCH,FLUSH,FOR,FORMAT,FROM,FROM,FUNCTION,GOTO,GRANT,GROUP,HEADING,HEXTORAW,IF,IN,INDEX,INDEX,INITIAL,INSERT,INSERT,INTEGER,INTO,INTO,IS,LEFT,LENGTH,LIKE,LINESIZE,LOCKMODE,LONG,LOOP,LTRIM,LUB,MAX,MAXEXTENTS,MIN,MINEXTENTS,MOD,MONEY,NEWPAGE,NEXT,NO_DATA_FOUND,NOT,NULL,NUMBER,OF,OFF,ON,OPEN,OR,ORDER,OTHERS,PACKAGE,PAGESIZE,PAUSE,PCTINCREASE,PROCEDURE,PROCEDURE,PROMPT,PUBLIC,RAISE,REAL,RENAME,REPLACE,RETURN,REVOKE,ROUND,RTRIM,SCHEMA,SELECT,SELECT,SERVEROUT,SET,SIN,SIZE,SORT,START,STORAGE,SUM,SYNONYM,TAB,TABLE,TABLE,TABLE1CE,TAN,TEMP,TERMOUT,THEN,TIME,TIMING,TRANSACTION,TRIGGER,TYPE,UNION,UPDATE,UPDATE,UPPER,VARCHAR2,VARCHAR2,VERIFY,VIEW,WHEN,WHERE,WHILE,WRAP,");
strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_SQL"), strAllSynWord);
break;
case _VHDL:
strAllSynWord = _T(" abs,access,after,alias,all,and,architecture,array,assert,attribute,begin,block,body,buffer,bus,case,component,configuration,constant,disconnect,downto,else,elsif,end,entity,exit,file,for,function,generate,generic,group,guarded,if,impure,in,inertial,inout,is,label,library,linkage,literal,loop,map,mod,nand,new,next,nor,not,null,of,on,open,or,others,out,package,port,postponed,procedure,process,pure,range,record,register,reject,rem,report,return,rol,ror,select,severity,shared,signal,sla,sll,sra,srl,subtype,then,to,transport,type,unaffected,units,until,use,variable,wait,when,while,with,xnor,xor,is_x,resolved,rising_edge,std_logic,std_logic_vector,std_ulogic,std_ulogic_vector,t_ux01z,t_x01,t_x01z,to_bit,to_bitvector,to_stdlogicvector,to_stdulogic,to_stdulogicvector,ux01z,x01,x01z,");
strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_VHDL"), strAllSynWord);
break;
case _XML:
strAllSynWord = _T(" !DOCTYPE,!ENTITY,!ELEMENT,!ATTLIST,!NOTATION,CDATA,ID,IDREF,IDREFS,ENTITY,ENTITIES,NMTOKEN,NMTOKENS,^#REQUIRED,^#IMPLIED,^#FIXED,");
strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_XML"), strAllSynWord);
break;
default: //is NONE
return;
}
if(!g_bCase) {
strAllSynWord.MakeLower();
}
CString strTemp;
int nPosPrior = 0;
int nPos;
nPos = strAllSynWord.Find(_T(","), nPosPrior);
while(nPos!=-1)
{
strTemp = strAllSynWord.Mid(nPosPrior+1 , nPos - nPosPrior - 1);
m_strArrayKeyWords.Add(strTemp);
nPosPrior = nPos;
nPos = strAllSynWord.Find(_T(","), nPosPrior + 1);
}
SortSynWordArray(m_strArrayKeyWords);
}
/*还有点小问题
//希尔排序
void SortSynWordArray(CStringArray &m_strArrayKeyWords)
{
CString strtmp;
int nCount = m_strArrayKeyWords.GetSize();
int k, j, i, cmpret;
k=nCount/2;
while(k>=1)
{
for(i=k;i<nCount;i++)
{
strtmp = m_strArrayKeyWords.GetAt(i);
j=i-k;
cmpret = strtmp.Compare(m_strArrayKeyWords.GetAt(j));
while(j>=0 && cmpret<=0)
{
m_strArrayKeyWords.SetAt(j+k, m_strArrayKeyWords.GetAt(j));
j=j-k;
}
m_strArrayKeyWords.SetAt(j+k, strtmp);
}
k/=2;
}
}
//*/
void SortSynWordArray(CStringArray &m_strArrayKeyWords)
{
int i,j,x, count = m_strArrayKeyWords.GetSize();
CString strtmp;
for(i=1;i<count;i++)
{
for(x=0;x<i;x++)
{
if(m_strArrayKeyWords.GetAt(i).Compare(m_strArrayKeyWords.GetAt(x))<=0)
break;
}
strtmp=m_strArrayKeyWords.GetAt(i);
for(j=i;j>x;j--)
m_strArrayKeyWords.SetAt(j, m_strArrayKeyWords.GetAt(j-1));
m_strArrayKeyWords.SetAt(x, strtmp);
}
}
/*///////////////////////////////////////////////////////////////////////////////////////////////
ParseLine(m_strArrayKeyWords, dwCookie, strLine, ColorInfo, nActualItems) );
功能:根据所给定的语言解析一行字符串,返回用颜色指示的字符串块,以及解析后的当前行的解析结果,
指示解析后当前行处于什么状态,是处于字符串中、注释中、多行注释中还是正常状态。
入口参数:
m_strArrayKeyWords: 关键字列表
dwCookie: 传入前一行的解析结果,如果前一行是多行注释的开始或者前一行是一软回车时有用
strLine: 被解析的一行字符串
ColorInfo: 解析后的颜色值,指定是关键字、字符串、注释还是正常的字符颜色
nActualItems strLine被解析后的块数
/////////////////////////////////////////////////////////////////////////////////////////////////*/
DWORD ParseLine(CStringArray &m_strArrayKeyWords,
DWORD dwCookie,
CString &strLine,
COLORINFO *ColorInfo,
int &nActualItems)
{
//*
if(g_nCurLanguage ==_HTML || g_nCurLanguage ==_XML) {
int dwCookieTmp = ParseLineForHtml(m_strArrayKeyWords, dwCookie, strLine, ColorInfo, nActualItems);
return dwCookieTmp;
}
//*/
int nLength = strLine.GetLength();
int nIdentBegin = -1;
int i;
BOOL bMatch;
BOOL bInString; //定义一个字符串的界限
BOOL bRedefineBlock = TRUE;
BOOL bDecIndex = FALSE;
BOOL bIsInTheControlChar = FALSE; //指示是否在\的控制中, strControl为空时无效, 初始化时必须为FALSE, 原因见结束定义字符串的处理代码
if(nLength == 0)
return dwCookie;
for (int I = 0; ; I++)
{
if (bRedefineBlock) //如果开始定义颜色块向下做
{
int nPos = I;
if (bDecIndex)
nPos--;
if (dwCookie & (COOKIE_COMMENT | COOKIE_EXT_COMMENT))
{
DEFINE_BLOCK(nPos, COLORINDEX_COMMENT);
}
else {
if (dwCookie & COOKIE_STRING)
{
DEFINE_BLOCK(nPos, COLORINDEX_STRING);
}
else
{
DEFINE_BLOCK(nPos, COLORINDEX_NORMAL);
}
}
bRedefineBlock = FALSE;
bDecIndex = FALSE;
}
if (I >= nLength)
goto Out;
//遇到双字节字体如中文直接跳过
if(IsDBCSLeadByte(strLine[I])) //检查是不是中文字符
{
I += 2;
if (I >= nLength)
goto Out;
else
goto cmpnextchar; //继续处理strLine的下一个字符
}
//////////////////////////////
if (dwCookie & COOKIE_COMMENT)
{
DEFINE_BLOCK(I, COLORINDEX_COMMENT);
dwCookie |= COOKIE_COMMENT;
goto Out;
}
//如果当前正处于字符串变量中,则应检查是否有结束字符串变量的字符串
if (dwCookie & COOKIE_STRING)
{
if(g_bControl) { //处理控制字符,至少C++会用到(例\"表示引号而不是两个字符)
if(I > 0) {
if(strLine[I-1] != '\\') {
if(strLine[I] != '\\')
bIsInTheControlChar = FALSE;
else
bIsInTheControlChar = TRUE;
}
else {
if(strLine[I] == '\\') {
if(!bIsInTheControlChar)
bIsInTheControlChar = TRUE;
else
bIsInTheControlChar = FALSE;
}
}
}
}
int nlen;
for (int i = 0; i < g_nEndStringStrCount; i++ ) {
if(g_EndStringStr[i]==NULL)
continue;
nlen = strlen(g_EndStringStr[i]);
bMatch = TRUE;
//如果strLine的当前字符串值与结束定义字符规则中的一项相同则中止定义字符串
if (I >= nlen - 1)
{
for(int k=0; k<nlen; k++) { //向前搜索字符串检查是否与结束定义的字符串相同
if(strLine[I-nlen+1+k]!=g_EndStringStr[i][k]) {
bMatch = FALSE; //如果不匹配,中断比较
break;
}
}
if(bMatch && !bIsInTheControlChar) {
dwCookie &= ~COOKIE_STRING;
bRedefineBlock = TRUE;
goto cmpnextchar; //继续处理strLine的下一个字符
}
}
}
goto cmpnextchar; //如果没有结束定义字符串继续处理strLine的下一个字符
}
//如果当前正处于字符变量中,则应检查是否有结束字符变量的字符串
if (dwCookie & COOKIE_CHAR)
{
if(g_bControl) { //处理控制字符,至少C++会用到(例\"表示引号而不是两个字符)
if(I > 0) {
if(strLine[I-1] != '\\') {
if(strLine[I] != '\\')
bIsInTheControlChar = FALSE;
else
bIsInTheControlChar = TRUE;
}
else {
if(strLine[I] == '\\') {
if(!bIsInTheControlChar)
bIsInTheControlChar = TRUE;
else
bIsInTheControlChar = FALSE;
}
}
}
}
int nlen;
for (int i = 0; i < g_nEndCharStrCount; i++ ) {
if(g_EndCharStr[i]==NULL)
continue;
nlen = strlen(g_EndCharStr[i]);
bMatch = TRUE;
//如果strLine的当前字符值与结束定义字符规则中的一项相同则中止定义字符串
if (I >= nlen - 1)
{
for(int k=0; k<nlen; k++) { //向前搜索字符串检查是否与结束定义的字符相同
if(strLine[I-nlen+1+k]!=g_EndCharStr[i][k]) {
bMatch = FALSE; //如果不匹配,中断比较
break;
}
}
if(bMatch && !bIsInTheControlChar) {
dwCookie &= ~COOKIE_CHAR;
bRedefineBlock = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -