diff options
author | nyamatongwe <unknown> | 2008-01-18 22:18:14 +0000 |
---|---|---|
committer | nyamatongwe <unknown> | 2008-01-18 22:18:14 +0000 |
commit | 88eb92f8de5e104a05ed9a056acaec8e6a15313c (patch) | |
tree | 6194c1dbc5d091edfc21c7f8dd834558f5099d36 | |
parent | 377ef4e77b5650130dadfc4a54877bd3ef556a3d (diff) | |
download | scintilla-mirror-88eb92f8de5e104a05ed9a056acaec8e6a15313c.tar.gz |
PowerShell lexer implemented by Tim Gerundt.
-rw-r--r-- | doc/ScintillaHistory.html | 1 | ||||
-rw-r--r-- | gtk/makefile | 6 | ||||
-rw-r--r-- | gtk/scintilla.mak | 3 | ||||
-rw-r--r-- | include/SciLexer.h | 12 | ||||
-rw-r--r-- | include/Scintilla.iface | 14 | ||||
-rw-r--r-- | macosx/makefile | 6 | ||||
-rw-r--r-- | src/KeyWords.cxx | 1 | ||||
-rw-r--r-- | src/LexPowerShell.cxx | 111 | ||||
-rw-r--r-- | vcbuild/SciLexer.dsp | 4 | ||||
-rw-r--r-- | win32/makefile | 6 | ||||
-rw-r--r-- | win32/scintilla.mak | 3 | ||||
-rw-r--r-- | win32/scintilla_vc6.mak | 3 |
12 files changed, 161 insertions, 9 deletions
diff --git a/doc/ScintillaHistory.html b/doc/ScintillaHistory.html index a2f4b5633..587987ce5 100644 --- a/doc/ScintillaHistory.html +++ b/doc/ScintillaHistory.html @@ -310,6 +310,7 @@ <td>Nick Treleaven</td> <td>Stephen Stagg</td> <td>Jean-Paul Iribarren</td> + <td>Tim Gerundt</td> </tr> </table> <p> diff --git a/gtk/makefile b/gtk/makefile index 74b3da5f7..c8bde8318 100644 --- a/gtk/makefile +++ b/gtk/makefile @@ -70,9 +70,9 @@ LexErlang.o LexEScript.o LexFlagship.o LexForth.o LexFortran.o LexGAP.o \ LexGui4Cli.o LexHaskell.o LexHTML.o LexInno.o LexKix.o LexLisp.o LexLout.o \ LexLua.o LexMagik.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o \ LexNsis.o LexOpal.o LexOthers.o LexPascal.o LexPB.o LexPerl.o LexPLM.o \ -LexPOV.o LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o LexRuby.o \ -LexScriptol.o LexSmalltalk.o LexSpecman.o LexSpice.o LexSQL.o LexTADS3.o \ -LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o +LexPOV.o LexPowerShell.o LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o \ +LexRuby.o LexScriptol.o LexSmalltalk.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 64b8c354b..94217bec9 100644 --- a/gtk/scintilla.mak +++ b/gtk/scintilla.mak @@ -193,6 +193,7 @@ LEXOBJS=\ $(DIR_O)\LexPerl.obj \ $(DIR_O)\LexPLM.obj \ $(DIR_O)\LexPOV.obj \ + $(DIR_O)\LexPowerShell.obj \ $(DIR_O)\LexProgress.obj \ $(DIR_O)\LexPS.obj \ $(DIR_O)\LexPython.obj \ @@ -453,6 +454,8 @@ $(DIR_O)\LexPLM.obj: ..\src\LexPLM.cxx $(LEX_HEADERS) $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexPowerShell.obj: ..\src\LexPowerShell.cxx $(LEX_HEADERS) + $(DIR_O)\LexProgress.obj: ..\src\LexProgress.cxx $(LEX_HEADERS) $(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) diff --git a/include/SciLexer.h b/include/SciLexer.h index 1325c6ea2..c5b2b6c88 100644 --- a/include/SciLexer.h +++ b/include/SciLexer.h @@ -100,6 +100,7 @@ #define SCLEX_ASYMPTOTE 85 #define SCLEX_R 86 #define SCLEX_MAGIK 87 +#define SCLEX_POWERSHELL 88 #define SCLEX_AUTOMATIC 1000 #define SCE_P_DEFAULT 0 #define SCE_P_COMMENTLINE 1 @@ -1221,6 +1222,17 @@ #define SCE_MAGIK_KEYWORD 13 #define SCE_MAGIK_PRAGMA 14 #define SCE_MAGIK_SYMBOL 15 +#define SCE_POWERSHELL_DEFAULT 0 +#define SCE_POWERSHELL_COMMENT 1 +#define SCE_POWERSHELL_STRING 2 +#define SCE_POWERSHELL_CHARACTER 3 +#define SCE_POWERSHELL_NUMBER 4 +#define SCE_POWERSHELL_VARIABLE 5 +#define SCE_POWERSHELL_OPERATOR 6 +#define SCE_POWERSHELL_IDENTIFIER 7 +#define SCE_POWERSHELL_KEYWORD 8 +#define SCE_POWERSHELL_CMDLET 9 +#define SCE_POWERSHELL_ALIAS 10 #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 d4e380526..f9e45d9e4 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1992,6 +1992,7 @@ val SCLEX_ABAQUS=84 val SCLEX_ASYMPTOTE=85 val SCLEX_R=86 val SCLEX_MAGIK=87 +val SCLEX_POWERSHELL=88 # When a lexer specifies its language as SCLEX_AUTOMATIC it receives a # value assigned in sequence from SCLEX_AUTOMATIC+1. @@ -3276,6 +3277,19 @@ val SCE_MAGIK_UNKNOWN_KEYWORD=12 val SCE_MAGIK_KEYWORD=13 val SCE_MAGIK_PRAGMA=14 val SCE_MAGIK_SYMBOL=15 +# Lexical state for SCLEX_POWERSHELL +lex PowerShell=SCLEX_POWERSHELL SCE_POWERSHELL_ +val SCE_POWERSHELL_DEFAULT=0 +val SCE_POWERSHELL_COMMENT=1 +val SCE_POWERSHELL_STRING=2 +val SCE_POWERSHELL_CHARACTER=3 +val SCE_POWERSHELL_NUMBER=4 +val SCE_POWERSHELL_VARIABLE=5 +val SCE_POWERSHELL_OPERATOR=6 +val SCE_POWERSHELL_IDENTIFIER=7 +val SCE_POWERSHELL_KEYWORD=8 +val SCE_POWERSHELL_CMDLET=9 +val SCE_POWERSHELL_ALIAS=10 # Events diff --git a/macosx/makefile b/macosx/makefile index 50df23095..7f19b4967 100644 --- a/macosx/makefile +++ b/macosx/makefile @@ -70,9 +70,9 @@ LexErlang.o LexEScript.o LexFlagship.o LexForth.o LexFortran.o LexGAP.o \ LexGui4Cli.o LexHaskell.o LexHTML.o LexInno.o LexKix.o LexLisp.o LexLout.o \ LexLua.o LexMagik.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o \ LexNsis.o LexOpal.o LexOthers.o LexPascal.o LexPB.o LexPerl.o LexPLM.o \ -LexPOV.o LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o LexRuby.o \ -LexScriptol.o LexSmalltalk.o LexSpecman.o LexSpice.o LexSQL.o LexTADS3.o \ -LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o +LexPOV.o LexPowerShell.o LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o \ +LexRuby.o LexScriptol.o LexSmalltalk.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 # The LEXOBJS have to be treated specially as the functions in them are not called from external code diff --git a/src/KeyWords.cxx b/src/KeyWords.cxx index 976b13fdf..49d17befa 100644 --- a/src/KeyWords.cxx +++ b/src/KeyWords.cxx @@ -205,6 +205,7 @@ int Scintilla_LinkLexers() { LINK_LEXER(lmPHPSCRIPT); LINK_LEXER(lmPLM); LINK_LEXER(lmPOV); + LINK_LEXER(lmPowerShell); LINK_LEXER(lmProgress); LINK_LEXER(lmProps); LINK_LEXER(lmPS); diff --git a/src/LexPowerShell.cxx b/src/LexPowerShell.cxx new file mode 100644 index 000000000..77d192f7a --- /dev/null +++ b/src/LexPowerShell.cxx @@ -0,0 +1,111 @@ +// Scintilla source code edit control +/** @file LexPowerShell.cxx + ** Lexer for PowerShell scripts. + **/ +// Copyright 2008 by Tim Gerundt <tim@gerundt.de> +// 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" + +#ifdef SCI_NAMESPACE +using namespace Scintilla; +#endif + +// Extended to accept accented characters +static inline bool IsAWordChar(int ch) { + return ch >= 0x80 || isalnum(ch) || ch == '-'; +} + +static void ColourisePowerShellDoc(unsigned int startPos, int length, int initStyle, + WordList *keywordlists[], Accessor &styler) { + + WordList &keywords = *keywordlists[0]; + WordList &keywords2 = *keywordlists[1]; + WordList &keywords3 = *keywordlists[2]; + + styler.StartAt(startPos); + + StyleContext sc(startPos, length, initStyle, styler); + + for (; sc.More(); sc.Forward()) { + + if (sc.state == SCE_POWERSHELL_COMMENT) { + if (sc.atLineEnd) { + sc.SetState(SCE_POWERSHELL_DEFAULT); + } + } else if (sc.state == SCE_POWERSHELL_STRING) { + // This is a doubles quotes string + if (sc.ch == '\"') { + sc.ForwardSetState(SCE_POWERSHELL_DEFAULT); + } + } else if (sc.state == SCE_POWERSHELL_CHARACTER) { + // This is a single quote string + if (sc.ch == '\'') { + sc.ForwardSetState(SCE_POWERSHELL_DEFAULT); + } + } else if (sc.state == SCE_POWERSHELL_NUMBER) { + if (!IsADigit(sc.ch)) { + sc.SetState(SCE_POWERSHELL_DEFAULT); + } + } else if (sc.state == SCE_POWERSHELL_VARIABLE) { + if (!IsAWordChar(sc.ch)) { + sc.SetState(SCE_POWERSHELL_DEFAULT); + } + } else if (sc.state == SCE_POWERSHELL_OPERATOR) { + if (!isoperator(static_cast<char>(sc.ch))) { + sc.SetState(SCE_POWERSHELL_DEFAULT); + } + } else if (sc.state == SCE_POWERSHELL_IDENTIFIER) { + if (!IsAWordChar(sc.ch)) { + char s[100]; + sc.GetCurrentLowered(s, sizeof(s)); + + if (keywords.InList(s)) { + sc.ChangeState(SCE_POWERSHELL_KEYWORD); + } else if (keywords2.InList(s)) { + sc.ChangeState(SCE_POWERSHELL_CMDLET); + } else if (keywords3.InList(s)) { + sc.ChangeState(SCE_POWERSHELL_ALIAS); + } + sc.SetState(SCE_POWERSHELL_DEFAULT); + } + } + + // Determine if a new state should be entered. + if (sc.state == SCE_POWERSHELL_DEFAULT) { + if (sc.ch == '#') { + sc.SetState(SCE_POWERSHELL_COMMENT); + } else if (sc.ch == '\"') { + sc.SetState(SCE_POWERSHELL_STRING); + } else if (sc.ch == '\'') { + sc.SetState(SCE_POWERSHELL_CHARACTER); + } else if (sc.ch == '$') { + sc.SetState(SCE_POWERSHELL_VARIABLE); + } else if (IsADigit(sc.ch) || (sc.ch == '.' && IsADigit(sc.chNext))) { + sc.SetState(SCE_POWERSHELL_NUMBER); + } else if (isoperator(static_cast<char>(sc.ch))) { + sc.SetState(SCE_POWERSHELL_OPERATOR); + } else if (IsAWordChar(sc.ch)) { + sc.SetState(SCE_POWERSHELL_IDENTIFIER); + } + } + } + sc.Complete(); +} + + +LexerModule lmPowerShell(SCLEX_POWERSHELL, ColourisePowerShellDoc, "powershell"); + diff --git a/vcbuild/SciLexer.dsp b/vcbuild/SciLexer.dsp index 3fcaeccc6..7a21c18f2 100644 --- a/vcbuild/SciLexer.dsp +++ b/vcbuild/SciLexer.dsp @@ -346,6 +346,10 @@ SOURCE=..\src\LexPOV.cxx # End Source File # Begin Source File +SOURCE=..\src\LexPowerShell.cxx +# End Source File +# Begin Source File + SOURCE=..\src\LexProgress.cxx # End Source File # Begin Source File diff --git a/win32/makefile b/win32/makefile index 3ab8557fc..b3823f9f9 100644 --- a/win32/makefile +++ b/win32/makefile @@ -58,9 +58,9 @@ LexErlang.o LexEScript.o LexFlagship.o LexForth.o LexFortran.o LexGAP.o \ LexGui4Cli.o LexHaskell.o LexHTML.o LexInno.o LexKix.o LexLisp.o LexLout.o \ LexLua.o LexMagik.o LexMatlab.o LexMetapost.o LexMMIXAL.o LexMPT.o LexMSSQL.o \ LexNsis.o LexOpal.o LexOthers.o LexPascal.o LexPB.o LexPerl.o LexPLM.o \ -LexPOV.o LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o LexRuby.o \ -LexScriptol.o LexSmalltalk.o LexSpecman.o LexSpice.o LexSQL.o LexTADS3.o \ -LexTCL.o LexTeX.o LexVB.o LexVerilog.o LexVHDL.o LexYAML.o +LexPOV.o LexPowerShell.o LexProgress.o LexPS.o LexPython.o LexR.o LexRebol.o \ +LexRuby.o LexScriptol.o LexSmalltalk.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 Decoration.o \ diff --git a/win32/scintilla.mak b/win32/scintilla.mak index bdfd8460e..468a62261 100644 --- a/win32/scintilla.mak +++ b/win32/scintilla.mak @@ -163,6 +163,7 @@ LEXOBJS=\ $(DIR_O)\LexPerl.obj \ $(DIR_O)\LexPLM.obj \ $(DIR_O)\LexPOV.obj \ + $(DIR_O)\LexPowerShell.obj \ $(DIR_O)\LexProgress.obj \ $(DIR_O)\LexPS.obj \ $(DIR_O)\LexPython.obj \ @@ -404,6 +405,8 @@ $(DIR_O)\LexPLM.obj: ..\src\LexPLM.cxx $(LEX_HEADERS) $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexPowerShell.obj: ..\src\LexPowerShell.cxx $(LEX_HEADERS) + $(DIR_O)\LexProgress.obj: ..\src\LexProgress.cxx $(LEX_HEADERS) $(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) diff --git a/win32/scintilla_vc6.mak b/win32/scintilla_vc6.mak index a013a2628..d77121dd9 100644 --- a/win32/scintilla_vc6.mak +++ b/win32/scintilla_vc6.mak @@ -165,6 +165,7 @@ LEXOBJS=\ $(DIR_O)\LexPerl.obj \ $(DIR_O)\LexPLM.obj \ $(DIR_O)\LexPOV.obj \ + $(DIR_O)\LexPowerShell.obj \ $(DIR_O)\LexProgress.obj \ $(DIR_O)\LexPS.obj \ $(DIR_O)\LexPython.obj \ @@ -406,6 +407,8 @@ $(DIR_O)\LexPLM.obj: ..\src\LexPLM.cxx $(LEX_HEADERS) $(DIR_O)\LexPOV.obj: ..\src\LexPOV.cxx $(LEX_HEADERS) +$(DIR_O)\LexPowerShell.obj: ..\src\LexPowerShell.cxx $(LEX_HEADERS) + $(DIR_O)\LexProgress.obj: ..\src\LexProgress.cxx $(LEX_HEADERS) $(DIR_O)\LexPS.obj: ..\src\LexPS.cxx $(LEX_HEADERS) |