diff options
Diffstat (limited to 'lexers/LexVHDL.cxx')
-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(); } |