diff options
| -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: | 
