1 // Scintilla source code edit control
3 ** Lexer for KIX-Scripts.
5 // Copyright 2004 by Manfred Becker <manfred@becker-trdf.de>
6 // The License.txt file describes the conditions under which this software may be distributed.
7 // Edited by Lee Wilmott (24-Jun-2014) added support for block comments
17 #include "Scintilla.h"
21 #include "LexAccessor.h"
23 #include "StyleContext.h"
24 #include "CharacterSet.h"
25 #include "LexerModule.h"
27 using namespace Scintilla
;
29 // Extended to accept accented characters
30 static inline bool IsAWordChar(int ch
) {
31 return ch
>= 0x80 || isalnum(ch
) || ch
== '_';
34 static inline bool IsOperator(const int ch
) {
35 return (ch
== '+' || ch
== '-' || ch
== '*' || ch
== '/' || ch
== '&' || ch
== '|' || ch
== '<' || ch
== '>' || ch
== '=');
38 static void ColouriseKixDoc(Sci_PositionU startPos
, Sci_Position length
, int initStyle
,
39 WordList
*keywordlists
[], Accessor
&styler
) {
41 WordList
&keywords
= *keywordlists
[0];
42 WordList
&keywords2
= *keywordlists
[1];
43 WordList
&keywords3
= *keywordlists
[2];
44 // WordList &keywords4 = *keywordlists[3];
46 styler
.StartAt(startPos
);
48 StyleContext
sc(startPos
, length
, initStyle
, styler
);
50 for (; sc
.More(); sc
.Forward()) {
52 if (sc
.state
== SCE_KIX_COMMENT
) {
54 sc
.SetState(SCE_KIX_DEFAULT
);
56 } else if (sc
.state
== SCE_KIX_COMMENTSTREAM
) {
57 if (sc
.ch
== '/' && sc
.chPrev
== '*') {
58 sc
.ForwardSetState(SCE_KIX_DEFAULT
);
60 } else if (sc
.state
== SCE_KIX_STRING1
) {
61 // This is a doubles quotes string
63 sc
.ForwardSetState(SCE_KIX_DEFAULT
);
65 } else if (sc
.state
== SCE_KIX_STRING2
) {
66 // This is a single quote string
68 sc
.ForwardSetState(SCE_KIX_DEFAULT
);
70 } else if (sc
.state
== SCE_KIX_NUMBER
) {
71 if (!IsADigit(sc
.ch
)) {
72 sc
.SetState(SCE_KIX_DEFAULT
);
74 } else if (sc
.state
== SCE_KIX_VAR
) {
75 if (!IsAWordChar(sc
.ch
)) {
76 sc
.SetState(SCE_KIX_DEFAULT
);
78 } else if (sc
.state
== SCE_KIX_MACRO
) {
79 if (!IsAWordChar(sc
.ch
) && !IsADigit(sc
.ch
)) {
81 sc
.GetCurrentLowered(s
, sizeof(s
));
83 if (!keywords3
.InList(&s
[1])) {
84 sc
.ChangeState(SCE_KIX_DEFAULT
);
86 sc
.SetState(SCE_KIX_DEFAULT
);
88 } else if (sc
.state
== SCE_KIX_OPERATOR
) {
89 if (!IsOperator(sc
.ch
)) {
90 sc
.SetState(SCE_KIX_DEFAULT
);
92 } else if (sc
.state
== SCE_KIX_IDENTIFIER
) {
93 if (!IsAWordChar(sc
.ch
)) {
95 sc
.GetCurrentLowered(s
, sizeof(s
));
97 if (keywords
.InList(s
)) {
98 sc
.ChangeState(SCE_KIX_KEYWORD
);
99 } else if (keywords2
.InList(s
)) {
100 sc
.ChangeState(SCE_KIX_FUNCTIONS
);
102 sc
.SetState(SCE_KIX_DEFAULT
);
106 // Determine if a new state should be entered.
107 if (sc
.state
== SCE_KIX_DEFAULT
) {
109 sc
.SetState(SCE_KIX_COMMENT
);
110 } else if (sc
.ch
== '/' && sc
.chNext
== '*') {
111 sc
.SetState(SCE_KIX_COMMENTSTREAM
);
112 } else if (sc
.ch
== '\"') {
113 sc
.SetState(SCE_KIX_STRING1
);
114 } else if (sc
.ch
== '\'') {
115 sc
.SetState(SCE_KIX_STRING2
);
116 } else if (sc
.ch
== '$') {
117 sc
.SetState(SCE_KIX_VAR
);
118 } else if (sc
.ch
== '@') {
119 sc
.SetState(SCE_KIX_MACRO
);
120 } else if (IsADigit(sc
.ch
) || ((sc
.ch
== '.' || sc
.ch
== '&') && IsADigit(sc
.chNext
))) {
121 sc
.SetState(SCE_KIX_NUMBER
);
122 } else if (IsOperator(sc
.ch
)) {
123 sc
.SetState(SCE_KIX_OPERATOR
);
124 } else if (IsAWordChar(sc
.ch
)) {
125 sc
.SetState(SCE_KIX_IDENTIFIER
);
133 LexerModule
lmKix(SCLEX_KIX
, ColouriseKixDoc
, "kix");