diff options
-rw-r--r-- | lexers/LexVHDL.cxx | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/lexers/LexVHDL.cxx b/lexers/LexVHDL.cxx index 474726c8f..35383f3d8 100644 --- a/lexers/LexVHDL.cxx +++ b/lexers/LexVHDL.cxx @@ -72,6 +72,7 @@ static void ColouriseVHDLDoc( WordList &User = *keywordlists[6]; StyleContext sc(startPos, length, initStyle, styler); + bool isExtendedId = false; // true when parsing an extended identifier for (; sc.More(); sc.Forward()) { @@ -84,7 +85,7 @@ static void ColouriseVHDLDoc( sc.SetState(SCE_VHDL_DEFAULT); } } else if (sc.state == SCE_VHDL_IDENTIFIER) { - if (!IsAWordChar(sc.ch) || (sc.ch == '.')) { + if (!isExtendedId && (!IsAWordChar(sc.ch) || (sc.ch == '.'))) { char s[100]; sc.GetCurrentLowered(s, sizeof(s)); if (Keywords.InList(s)) { @@ -103,6 +104,10 @@ static void ColouriseVHDLDoc( sc.ChangeState(SCE_VHDL_USERWORD); } sc.SetState(SCE_VHDL_DEFAULT); + } else if (isExtendedId && ((sc.ch == '\\') || sc.atLineEnd)) { + // extended identifiers are terminated by backslash, check for end of line in case we have invalid syntax + isExtendedId = false; + sc.ForwardSetState(SCE_VHDL_DEFAULT); } } else if (sc.state == SCE_VHDL_COMMENT || sc.state == SCE_VHDL_COMMENTLINEBANG) { if (sc.atLineEnd) { @@ -141,6 +146,9 @@ static void ColouriseVHDLDoc( sc.SetState(SCE_VHDL_BLOCK_COMMENT); } else if (sc.ch == '\"') { sc.SetState(SCE_VHDL_STRING); + } else if (sc.ch == '\\') { + isExtendedId = true; + sc.SetState(SCE_VHDL_IDENTIFIER); } else if (isoperator(static_cast<char>(sc.ch))) { sc.SetState(SCE_VHDL_OPERATOR); } |