aboutsummaryrefslogtreecommitdiffhomepage
path: root/lexers
diff options
context:
space:
mode:
Diffstat (limited to 'lexers')
-rw-r--r--lexers/LexVHDL.cxx33
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();
}