diff options
author | Neil <nyamatongwe@gmail.com> | 2013-10-28 11:47:26 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2013-10-28 11:47:26 +1100 |
commit | 286d86105b30fe7fba849af81ac9ea1daf8a54f8 (patch) | |
tree | fe74a83676d2b214a739b2ff738736def74bc98a | |
parent | c522c390d9bd296b436c6f3e048437c1c5119c90 (diff) | |
download | scintilla-mirror-286d86105b30fe7fba849af81ac9ea1daf8a54f8.tar.gz |
Added lexical class for user defined literals in C++11.
-rw-r--r-- | include/SciLexer.h | 1 | ||||
-rw-r--r-- | include/Scintilla.iface | 1 | ||||
-rw-r--r-- | lexers/LexCPP.cxx | 23 |
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: |