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

📄 lexau3.cxx

📁 robocup rcssserver 运行防真机器人足球比赛所用的服务器端
💻 CXX
📖 第 1 页 / 共 2 页
字号:
// Scintilla source code edit control// @file LexAU3.cxx// Lexer for AutoIt3  http://www.hiddensoft.com/autoit3// by Jos van der Zande, jvdzande@yahoo.com //// Changes:// March 28, 2004 - Added the standard Folding code// April 21, 2004 - Added Preprosessor Table + Syntax Highlighting//                  Fixed Number highlighting//                  Changed default isoperator to IsAOperator to have a better match to AutoIt3//                  Fixed "#comments_start" -> "#comments-start"  //                  Fixed "#comments_end" -> "#comments-end"  //                  Fixed Sendkeys in Strings when not terminated with }//                  Added support for Sendkey strings that have second parameter e.g. {UP 5} or {a down}// April 26, 2004 - Fixed # pre-processor statement inside of comment block would invalidly change the color.//                  Added logic for #include <xyz.au3> to treat the <> as string//                  Added underscore to IsAOperator.// May 17, 2004   - Changed the folding logic from indent to keyword folding.//                  Added Folding logic for blocks of single-commentlines or commentblock.//                        triggered by: fold.comment=1//                  Added Folding logic for preprocessor blocks triggered by fold.preprocessor=1//                  Added Special for #region - #endregion syntax highlight and folding.// May 30, 2004   - Fixed issue with continuation lines on If statements.// June 5, 2004   - Added comma to Operators for better readability.//                  Added fold.compact support set with fold.compact=1//                  Changed folding inside of #cs-#ce. Default is no keyword folding inside comment blocks when fold.comment=1//                        it will now only happen when fold.comment=2.// Sep 5, 2004    - Added logic to handle colourizing words on the last line. //                        Typed Characters now show as "default" till they match any table.// Oct 10, 2004   - Added logic to show Comments in "Special" directives. // Nov  1, 2004   - Added better testing for Numbers supporting x and e notation.// Nov 28, 2004   - Added logic to handle continuation lines for syntax highlighting.// Jan 10, 2005   - Added Abbreviations Keyword used for expansion// Mar 24, 2005   - Updated Abbreviations Keywords to fix when followed by Operator.// Apr 18, 2005   - Updated #CE/#Comment-End logic to take a linecomment ";" into account//                - Added folding support for With...EndWith//                - Added support for a DOT in variable names//                - Fixed Underscore in CommentBlock// May 23, 2005   - Fixed the SentKey lexing in case of a missing }// Aug 11, 2005   - Fixed possible bug with s_save length > 100.// Aug 23, 2005   - Added Switch/endswitch support to the folding logic.// Sep 27, 2005   - Fixed the SentKey lexing logic in case of multiple sentkeys.// Mar 12, 2006   - Fixed issue with <> coloring as String in stead of Operator in rare occasions.// Apr  8, 2006   - Added support for AutoIt3 Standard UDF library (SCE_AU3_UDF)//// Copyright for Scintilla: 1998-2001 by Neil Hodgson <neilh@scintilla.org>// The License.txt file describes the conditions under which this software may be distributed.// Scintilla source code edit control#include <stdlib.h>#include <string.h>#include <ctype.h>#include <stdio.h>#include <stdarg.h>#include "Platform.h"#include "PropSet.h"#include "Accessor.h"#include "StyleContext.h"#include "KeyWords.h"#include "Scintilla.h"#include "SciLexer.h"static inline bool IsTypeCharacter(const int ch){    return ch == '$';}static inline bool IsAWordChar(const int ch){    return (ch < 0x80) && (isalnum(ch) || ch == '_');}static inline bool IsAWordStart(const int ch){    return (ch < 0x80) && (isalnum(ch) || ch == '_' || ch == '@' || ch == '#' || ch == '$' || ch == '.');}static inline bool IsAOperator(char ch) {	if (isascii(ch) && isalnum(ch))		return false;	if (ch == '+' || ch == '-' || ch == '*' || ch == '/' ||	    ch == '&' || ch == '^' || ch == '=' || ch == '<' || ch == '>' ||	    ch == '(' || ch == ')' || ch == '[' || ch == ']' || ch == ',' )		return true;	return false;}///////////////////////////////////////////////////////////////////////////////// GetSendKey() filters the portion before and after a/multiple space(s)// and return the first portion to be looked-up in the table// also check if the second portion is valid... (up,down.on.off,toggle or a number)///////////////////////////////////////////////////////////////////////////////static int GetSendKey(const char *szLine, char *szKey){	int		nFlag	= 0;	int		nStartFound	= 0;	int		nKeyPos	= 0;	int		nSpecPos= 0;	int		nSpecNum= 1;	int		nPos	= 0;	char	cTemp;	char	szSpecial[100];	// split the portion of the sendkey in the part before and after the spaces	while ( ( (cTemp = szLine[nPos]) != '\0'))	{		// skip leading Ctrl/Shift/Alt state		if (cTemp == '{') {			nStartFound = 1;		}		//		if (nStartFound == 1) {			if ((cTemp == ' ') && (nFlag == 0) ) // get the stuff till first space			{				nFlag = 1;				// Add } to the end of the first bit for table lookup later.				szKey[nKeyPos++] = '}';			}			else if (cTemp == ' ')			{				// skip other spaces 			}			else if (nFlag == 0)			{				// save first portion into var till space or } is hit				szKey[nKeyPos++] = cTemp;			}			else if ((nFlag == 1) && (cTemp != '}'))			{				// Save second portion into var...				szSpecial[nSpecPos++] = cTemp;				// check if Second portion is all numbers for repeat fuction				if (isdigit(cTemp) == false) {nSpecNum = 0;} 			}		}		nPos++;									// skip to next char	} // End While	// Check if the second portion is either a number or one of these keywords	szKey[nKeyPos] = '\0';	szSpecial[nSpecPos] = '\0';	if (strcmp(szSpecial,"down")== 0    || strcmp(szSpecial,"up")== 0  ||		strcmp(szSpecial,"on")== 0      || strcmp(szSpecial,"off")== 0 || 		strcmp(szSpecial,"toggle")== 0  || nSpecNum == 1 )	{		nFlag = 0;	}	else	{		nFlag = 1;	}	return nFlag;  // 1 is bad, 0 is good } // GetSendKey() //// Routine to check the last "none comment" character on a line to see if its a continuation// static bool IsContinuationLine(unsigned int szLine, Accessor &styler){	int nsPos = styler.LineStart(szLine);	int nePos = styler.LineStart(szLine+1) - 2;	//int stylech = styler.StyleAt(nsPos);	while (nsPos < nePos)	{		//stylech = styler.StyleAt(nePos);		int stylech = styler.StyleAt(nsPos);		if (!(stylech == SCE_AU3_COMMENT)) {			char ch = styler.SafeGetCharAt(nePos);			if (!isspacechar(ch)) {				if (ch == '_')					return true;				else					return false;			}		}		nePos--; // skip to next char	} // End While	return false;} // IsContinuationLine()//// syntax highlighting logicstatic void ColouriseAU3Doc(unsigned int startPos, 							int length, int initStyle,							WordList *keywordlists[],							Accessor &styler) {    WordList &keywords = *keywordlists[0];    WordList &keywords2 = *keywordlists[1];    WordList &keywords3 = *keywordlists[2];    WordList &keywords4 = *keywordlists[3];    WordList &keywords5 = *keywordlists[4];    WordList &keywords6 = *keywordlists[5];    WordList &keywords7 = *keywordlists[6];    WordList &keywords8 = *keywordlists[7];	// find the first previous line without continuation character at the end	int lineCurrent = styler.GetLine(startPos);	int s_startPos = startPos;	// When not inside a Block comment: find First line without _	if (!(initStyle==SCE_AU3_COMMENTBLOCK)) {		while ((lineCurrent > 0 && IsContinuationLine(lineCurrent,styler)) ||			   (lineCurrent > 1 && IsContinuationLine(lineCurrent-1,styler))) {			lineCurrent--;			startPos = styler.LineStart(lineCurrent); // get start position			initStyle =  0;                           // reset the start style to 0 		}	}	// Set the new length to include it from the start and set the start position	length = length + s_startPos - startPos;      // correct the total length to process    styler.StartAt(startPos);	    StyleContext sc(startPos, length, initStyle, styler);	char si;     // string indicator "=1 '=2	char ni;     // Numeric indicator error=9 normal=0 normal+dec=1 hex=2 Enot=3	char ci;     // comment indicator 0=not linecomment(;) 	char s_save[100];	si=0;  	ni=0;	ci=0;	//$$$    for (; sc.More(); sc.Forward()) {		char s[100];		sc.GetCurrentLowered(s, sizeof(s));		// **********************************************		// save the total current word for eof processing 		if (IsAWordChar(sc.ch) || sc.ch == '}') 		{			strcpy(s_save,s);			int tp = strlen(s_save);			if (tp < 99) {				s_save[tp] = static_cast<char>(tolower(sc.ch));				s_save[tp+1] = '\0';			}		}		// **********************************************		//		switch (sc.state)        {            case SCE_AU3_COMMENTBLOCK:            {				//Reset at line end				if (sc.atLineEnd) {					ci=0;					sc.SetState(SCE_AU3_COMMENTBLOCK);				}				//skip rest of line when a ; is encountered				if (sc.chPrev == ';') {					ci=2;					sc.SetState(SCE_AU3_COMMENTBLOCK);				}				// skip rest of the line				if (ci==2) 					break;				// check when first character is detected on the line 				if (ci==0) {					if (IsAWordStart(static_cast<char>(sc.ch)) || IsAOperator(static_cast<char>(sc.ch))) {						ci=1;						sc.SetState(SCE_AU3_COMMENTBLOCK);					}					break;				}				if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && strcmp(s, "#comments") == 0))) {					if ((strcmp(s, "#ce")== 0 || strcmp(s, "#comments-end")== 0)) 						sc.SetState(SCE_AU3_COMMENT);  // set to comment line for the rest of the line					else						ci=2;  // line doesn't begin with #CE so skip the rest of the line				}                break;			}            case SCE_AU3_COMMENT:            {                if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}                break;            }            case SCE_AU3_OPERATOR:            {                // check if its a COMobject 				if (sc.chPrev == '.' && IsAWordChar(sc.ch)) {					sc.SetState(SCE_AU3_COMOBJ);				}					else {					sc.SetState(SCE_AU3_DEFAULT);				}                break;            }            case SCE_AU3_SPECIAL:            {                if (sc.ch == ';') {sc.SetState(SCE_AU3_COMMENT);}				if (sc.atLineEnd) {sc.SetState(SCE_AU3_DEFAULT);}                break;            }            case SCE_AU3_KEYWORD:            {                if (!(IsAWordChar(sc.ch) || (sc.ch == '-' && (strcmp(s, "#comments") == 0 || strcmp(s, "#include") == 0))))                {                    if (!IsTypeCharacter(sc.ch))                    {						if (strcmp(s, "#cs")== 0 || strcmp(s, "#comments-start")== 0 )						{							sc.ChangeState(SCE_AU3_COMMENTBLOCK);							sc.SetState(SCE_AU3_COMMENTBLOCK);						}						else if (keywords.InList(s)) {							sc.ChangeState(SCE_AU3_KEYWORD);							sc.SetState(SCE_AU3_DEFAULT);						}						else if (keywords2.InList(s)) {							sc.ChangeState(SCE_AU3_FUNCTION);							sc.SetState(SCE_AU3_DEFAULT);						}						else if (keywords3.InList(s)) {							sc.ChangeState(SCE_AU3_MACRO);							sc.SetState(SCE_AU3_DEFAULT);						}						else if (keywords5.InList(s)) {							sc.ChangeState(SCE_AU3_PREPROCESSOR);							sc.SetState(SCE_AU3_DEFAULT);							if (strcmp(s, "#include")== 0)							{								si = 3;   // use to determine string start for #inlude <>							}						}						else if (keywords6.InList(s)) {							sc.ChangeState(SCE_AU3_SPECIAL);							sc.SetState(SCE_AU3_SPECIAL);						}						else if ((keywords7.InList(s)) && (!IsAOperator(static_cast<char>(sc.ch)))) {							sc.ChangeState(SCE_AU3_EXPAND);							sc.SetState(SCE_AU3_DEFAULT);						}						else if (keywords8.InList(s)) {							sc.ChangeState(SCE_AU3_UDF);							sc.SetState(SCE_AU3_DEFAULT);						}						else if (strcmp(s, "_") == 0) {							sc.ChangeState(SCE_AU3_OPERATOR);							sc.SetState(SCE_AU3_DEFAULT);						}						else if (!IsAWordChar(sc.ch)) {							sc.ChangeState(SCE_AU3_DEFAULT);							sc.SetState(SCE_AU3_DEFAULT);						}					}				}	                if (sc.atLineEnd) {					sc.SetState(SCE_AU3_DEFAULT);}                break;            }			case SCE_AU3_NUMBER:            {				// Numeric indicator error=9 normal=0 normal+dec=1 hex=2 E-not=3				//				// test for Hex notation				if (strcmp(s, "0") == 0 && (sc.ch == 'x' || sc.ch == 'X') && ni == 0)				{					ni = 2;					break;				}				// test for E notation				if (IsADigit(sc.chPrev) && (sc.ch == 'e' || sc.ch == 'E') && ni <= 1)				{					ni = 3;					break;				}				//  Allow Hex characters inside hex numeric strings				if ((ni == 2) &&					(sc.ch == 'a' || sc.ch == 'b' || sc.ch == 'c' || sc.ch == 'd' || sc.ch == 'e' || sc.ch == 'f' ||					 sc.ch == 'A' || sc.ch == 'B' || sc.ch == 'C' || sc.ch == 'D' || sc.ch == 'E' || sc.ch == 'F' ))				{					break;				}				// test for 1 dec point only				if (sc.ch == '.')				{					if (ni==0)					{						ni=1;					}					else					{						ni=9;					}					break;				}				// end of numeric string ?				if (!(IsADigit(sc.ch)))				{					if (ni==9)					{						sc.ChangeState(SCE_AU3_DEFAULT);					}					sc.SetState(SCE_AU3_DEFAULT);				}				break;			}			case SCE_AU3_VARIABLE:			{				// Check if its a COMObject				if (sc.ch == '.' && !IsADigit(sc.chNext)) {					sc.SetState(SCE_AU3_OPERATOR);				}				else if (!IsAWordChar(sc.ch)) {					sc.SetState(SCE_AU3_DEFAULT);				}				break;            }			case SCE_AU3_COMOBJ:			{				if (!(IsAWordChar(sc.ch))) {					sc.SetState(SCE_AU3_DEFAULT);				}				break;            }            case SCE_AU3_STRING:            {				// check for " to end a double qouted string or				// check for ' to end a single qouted string 	            if ((si == 1 && sc.ch == '\"') || (si == 2 && sc.ch == '\'') || (si == 3 && sc.ch == '>'))				{					sc.ForwardSetState(SCE_AU3_DEFAULT);					si=0;				}                if (sc.atLineEnd)				{					si=0;					// at line end and not found a continuation char then reset to default					int lineCurrent = styler.GetLine(sc.currentPos);					if (!IsContinuationLine(lineCurrent,styler)) 					{						sc.SetState(SCE_AU3_DEFAULT);					}				}				// find Sendkeys in a STRING				if (sc.ch == '{' || sc.ch == '+' || sc.ch == '!' || sc.ch == '^' || sc.ch == '#' ) {					sc.SetState(SCE_AU3_SENT);}				break;            }                        case SCE_AU3_SENT:            {				// Send key string ended 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -