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) |