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();  } | 
