diff options
author | Vicente <unknown> | 2017-11-05 09:49:56 +1100 |
---|---|---|
committer | Vicente <unknown> | 2017-11-05 09:49:56 +1100 |
commit | 57a581f6bc86f11ca668e23b1e9ea66c4e23f9ba (patch) | |
tree | 976771523861eec866b3b80e0954426d551d60e5 /lexers | |
parent | 0f4e2fa312e3450538e011f6919d0b325c3e2988 (diff) | |
download | scintilla-mirror-57a581f6bc86f11ca668e23b1e9ea66c4e23f9ba.tar.gz |
Stop treating '\' as an escape character in strings.
Detect character literals and assign SCE_VHDL_STRING to them.
Diffstat (limited to 'lexers')
-rw-r--r-- | lexers/LexVHDL.cxx | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/lexers/LexVHDL.cxx b/lexers/LexVHDL.cxx index e0fc428fb..de87d2792 100644 --- a/lexers/LexVHDL.cxx +++ b/lexers/LexVHDL.cxx @@ -72,8 +72,9 @@ static void ColouriseVHDLDoc( StyleContext sc(startPos, length, initStyle, styler); bool isExtendedId = false; // true when parsing an extended identifier - for (; sc.More(); sc.Forward()) + while (sc.More()) { + bool advance = true; // Determine if the current state should terminate. if (sc.state == SCE_VHDL_OPERATOR) { @@ -106,24 +107,28 @@ static void ColouriseVHDLDoc( // extended identifiers are terminated by backslash, check for end of line in case we have invalid syntax isExtendedId = false; sc.ForwardSetState(SCE_VHDL_DEFAULT); + advance = false; } } else if (sc.state == SCE_VHDL_COMMENT || sc.state == SCE_VHDL_COMMENTLINEBANG) { if (sc.atLineEnd) { sc.SetState(SCE_VHDL_DEFAULT); } } else if (sc.state == SCE_VHDL_STRING) { - if (sc.ch == '\\') { - if (sc.chNext == '\"' || sc.chNext == '\'' || sc.chNext == '\\') { + if (sc.ch == '"') { + advance = false; + sc.Forward(); + if (sc.ch == '"') sc.Forward(); - } - } else if (sc.ch == '\"') { - sc.ForwardSetState(SCE_VHDL_DEFAULT); + else + sc.SetState(SCE_VHDL_DEFAULT); } else if (sc.atLineEnd) { + advance = false; sc.ChangeState(SCE_VHDL_STRINGEOL); sc.ForwardSetState(SCE_VHDL_DEFAULT); } } else if (sc.state == SCE_VHDL_BLOCK_COMMENT){ if(sc.ch == '*' && sc.chNext == '/'){ + advance = false; sc.Forward(); sc.ForwardSetState(SCE_VHDL_DEFAULT); } @@ -142,8 +147,19 @@ static void ColouriseVHDLDoc( sc.SetState(SCE_VHDL_COMMENT); } else if (sc.Match('/', '*')){ sc.SetState(SCE_VHDL_BLOCK_COMMENT); - } else if (sc.ch == '\"') { + } else if (sc.ch == '"') { sc.SetState(SCE_VHDL_STRING); + } else if (sc.ch == '\'') { + if (sc.GetRelative(2) == '\''){ + if (sc.chNext != '(' || sc.GetRelative(4) != '\''){ + // Can only be a character literal + sc.SetState(SCE_VHDL_STRING); + sc.Forward(); + sc.Forward(); + sc.ForwardSetState(SCE_VHDL_DEFAULT); + advance = false; + } // else can be a tick or a character literal, need more context, eg.: identifier'('x') + } // else can only be a tick } else if (sc.ch == '\\') { isExtendedId = true; sc.SetState(SCE_VHDL_IDENTIFIER); @@ -151,6 +167,9 @@ static void ColouriseVHDLDoc( sc.SetState(SCE_VHDL_OPERATOR); } } + + if (advance) + sc.Forward(); } sc.Complete(); } |