diff options
author | nyamatongwe <unknown> | 2006-03-30 06:30:46 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2006-03-30 06:30:46 +0000 |
commit | f9b6945bdcc7767d575e4422070de19b9e4df97c (patch) | |
tree | 103840b70f4e5580b2aa8e01b921239fd290114f | |
parent | 4f2ccd7c957737459b74ced538a6810623c8ec86 (diff) | |
download | scintilla-mirror-f9b6945bdcc7767d575e4422070de19b9e4df97c.tar.gz |
Support for Spice language added by Fabien Proriol.
-rw-r--r-- | doc/ScintillaHistory.html | 1 | ||||
-rw-r--r-- | gtk/makefile | 4 | ||||
-rw-r--r-- | gtk/scintilla.mak | 3 | ||||
-rw-r--r-- | include/SciLexer.h | 10 | ||||
-rw-r--r-- | include/Scintilla.iface | 12 | ||||
-rw-r--r-- | src/KeyWords.cxx | 1 | ||||
-rw-r--r-- | src/LexSpice.cxx | 221 | ||||
-rw-r--r-- | win32/makefile | 4 | ||||
-rw-r--r-- | win32/scintilla.mak | 3 | ||||
-rw-r--r-- | win32/scintilla_vc6.mak | 3 |
10 files changed, 258 insertions, 4 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index f94f64405..e7d7356a5 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -218,6 +218,7 @@ <li>Andre Arpin</li> <li>Stanislav Maslovski</li> <li>Martin Stone</li> + <li>Fabien Proriol</li> </ul> <p> Images used in GTK+ version diff --git a/gtk/makefile b/gtk/makefile index 4cc684c10..d88a4e33b 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -70,8 +70,8 @@ LexForth.o LexFortran.o LexGui4Cli.o LexHaskell.o LexHTML.o LexInno.o LexKix.o \ LexLisp.o LexLout.o LexLua.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o \ LexMSSQL.o LexNsis.o LexOpal.o LexOthers.o LexPascal.o LexPB.o LexPerl.o \ LexPOV.o LexPS.o LexPython.o LexRebol.o LexRuby.o LexScriptol.o LexSmalltalk.o \ -LexSpecman.o LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o \ -LexVHDL.o LexYAML.o +LexSpecman.o LexSpice.o LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o \ +LexVerilog.o LexVHDL.o LexYAML.o #--Autogenerated -- end of automatically generated section all: $(COMPLIB) diff --git a/gtk/scintilla.mak b/gtk/scintilla.mak index 51521a7cf..ad2d3fc4e 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -190,6 +190,7 @@ LEXOBJS=\ $(DIR_O)\LexScriptol.obj \ $(DIR_O)\LexSmalltalk.obj \ $(DIR_O)\LexSpecman.obj \ + $(DIR_O)\LexSpice.obj \ $(DIR_O)\LexSQL.obj \ $(DIR_O)\LexTADS3.obj \ $(DIR_O)\LexTCL.obj \ @@ -418,6 +419,8 @@ $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS) $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) +$(DIR_O)\LexSpice.obj: ..\src\LexSpice.cxx $(LEX_HEADERS) + $(DIR_O)\LexSQL.obj: ..\src\LexSQL.cxx $(LEX_HEADERS) $(DIR_O)\LexTADS3.obj: ..\src\LexTADS3.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index 8d38c2cac..b2a07127b 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -90,6 +90,7 @@ #define SCLEX_FREEBASIC 75 #define SCLEX_INNOSETUP 76 #define SCLEX_OPAL 77 +#define SCLEX_SPICE 78 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -1056,6 +1057,15 @@ #define SCE_OPAL_PAR 7 #define SCE_OPAL_BOOL_CONST 8 #define SCE_OPAL_DEFAULT 32 +#define SCE_SPICE_DEFAULT 0 +#define SCE_SPICE_IDENTIFIER 1 +#define SCE_SPICE_KEYWORD 2 +#define SCE_SPICE_KEYWORD2 3 +#define SCE_SPICE_KEYWORD3 4 +#define SCE_SPICE_NUMBER 5 +#define SCE_SPICE_DELIMITER 6 +#define SCE_SPICE_VALUE 7 +#define SCE_SPICE_COMMENTLINE 8 #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 5f2f2ab5a..19fb36a68 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1835,6 +1835,7 @@ val SCLEX_CSOUND=74 val SCLEX_FREEBASIC=75 val SCLEX_INNOSETUP=76 val SCLEX_OPAL=77 +val SCLEX_SPICE=78 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -2944,6 +2945,17 @@ val SCE_OPAL_STRING=6 val SCE_OPAL_PAR=7 val SCE_OPAL_BOOL_CONST=8 val SCE_OPAL_DEFAULT=32 +# Lexical states for SCLEX_SPICE +lex Spice=SCLEX_SPICE SCE_SPICE_ +val SCE_SPICE_DEFAULT=0 +val SCE_SPICE_IDENTIFIER=1 +val SCE_SPICE_KEYWORD=2 +val SCE_SPICE_KEYWORD2=3 +val SCE_SPICE_KEYWORD3=4 +val SCE_SPICE_NUMBER=5 +val SCE_SPICE_DELIMITER=6 +val SCE_SPICE_VALUE=7 +val SCE_SPICE_COMMENTLINE=8 # Events diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 322a8d84c..f82eb7df6 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -203,6 +203,7 @@ int Scintilla_LinkLexers() { LINK_LEXER(lmScriptol); LINK_LEXER(lmSmalltalk); LINK_LEXER(lmSpecman); + LINK_LEXER(lmSpice); LINK_LEXER(lmSQL); LINK_LEXER(lmTADS3); LINK_LEXER(lmTCL); diff --git a/src/LexSpice.cxx b/src/LexSpice.cxx new file mode 100644 index 000000000..819fa75af --- /dev/null +++ b/src/LexSpice.cxx @@ -0,0 +1,221 @@ +// Scintilla source code edit control +/** @file LexSpice.cxx + ** Lexer for Spice + **/ +// Copyright 2006 by Fabien Proriol <proriol.fabien.dev@saint-pal.com> +// The License.txt file describes the conditions under which this software may be distributed. + +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#include <stdio.h> + +#include "Platform.h" + +#include "Accessor.h" +#include "StyleContext.h" +#include "PropSet.h" +#include "KeyWords.h" +#include "SciLexer.h" +#include "SString.h" + +/* + * Interface + */ + +static void ColouriseDocument( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler); + +static const char * const spiceWordListDesc[] = { + "Keywords", // SPICE command + "Keywords2", // SPICE functions + "Keywords3", // SPICE params + 0 +}; + +LexerModule lmSpice(SCLEX_SPICE, ColouriseDocument, "spice", NULL, spiceWordListDesc); + +/* + * Implementation + */ + +static void ColouriseComment(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWhiteSpace(StyleContext& sc, bool& apostropheStartsAttribute); +static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute); + +static inline bool IsDelimiterCharacter(int ch); +static inline bool IsNumberStartCharacter(int ch); +static inline bool IsNumberCharacter(int ch); +static inline bool IsSeparatorOrDelimiterCharacter(int ch); +static inline bool IsWordStartCharacter(int ch); +static inline bool IsWordCharacter(int ch); + +static void ColouriseComment(StyleContext& sc, bool&) { + sc.SetState(SCE_SPICE_COMMENTLINE); + while (!sc.atLineEnd) { + sc.Forward(); + } +} + +static void ColouriseDelimiter(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = sc.Match (')'); + sc.SetState(SCE_SPICE_DELIMITER); + sc.ForwardSetState(SCE_SPICE_DEFAULT); +} + +static void ColouriseNumber(StyleContext& sc, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + SString number; + sc.SetState(SCE_SPICE_NUMBER); + // Get all characters up to a delimiter or a separator, including points, but excluding + // double points (ranges). + while (!IsSeparatorOrDelimiterCharacter(sc.ch) || (sc.ch == '.' && sc.chNext != '.')) { + number += static_cast<char>(sc.ch); + sc.Forward(); + } + // Special case: exponent with sign + if ((sc.chPrev == 'e' || sc.chPrev == 'E') && + (sc.ch == '+' || sc.ch == '-')) { + number += static_cast<char>(sc.ch); + sc.Forward (); + while (!IsSeparatorOrDelimiterCharacter(sc.ch)) { + number += static_cast<char>(sc.ch); + sc.Forward(); + } + } + sc.SetState(SCE_SPICE_DEFAULT); +} + +static void ColouriseWhiteSpace(StyleContext& sc, bool& ) { + sc.SetState(SCE_SPICE_DEFAULT); + sc.ForwardSetState(SCE_SPICE_DEFAULT); +} + +static void ColouriseWord(StyleContext& sc, WordList& keywords, WordList& keywords2, WordList& keywords3, bool& apostropheStartsAttribute) { + apostropheStartsAttribute = true; + sc.SetState(SCE_SPICE_IDENTIFIER); + SString word; + while (!sc.atLineEnd && !IsSeparatorOrDelimiterCharacter(sc.ch)) { + word += static_cast<char>(tolower(sc.ch)); + sc.Forward(); + } + if (keywords.InList(word.c_str())) { + sc.ChangeState(SCE_SPICE_KEYWORD); + if (word != "all") { + apostropheStartsAttribute = false; + } + } + else if (keywords2.InList(word.c_str())) { + sc.ChangeState(SCE_SPICE_KEYWORD2); + if (word != "all") { + apostropheStartsAttribute = false; + } + } + else if (keywords3.InList(word.c_str())) { + sc.ChangeState(SCE_SPICE_KEYWORD3); + if (word != "all") { + apostropheStartsAttribute = false; + } + } + sc.SetState(SCE_SPICE_DEFAULT); +} + +// +// ColouriseDocument +// +static void ColouriseDocument( + unsigned int startPos, + int length, + int initStyle, + WordList *keywordlists[], + Accessor &styler) { + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + StyleContext sc(startPos, length, initStyle, styler); + int lineCurrent = styler.GetLine(startPos); + bool apostropheStartsAttribute = (styler.GetLineState(lineCurrent) & 1) != 0; + while (sc.More()) { + if (sc.atLineEnd) { + // Go to the next line + sc.Forward(); + lineCurrent++; + // Remember the line state for future incremental lexing + styler.SetLineState(lineCurrent, apostropheStartsAttribute); + // Don't continue any styles on the next line + sc.SetState(SCE_SPICE_DEFAULT); + } + // Comments + if ((sc.Match('*') && sc.atLineStart) || sc.Match('*','~')) { + ColouriseComment(sc, apostropheStartsAttribute); + // Whitespace + } else if (IsASpace(sc.ch)) { + ColouriseWhiteSpace(sc, apostropheStartsAttribute); + // Delimiters + } else if (IsDelimiterCharacter(sc.ch)) { + ColouriseDelimiter(sc, apostropheStartsAttribute); + // Numbers + } else if (IsADigit(sc.ch) || sc.ch == '#') { + ColouriseNumber(sc, apostropheStartsAttribute); + // Keywords or identifiers + } else { + ColouriseWord(sc, keywords, keywords2, keywords3, apostropheStartsAttribute); + } + } + sc.Complete(); +} + +static inline bool IsDelimiterCharacter(int ch) { + switch (ch) { + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ':': + case ';': + case '<': + case '=': + case '>': + case '|': + return true; + default: + return false; + } +} + +static inline bool IsNumberCharacter(int ch) { + return IsNumberStartCharacter(ch) || + ch == '_' || + ch == '.' || + ch == '#' || + (ch >= 'a' && ch <= 'f') || + (ch >= 'A' && ch <= 'F'); +} + +static inline bool IsNumberStartCharacter(int ch) { + return IsADigit(ch); +} + +static inline bool IsSeparatorOrDelimiterCharacter(int ch) { + return IsASpace(ch) || IsDelimiterCharacter(ch); +} + +static inline bool IsWordCharacter(int ch) { + return IsWordStartCharacter(ch) || IsADigit(ch); +} + +static inline bool IsWordStartCharacter(int ch) { + return (isascii(ch) && isalpha(ch)) || ch == '_'; +} diff --git a/win32/makefile b/win32/makefile index 6891b718a..203102312 100644 --- a/win32/makefile +++ b/win32/makefile @@ -58,8 +58,8 @@ LexForth.o LexFortran.o LexGui4Cli.o LexHaskell.o LexHTML.o LexInno.o LexKix.o \ LexLisp.o LexLout.o LexLua.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o \ LexMSSQL.o LexNsis.o LexOpal.o LexOthers.o LexPascal.o LexPB.o LexPerl.o \ LexPOV.o LexPS.o LexPython.o LexRebol.o LexRuby.o LexScriptol.o LexSmalltalk.o \ -LexSpecman.o LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o LexVerilog.o \ -LexVHDL.o LexYAML.o +LexSpecman.o LexSpice.o LexSQL.o LexTADS3.o LexTCL.o LexTeX.o LexVB.o \ +LexVerilog.o LexVHDL.o LexYAML.o #--Autogenerated -- end of automatically generated section SOBJS = ScintillaWin.o ScintillaBase.o Editor.o CharClassify.o Document.o \ diff --git a/win32/scintilla.mak b/win32/scintilla.mak index a24fb56c1..a27063038 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -160,6 +160,7 @@ LEXOBJS=\ $(DIR_O)\LexScriptol.obj \ $(DIR_O)\LexSmalltalk.obj \ $(DIR_O)\LexSpecman.obj \ + $(DIR_O)\LexSpice.obj \ $(DIR_O)\LexSQL.obj \ $(DIR_O)\LexTADS3.obj \ $(DIR_O)\LexTCL.obj \ @@ -379,6 +380,8 @@ $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS) $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) +$(DIR_O)\LexSpice.obj: ..\src\LexSpice.cxx $(LEX_HEADERS) + $(DIR_O)\LexSQL.obj: ..\src\LexSQL.cxx $(LEX_HEADERS) $(DIR_O)\LexTADS3.obj: ..\src\LexTADS3.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index f43093437..5741f8105 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -161,6 +161,7 @@ LEXOBJS=\ $(DIR_O)\LexScriptol.obj \ $(DIR_O)\LexSmalltalk.obj \ $(DIR_O)\LexSpecman.obj \ + $(DIR_O)\LexSpice.obj \ $(DIR_O)\LexSQL.obj \ $(DIR_O)\LexTADS3.obj \ $(DIR_O)\LexTCL.obj \ @@ -378,6 +379,8 @@ $(DIR_O)\LexSmalltalk.obj: ..\src\LexSmalltalk.cxx $(LEX_HEADERS) $(DIR_O)\LexSpecman.obj: ..\src\LexSpecman.cxx $(LEX_HEADERS) +$(DIR_O)\LexSpice.obj: ..\src\LexSpice.cxx $(LEX_HEADERS) + $(DIR_O)\LexSQL.obj: ..\src\LexSQL.cxx $(LEX_HEADERS) $(DIR_O)\LexTADS3.obj: ..\src\LexTADS3.cxx $(LEX_HEADERS) |