]>
git.saurik.com Git - wxWidgets.git/blob - src/stc/scintilla/src/LexSML.cxx
1 // Scintilla source code edit control
5 // Copyright 2009 by James Moffatt and Yuzhou Xin
6 // Modified from LexCaml.cxx by Robert Roessler <robertr@rftp.com> Copyright 2005
7 // The License.txt file describes the conditions under which this software may be distributed.
20 #include "StyleContext.h"
22 #include "Scintilla.h"
25 inline int issml(int c
) {return isalnum(c
) || c
== '_';}
26 inline int issmlf(int c
) {return isalpha(c
) || c
== '_';}
27 inline int issmld(int c
) {return isdigit(c
) || c
== '_';}
31 using namespace Scintilla
;
35 unsigned int startPos
, int length
,
37 WordList
*keywordlists
[],
40 StyleContext
sc(startPos
, length
, initStyle
, styler
);
42 if (sc
.state
< SCE_SML_STRING
)
43 sc
.state
= SCE_SML_DEFAULT
;
44 if (sc
.state
>= SCE_SML_COMMENT
)
45 nesting
= (sc
.state
& 0x0f) - SCE_SML_COMMENT
;
47 int chBase
= 0, chToken
= 0, chLit
= 0;
48 WordList
& keywords
= *keywordlists
[0];
49 WordList
& keywords2
= *keywordlists
[1];
50 WordList
& keywords3
= *keywordlists
[2];
51 const int useMagic
= styler
.GetPropertyInt("lexer.caml.magic", 0);
55 int chColor
= sc
.currentPos
- 1;
58 switch (sc
.state
& 0x0f) {
60 chToken
= sc
.currentPos
;
62 state2
= SCE_SML_IDENTIFIER
;
63 else if (sc
.Match('`') && issmlf(sc
.chNext
))
64 state2
= SCE_SML_TAGNAME
;
65 else if (sc
.Match('#')&&isdigit(sc
.chNext
))
66 state2
= SCE_SML_LINENUM
;
67 else if (sc
.Match('#','\"')){
68 state2
= SCE_SML_CHAR
,chLit
= 0;
72 else if (isdigit(sc
.ch
)) {
73 state2
= SCE_SML_NUMBER
, chBase
= 10;
74 if (sc
.Match('0') && strchr("xX", sc
.chNext
))
75 chBase
= 16, sc
.Forward();}
76 else if (sc
.Match('\"')&&sc
.chPrev
!='#')
77 state2
= SCE_SML_STRING
;
78 else if (sc
.Match('(', '*')){
79 state2
= SCE_SML_COMMENT
,
85 state2
= SCE_SML_OPERATOR
;
88 case SCE_SML_IDENTIFIER
:
89 if (!(issml(sc
.ch
) || sc
.Match('\''))) {
90 const int n
= sc
.currentPos
- chToken
;
93 for (int i
= -n
; i
< 0; i
++)
94 t
[n
+ i
] = static_cast<char>(sc
.GetRelative(i
));
96 if ((n
== 1 && sc
.chPrev
== '_') || keywords
.InList(t
))
97 sc
.ChangeState(SCE_SML_KEYWORD
);
98 else if (keywords2
.InList(t
))
99 sc
.ChangeState(SCE_SML_KEYWORD2
);
100 else if (keywords3
.InList(t
))
101 sc
.ChangeState(SCE_SML_KEYWORD3
);
103 state2
= SCE_SML_DEFAULT
, advance
= false;
107 case SCE_SML_TAGNAME
:
108 if (!(issml(sc
.ch
) || sc
.Match('\'')))
109 state2
= SCE_SML_DEFAULT
, advance
= false;
112 case SCE_SML_LINENUM
:
114 state2
= SCE_SML_DEFAULT
, advance
= false;
117 case SCE_SML_OPERATOR
: {
119 if (issml(sc
.ch
) || isspace(sc
.ch
)
120 || (o
= strchr(")]};,\'\"`#", sc
.ch
),o
)
121 || !strchr("!$%&*+-./:<=>?@^|~", sc
.ch
)) {
122 if (o
&& strchr(")]};,", sc
.ch
)) {
123 if ((sc
.Match(')') && sc
.chPrev
== '(')
124 || (sc
.Match(']') && sc
.chPrev
== '['))
125 sc
.ChangeState(SCE_SML_KEYWORD
);
129 state2
= SCE_SML_DEFAULT
;
135 if (issmld(sc
.ch
) || IsADigit(sc
.ch
, chBase
))
137 if ((sc
.Match('l') || sc
.Match('L') || sc
.Match('n'))
138 && (issmld(sc
.chPrev
) || IsADigit(sc
.chPrev
, chBase
)))
141 if (sc
.Match('.') && issmld(sc
.chPrev
))
143 if ((sc
.Match('e') || sc
.Match('E'))
144 && (issmld(sc
.chPrev
) || sc
.chPrev
== '.'))
146 if ((sc
.Match('+') || sc
.Match('-'))
147 && (sc
.chPrev
== 'e' || sc
.chPrev
== 'E'))
150 state2
= SCE_SML_DEFAULT
, advance
= false;
154 if (sc
.Match('\\')) {
156 if (sc
.chPrev
== '\\')
158 } else if ((sc
.Match('\"') && sc
.chPrev
!= '\\') || sc
.atLineEnd
) {
159 state2
= SCE_SML_DEFAULT
;
164 sc
.ChangeState(SCE_SML_IDENTIFIER
);
165 } else if (chLit
< 1 && sc
.currentPos
- chToken
>= 3)
166 sc
.ChangeState(SCE_SML_IDENTIFIER
), advance
= false;
170 if (sc
.Match('\\') && sc
.chPrev
== '\\')
172 else if (sc
.Match('\"') && sc
.chPrev
!= '\\')
173 state2
= SCE_SML_DEFAULT
, chColor
++;
176 case SCE_SML_COMMENT
:
177 case SCE_SML_COMMENT1
:
178 case SCE_SML_COMMENT2
:
179 case SCE_SML_COMMENT3
:
180 if (sc
.Match('(', '*'))
181 state2
= sc
.state
+ 1, chToken
= sc
.currentPos
,
183 sc
.Forward(), nesting
++;
184 else if (sc
.Match(')') && sc
.chPrev
== '*') {
186 state2
= (sc
.state
& 0x0f) - 1, chToken
= 0, nesting
--;
188 state2
= SCE_SML_DEFAULT
;
190 } else if (useMagic
&& sc
.currentPos
- chToken
== 4
191 && sc
.Match('c') && sc
.chPrev
== 'r' && sc
.GetRelative(-2) == '@')
197 styler
.ColourTo(chColor
, sc
.state
), sc
.ChangeState(state2
);
206 unsigned int startPos
, int length
,
208 WordList
*keywordlists
[],
211 //supress "not used" warnings
212 startPos
|| length
|| initStyle
|| keywordlists
[0] || styler
.Length();
215 static const char * const SMLWordListDesc
[] = {
222 LexerModule
lmSML(SCLEX_SML
, ColouriseSMLDoc
, "SML", FoldSMLDoc
, SMLWordListDesc
);