aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2013-10-28 11:47:26 +1100
committerNeil <nyamatongwe@gmail.com>2013-10-28 11:47:26 +1100
commit286d86105b30fe7fba849af81ac9ea1daf8a54f8 (patch)
treefe74a83676d2b214a739b2ff738736def74bc98a
parentc522c390d9bd296b436c6f3e048437c1c5119c90 (diff)
downloadscintilla-mirror-286d86105b30fe7fba849af81ac9ea1daf8a54f8.tar.gz
Added lexical class for user defined literals in C++11.
-rw-r--r--include/SciLexer.h1
-rw-r--r--include/Scintilla.iface1
-rw-r--r--lexers/LexCPP.cxx23
3 files changed, 21 insertions, 4 deletions
diff --git a/include/SciLexer.h b/include/SciLexer.h
index 957509d1e..7cdb9c31e 100644
--- a/include/SciLexer.h
+++ b/include/SciLexer.h
@@ -167,6 +167,7 @@
#define SCE_C_HASHQUOTEDSTRING 22
#define SCE_C_PREPROCESSORCOMMENT 23
#define SCE_C_PREPROCESSORCOMMENTDOC 24
+#define SCE_C_USERLITERAL 25
#define SCE_D_DEFAULT 0
#define SCE_D_COMMENT 1
#define SCE_D_COMMENTLINE 2
diff --git a/include/Scintilla.iface b/include/Scintilla.iface
index a94e490d8..1e0e16ab3 100644
--- a/include/Scintilla.iface
+++ b/include/Scintilla.iface
@@ -2653,6 +2653,7 @@ val SCE_C_TRIPLEVERBATIM=21
val SCE_C_HASHQUOTEDSTRING=22
val SCE_C_PREPROCESSORCOMMENT=23
val SCE_C_PREPROCESSORCOMMENTDOC=24
+val SCE_C_USERLITERAL=25
# Lexical states for SCLEX_D
lex D=SCLEX_D SCE_D_
val SCE_D_DEFAULT=0
diff --git a/lexers/LexCPP.cxx b/lexers/LexCPP.cxx
index edf415ca4..1d8d6e1de 100644
--- a/lexers/LexCPP.cxx
+++ b/lexers/LexCPP.cxx
@@ -633,12 +633,18 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle,
break;
case SCE_C_NUMBER:
// We accept almost anything because of hex. and number suffixes
- if (!(setWord.Contains(sc.ch)
+ if (sc.ch == '_') {
+ sc.ChangeState(SCE_C_USERLITERAL|activitySet);
+ } else if (!(setWord.Contains(sc.ch)
|| ((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E' ||
sc.chPrev == 'p' || sc.chPrev == 'P')))) {
sc.SetState(SCE_C_DEFAULT|activitySet);
}
break;
+ case SCE_C_USERLITERAL:
+ if (!(setWord.Contains(sc.ch)))
+ sc.SetState(SCE_C_DEFAULT|activitySet);
+ break;
case SCE_C_IDENTIFIER:
if (sc.atLineStart || sc.atLineEnd || !setWord.Contains(sc.ch) || (sc.ch == '.')) {
char s[1000];
@@ -676,8 +682,9 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle,
else
sc.ChangeState(SCE_C_CHARACTER|activitySet);
}
+ } else {
+ sc.SetState(SCE_C_DEFAULT|activitySet);
}
- sc.SetState(SCE_C_DEFAULT|activitySet);
}
break;
case SCE_C_PREPROCESSOR:
@@ -782,7 +789,11 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle,
sc.Forward();
}
} else if (sc.ch == '\"') {
- sc.ForwardSetState(SCE_C_DEFAULT|activitySet);
+ if (sc.chNext == '_') {
+ sc.ChangeState(SCE_C_USERLITERAL|activitySet);
+ } else {
+ sc.ForwardSetState(SCE_C_DEFAULT|activitySet);
+ }
}
break;
case SCE_C_HASHQUOTEDSTRING:
@@ -810,7 +821,11 @@ void SCI_METHOD LexerCPP::Lex(unsigned int startPos, int length, int initStyle,
sc.Forward();
}
} else if (sc.ch == '\'') {
- sc.ForwardSetState(SCE_C_DEFAULT|activitySet);
+ if (sc.chNext == '_') {
+ sc.ChangeState(SCE_C_USERLITERAL|activitySet);
+ } else {
+ sc.ForwardSetState(SCE_C_DEFAULT|activitySet);
+ }
}
break;
case SCE_C_REGEX: