diff options
| -rw-r--r-- | doc/ScintillaHistory.html | 3 | ||||
| -rw-r--r-- | gtk/makefile | 2 | ||||
| -rw-r--r-- | gtk/scintilla.mak | 3 | ||||
| -rw-r--r-- | include/SciLexer.h | 16 | ||||
| -rw-r--r-- | include/Scintilla.iface | 19 | ||||
| -rw-r--r-- | macosx/makefile | 2 | ||||
| -rw-r--r-- | src/KeyWords.cxx | 1 | ||||
| -rw-r--r-- | src/LexSML.cxx | 222 | ||||
| -rw-r--r-- | vcbuild/SciLexer.dsp | 4 | ||||
| -rw-r--r-- | win32/makefile | 2 | ||||
| -rw-r--r-- | win32/scintilla.mak | 3 | ||||
| -rw-r--r-- | win32/scintilla_vc6.mak | 3 | 
12 files changed, 277 insertions, 3 deletions
| diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index 7d57921ec..9c3f53f9b 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -329,6 +329,9 @@  	<td>Sergey Kishchenko</td>  	<td>Kai Liu</td>  	<td>Andreas Rumpf</td> +	<td>James Moffatt</td> +      </tr><tr> +	<td>Yuzhou Xin</td>      </tr>      </table>      <p> diff --git a/gtk/makefile b/gtk/makefile index a22250976..d7c05a6f7 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -72,7 +72,7 @@ LexLout.o LexLua.o LexMagik.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o \  LexMSSQL.o LexMySQL.o LexNimrod.o LexNsis.o LexOpal.o LexOthers.o LexPascal.o \  LexPB.o LexPerl.o LexPLM.o LexPOV.o LexPowerPro.o LexPowerShell.o \  LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o LexRuby.o LexScriptol.o \ -LexSmalltalk.o LexSorcus.o LexSpecman.o LexSpice.o LexSQL.o LexTACL.o \ +LexSmalltalk.o LexSML.o LexSorcus.o LexSpecman.o LexSpice.o LexSQL.o LexTACL.o \  LexTADS3.o LexTAL.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o  #--Autogenerated -- end of automatically generated section diff --git a/gtk/scintilla.mak b/gtk/scintilla.mak index 88d795502..c4924ed6a 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -206,6 +206,7 @@ LEXOBJS=\  	$(DIR_O)\LexRuby.obj \  	$(DIR_O)\LexScriptol.obj \  	$(DIR_O)\LexSmalltalk.obj \ +	$(DIR_O)\LexSML.obj \  	$(DIR_O)\LexSorcus.obj \  	$(DIR_O)\LexSpecman.obj \  	$(DIR_O)\LexSpice.obj \ @@ -487,6 +488,8 @@ $(DIR_O)\LexScriptol.obj: ..\src\LexScriptol.cxx $(LEX_HEADERS)  $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS) +$(DIR_O)\LexSML.obj: ..\src\LexSML.cxx $(LEX_HEADERS) +  $(DIR_O)\LexSorcus.obj: ..\src\LexSorcus.cxx $(LEX_HEADERS)  $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index 3a06b0d5a..56c9cbdc5 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -109,6 +109,7 @@  #define SCLEX_SORCUS 94  #define SCLEX_POWERPRO 95  #define SCLEX_NIMROD 96 +#define SCLEX_SML 97  #define SCLEX_AUTOMATIC 1000  #define SCE_P_DEFAULT 0  #define SCE_P_COMMENTLINE 1 @@ -1320,6 +1321,21 @@  #define SCE_POWERPRO_VERBATIM 14  #define SCE_POWERPRO_ALTQUOTE 15  #define SCE_POWERPRO_FUNCTION 16 +#define SCE_SML_DEFAULT 0 +#define SCE_SML_IDENTIFIER 1 +#define SCE_SML_TAGNAME 2 +#define SCE_SML_KEYWORD 3 +#define SCE_SML_KEYWORD2 4 +#define SCE_SML_KEYWORD3 5 +#define SCE_SML_LINENUM 6 +#define SCE_SML_OPERATOR 7 +#define SCE_SML_NUMBER 8 +#define SCE_SML_CHAR 9 +#define SCE_SML_STRING 11 +#define SCE_SML_COMMENT 12 +#define SCE_SML_COMMENT1 13 +#define SCE_SML_COMMENT2 14 +#define SCE_SML_COMMENT3 15  #define SCLEX_ASP 29  #define SCLEX_PHP 30  /* --Autogenerated -- end of section automatically generated from Scintilla.iface */ diff --git a/include/Scintilla.iface b/include/Scintilla.iface index 638cb7700..f13c144a9 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -2021,6 +2021,7 @@ val SCLEX_TACL=93  val SCLEX_SORCUS=94  val SCLEX_POWERPRO=95  val SCLEX_NIMROD=96 +val SCLEX_SML=97  # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a  # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -3389,6 +3390,7 @@ val SCE_SORCUS_OPERATOR=7  val SCE_SORCUS_NUMBER=8  val SCE_SORCUS_CONSTANT=9  # Lexical state for SCLEX_POWERPRO +lex PowerPro=SCLEX_POWERPRO SCE_POWERPRO_  val SCE_POWERPRO_DEFAULT=0  val SCE_POWERPRO_COMMENTBLOCK=1  val SCE_POWERPRO_COMMENTLINE=2 @@ -3406,6 +3408,23 @@ val SCE_POWERPRO_STRINGEOL=13  val SCE_POWERPRO_VERBATIM=14  val SCE_POWERPRO_ALTQUOTE=15  val SCE_POWERPRO_FUNCTION=16 +# Lexical states for SCLEX_SML +lex SML=SCLEX_SML SCE_SML_ +val SCE_SML_DEFAULT=0 +val SCE_SML_IDENTIFIER=1 +val SCE_SML_TAGNAME=2 +val SCE_SML_KEYWORD=3 +val SCE_SML_KEYWORD2=4 +val SCE_SML_KEYWORD3=5 +val SCE_SML_LINENUM=6 +val SCE_SML_OPERATOR=7 +val SCE_SML_NUMBER=8 +val SCE_SML_CHAR=9 +val SCE_SML_STRING=11 +val SCE_SML_COMMENT=12 +val SCE_SML_COMMENT1=13 +val SCE_SML_COMMENT2=14 +val SCE_SML_COMMENT3=15  # Events diff --git a/macosx/makefile b/macosx/makefile index 2c9d13282..462326965 100644 --- a/macosx/makefile +++ b/macosx/makefile @@ -72,7 +72,7 @@ LexLout.o LexLua.o LexMagik.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o \  LexMSSQL.o LexMySQL.o LexNimrod.o LexNsis.o LexOpal.o LexOthers.o LexPascal.o \  LexPB.o LexPerl.o LexPLM.o LexPOV.o LexPowerPro.o LexPowerShell.o \  LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o LexRuby.o LexScriptol.o \ -LexSmalltalk.o LexSorcus.o LexSpecman.o LexSpice.o LexSQL.o LexTACL.o \ +LexSmalltalk.o LexSML.o LexSorcus.o LexSpecman.o LexSpice.o LexSQL.o LexTACL.o \  LexTADS3.o LexTAL.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o  #--Autogenerated -- end of automatically generated section diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 5c8b1625f..f02511e5e 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -221,6 +221,7 @@ int Scintilla_LinkLexers() {  	LINK_LEXER(lmRuby);  	LINK_LEXER(lmScriptol);  	LINK_LEXER(lmSmalltalk); +	LINK_LEXER(lmSML);  	LINK_LEXER(lmSorc);  	LINK_LEXER(lmSpecman);  	LINK_LEXER(lmSpice); diff --git a/src/LexSML.cxx b/src/LexSML.cxx new file mode 100644 index 000000000..dadfc0fb3 --- /dev/null +++ b/src/LexSML.cxx @@ -0,0 +1,222 @@ +// Scintilla source code edit control +/** @file LexSML.cxx + ** Lexer for SML. + **/ +// Copyright 2009 by James Moffatt and Yuzhou Xin +// The License.txt file describes the conditions under which this software may be distributed. + + +#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" + +inline int  issml(int c) {return isalnum(c) || c == '_';} +inline int issmlf(int c) {return isalpha(c) || c == '_';} +inline int issmld(int c) {return isdigit(c) || c == '_';} + + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +void ColouriseSMLDoc( +	unsigned int startPos, int length, +	int initStyle, +	WordList *keywordlists[], +	Accessor &styler) +{ +	StyleContext sc(startPos, length, initStyle, styler); +	int nesting = 0; +	if (sc.state < SCE_SML_STRING) +		sc.state = SCE_SML_DEFAULT; +	if (sc.state >= SCE_SML_COMMENT) +		nesting = (sc.state & 0x0f) - SCE_SML_COMMENT; + +	int chBase = 0, chToken = 0, chLit = 0; +	WordList& keywords  = *keywordlists[0]; +	WordList& keywords2 = *keywordlists[1]; +	WordList& keywords3 = *keywordlists[2]; +	const int useMagic = styler.GetPropertyInt("lexer.caml.magic", 0); + +	while (sc.More()) { +		int state2 = -1; +		int chColor = sc.currentPos - 1; +		bool advance = true; + +		switch (sc.state & 0x0f) { +		case SCE_SML_DEFAULT: +			chToken = sc.currentPos; +			if (issmlf(sc.ch)) +				state2 = SCE_SML_IDENTIFIER; +			else if (sc.Match('`') && issmlf(sc.chNext)) +				state2 = SCE_SML_TAGNAME; +			else if (sc.Match('#')&&isdigit(sc.chNext)) +					state2 = SCE_SML_LINENUM; +			else if (sc.Match('#','\"')){ +					state2 = SCE_SML_CHAR,chLit = 0; +					sc.Forward(); +					 +				} +			else if (isdigit(sc.ch)) { +				state2 = SCE_SML_NUMBER, chBase = 10; +				if (sc.Match('0') && strchr("xX", sc.chNext)) +					chBase = 16, sc.Forward();} +			else if (sc.Match('\"')&&sc.chPrev!='#') +				state2 = SCE_SML_STRING; +			else if (sc.Match('(', '*')){ +				state2 = SCE_SML_COMMENT, +					sc.ch = ' ', +					sc.Forward();} +			else if (strchr("!~" +					"=<>@^+-*/" +					"()[];,:.#", sc.ch)) +				state2 = SCE_SML_OPERATOR; +			break; + +		case SCE_SML_IDENTIFIER: +			if (!(issml(sc.ch) || sc.Match('\''))) { +				const int n = sc.currentPos - chToken; +				if (n < 24) { +					char t[24]; +					for (int i = -n; i < 0; i++) +						t[n + i] = static_cast<char>(sc.GetRelative(i)); +					t[n] = '\0'; +					if ((n == 1 && sc.chPrev == '_') || keywords.InList(t)) +						sc.ChangeState(SCE_SML_KEYWORD); +					else if (keywords2.InList(t)) +						sc.ChangeState(SCE_SML_KEYWORD2); +					else if (keywords3.InList(t)) +						sc.ChangeState(SCE_SML_KEYWORD3); +				} +				state2 = SCE_SML_DEFAULT, advance = false; +			} +			break; + +		case SCE_SML_TAGNAME: +			if (!(issml(sc.ch) || sc.Match('\''))) +				state2 = SCE_SML_DEFAULT, advance = false; +			break; + +		case SCE_SML_LINENUM: +			if (!isdigit(sc.ch)) +				state2 = SCE_SML_DEFAULT, advance = false; +			break; + +		case SCE_SML_OPERATOR: { +			const char* o = 0; +			if (issml(sc.ch) || isspace(sc.ch) +				|| (o = strchr(")]};,\'\"`#", sc.ch),o) +				|| !strchr("!$%&*+-./:<=>?@^|~", sc.ch)) { +				if (o && strchr(")]};,", sc.ch)) { +					if ((sc.Match(')') && sc.chPrev == '(') +						|| (sc.Match(']') && sc.chPrev == '[')) +						sc.ChangeState(SCE_SML_KEYWORD); +					chColor++; +				} else +					advance = false; +				state2 = SCE_SML_DEFAULT; +			} +			break; +		} + +		case SCE_SML_NUMBER: +			if (issmld(sc.ch) || IsADigit(sc.ch, chBase)) +				break; +			if ((sc.Match('l') || sc.Match('L') || sc.Match('n')) +				&& (issmld(sc.chPrev) || IsADigit(sc.chPrev, chBase))) +				break; +			if (chBase == 10) { +				if (sc.Match('.') && issmld(sc.chPrev)) +					break; +				if ((sc.Match('e') || sc.Match('E')) +					&& (issmld(sc.chPrev) || sc.chPrev == '.')) +					break; +				if ((sc.Match('+') || sc.Match('-')) +					&& (sc.chPrev == 'e' || sc.chPrev == 'E')) +					break; +			} +			state2 = SCE_SML_DEFAULT, advance = false; +			break; + +		case SCE_SML_CHAR: +			if (sc.Match('\\')) { +				chLit = 1; +				if (sc.chPrev == '\\') +					sc.ch = ' '; +			} else if ((sc.Match('\"') && sc.chPrev != '\\') || sc.atLineEnd) { +				state2 = SCE_SML_DEFAULT; +				chLit = 1; +				if (sc.Match('\"')) +					chColor++; +				else +					sc.ChangeState(SCE_SML_IDENTIFIER); +			} else if (chLit < 1 && sc.currentPos - chToken >= 3) +				sc.ChangeState(SCE_SML_IDENTIFIER), advance = false; +			break; + +		case SCE_SML_STRING: +			if (sc.Match('\\') && sc.chPrev == '\\') +				sc.ch = ' '; +			else if (sc.Match('\"') && sc.chPrev != '\\') +				state2 = SCE_SML_DEFAULT, chColor++; +			break; + +		case SCE_SML_COMMENT: +		case SCE_SML_COMMENT1: +		case SCE_SML_COMMENT2: +		case SCE_SML_COMMENT3: +			if (sc.Match('(', '*')) +				state2 = sc.state + 1, chToken = sc.currentPos, +					sc.ch = ' ', +					sc.Forward(), nesting++; +			else if (sc.Match(')') && sc.chPrev == '*') { +				if (nesting) +					state2 = (sc.state & 0x0f) - 1, chToken = 0, nesting--; +				else +					state2 = SCE_SML_DEFAULT; +				chColor++; +			} else if (useMagic && sc.currentPos - chToken == 4 +				&& sc.Match('c') && sc.chPrev == 'r' && sc.GetRelative(-2) == '@') +				sc.state |= 0x10; +			break; +		} + +		if (state2 >= 0) +			styler.ColourTo(chColor, sc.state), sc.ChangeState(state2); +		if (advance) +			sc.Forward(); +	} + +	sc.Complete(); +} + +void FoldSMLDoc( +	unsigned int startPos, int length, +	int initStyle, +	WordList *keywordlists[], +	Accessor &styler) +{ +	//supress "not used" warnings +	startPos || length || initStyle || keywordlists[0] || styler.Length(); +} + +static const char * const SMLWordListDesc[] = { +	"Keywords", +	"Keywords2", +	"Keywords3", +	0 +}; + +LexerModule lmSML(SCLEX_SML, ColouriseSMLDoc, "SML", FoldSMLDoc, SMLWordListDesc); + 	  	  diff --git a/vcbuild/SciLexer.dsp b/vcbuild/SciLexer.dsp index 7e0de8a66..3c12f40de 100644 --- a/vcbuild/SciLexer.dsp +++ b/vcbuild/SciLexer.dsp @@ -398,6 +398,10 @@ SOURCE=..\src\LexSmalltalk.cxx  # End Source File  # Begin Source File +SOURCE=..\src\LexSML.cxx +# End Source File +# Begin Source File +  SOURCE=..\src\LexSorcus.cxx  # End Source File  # Begin Source File diff --git a/win32/makefile b/win32/makefile index 697b3cdc5..986191e57 100644 --- a/win32/makefile +++ b/win32/makefile @@ -60,7 +60,7 @@ LexLout.o LexLua.o LexMagik.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o \  LexMSSQL.o LexMySQL.o LexNimrod.o LexNsis.o LexOpal.o LexOthers.o LexPascal.o \  LexPB.o LexPerl.o LexPLM.o LexPOV.o LexPowerPro.o LexPowerShell.o \  LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o LexRuby.o LexScriptol.o \ -LexSmalltalk.o LexSorcus.o LexSpecman.o LexSpice.o LexSQL.o LexTACL.o \ +LexSmalltalk.o LexSML.o LexSorcus.o LexSpecman.o LexSpice.o LexSQL.o LexTACL.o \  LexTADS3.o LexTAL.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o  #--Autogenerated -- end of automatically generated section diff --git a/win32/scintilla.mak b/win32/scintilla.mak index 7f4831452..d7ff22dd8 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -176,6 +176,7 @@ LEXOBJS=\  	$(DIR_O)\LexRuby.obj \  	$(DIR_O)\LexScriptol.obj \  	$(DIR_O)\LexSmalltalk.obj \ +	$(DIR_O)\LexSML.obj \  	$(DIR_O)\LexSorcus.obj \  	$(DIR_O)\LexSpecman.obj \  	$(DIR_O)\LexSpice.obj \ @@ -438,6 +439,8 @@ $(DIR_O)\LexScriptol.obj: ..\src\LexScriptol.cxx $(LEX_HEADERS)  $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS) +$(DIR_O)\LexSML.obj: ..\src\LexSML.cxx $(LEX_HEADERS) +  $(DIR_O)\LexSorcus.obj: ..\src\LexSorcus.cxx $(LEX_HEADERS)  $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index 29aba7347..1f24df3c8 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -178,6 +178,7 @@ LEXOBJS=\  	$(DIR_O)\LexRuby.obj \  	$(DIR_O)\LexScriptol.obj \  	$(DIR_O)\LexSmalltalk.obj \ +	$(DIR_O)\LexSML.obj \  	$(DIR_O)\LexSorcus.obj \  	$(DIR_O)\LexSpecman.obj \  	$(DIR_O)\LexSpice.obj \ @@ -440,6 +441,8 @@ $(DIR_O)\LexScriptol.obj: ..\src\LexScriptol.cxx $(LEX_HEADERS)  $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS) +$(DIR_O)\LexSML.obj: ..\src\LexSML.cxx $(LEX_HEADERS) +  $(DIR_O)\LexSorcus.obj: ..\src\LexSorcus.cxx $(LEX_HEADERS)  $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) | 
