Re: Backreferences in source-highlight 2.7

gnombat <[email protected]> Sun, 10 Jun 2007 16:33:57 -0500
Newsgroups gmane.comp.gnu.source-highlight.general
Message-ID <[email protected]>
Lorenzo Bettini wrote:
> gnombat wrote:
>> I'm having trouble with backreferences in source-highlight 2.7.  If I
>> create a language definition file named foo.lang:
>>
>> keyword = `a(.)\1`
>>
>> And then I create a test file example.foo:
>>
>> aaa abb acc a** a@@
>>
>> And then I run source-highlight:
>>
>> source-highlight --lang-def=foo.lang example.foo
>>
>> Then "aaa", "abb" and "acc" are highlighted, but "a**" and "a@@" are
>> not.  Shouldn't the dot match any character?
> 
> yes you're right, so this must be a bug...
> 
> I'll try to work on it tomorrow
> 
> thanks for the feedback!
> cheers
> 	Lorenzo
> 

I think I figured out what is going on: is_to_isolate from 
regexpstatebuilder.cpp is treating the regular expression as an 
alphanumerical string because `a(.)\1` starts and ends with a letter or 
number.

/**
  * An expression is isolated basically if it is an alphanumerical
  * string
  * TODO check whether this is actually correct in principle
  * @param s
  * @return
  */
bool is_to_isolate(const string &s) {
   if (s.size()) {
     if ((isalnum(s[0]) || s[0] == '_') && (isalnum(s[s.size()-1]) || 
s[s.size()-1] == '_'))
       return true;
   }

   return false;
}

Then the whole regular expression gets surrounded with word boundary 
characters.  This causes the match to fail with "a**" and "a@@".