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

📄 syntax.cpp

📁 VC++设计语法编辑器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	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 + -