Re: regexp for scheme blocks in lilypond language

Federico Bruni <[email protected]> Wed, 18 Jan 2012 23:55:02 +0100
Newsgroups gmane.comp.gnu.source-highlight.general
Message-ID <[email protected]>
This is a multi-part message in MIME format.
--------------080008050604060400000800
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Il 18/01/2012 10:01, Lorenzo Bettini ha scritto:
> On 18/01/2012 09:54, Federico Bruni wrote:
>> Hi,
>>
>> lilypond files can contain blocks of scheme code in several ways.
>> The main challenge is handling conflicts between single and multiline
>> and especially blocks where the number of parentheses cannot be known in
>> advance (there's a way to match balanced parentheses?).
>
> Hi
>
> very quick answer: you can match balanced parenthesis using 'nested'
> (see the documentation);
>

Thanks, this should be the direction, but it's not so easy.
First, the doc says:

"Note that, in order for a delimited language element to be nested, its 
starting and ending elements must be different"

I may be wrong, but I would add: they also have to be specular.
In my case delimiters are not specular.
Start delimiter: #(
End delimiter: )

I can't consider just parenthesis for two reasons:

- I want to highlight # as well
- ( and ) have also a different meaning (slurs) in lilypond synthax and 
must be highlighted differently

So this doesn't work:
scheme_block delim "(" ")" multiline nested

I wrote this but it doesn't work correctly:

scheme_block delim '(?<!#)\(' '\)' multiline nested

The most external () block is omitted and slurs higlighting is broken 
(see file attached).

What do you recommend to do?

Thanks,
Federico

--------------080008050604060400000800
Content-Type: text/html;
 name="test.html"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="test.html"

<!-- Generator: GNU source-highlight 3.1.5
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000000">\version</font></b> <font color="#C20F0F">"2.14.2"</font>
<i><font color="#808080">% Scheme big block: currently commented out because lilypond.lang</font></i>
<i><font color="#808080">% can't handle it.</font></i>
#<b><font color="#CC33CC">(</font></b>define <font color="#A04900">(naturalize-pitch p)</font>
   <font color="#A04900">(let ((o (ly:pitch-octave p))</font>
<font color="#A04900">         (a (* 4 (ly:pitch-alteration p)))</font>
<font color="#A04900">         ;; alteration, a, in quarter tone steps,</font>
<font color="#A04900">         ;; for historical reasons</font>
<font color="#A04900">         (n (ly:pitch-notename p)))</font>
<font color="#A04900">     (cond</font>
<font color="#A04900">      ((and (&gt; a 1) (or (eq? n 6) (eq? n 2)))</font>
<font color="#A04900">       (set! a (- a 2))</font>
<font color="#A04900">       (set! n (+ n 1)))</font>
<font color="#A04900">      ((and (&lt; a -1) (or (eq? n 0) (eq? n 3)))</font>
<font color="#A04900">       (set! a (+ a 2))</font>
<font color="#A04900">       (set! n (- n 1))))</font>
<font color="#A04900">     (cond</font>
<font color="#A04900">      ((&gt; a 2) (set! a (- a 4)) (set! n (+ n 1)))</font>
<font color="#A04900">      ((&lt; a -2) (set! a (+ a 4)) (set! n (- n 1))))</font>
<font color="#A04900">     (if (&lt; n 0) (begin (set! o (- o 1)) (set! n (+ n 7))))</font>
<font color="#A04900">     (if (&gt; n 6) (begin (set! o (+ o 1)) (set! n (- n 7))))</font>
<font color="#A04900">     (ly:make-pitch o n (/ a 4)))</font><b><font color="#CC33CC">)</font></b>
<i><font color="#808080">%}</font></i>
<b><font color="#000000">\header</font></b> <b><font color="#000000">{</font></b>
  <font color="#0000FF">title</font> = <font color="#C20F0F">"Maple Leaf Rag"</font>
  <font color="#0000FF">composer</font> = <font color="#C20F0F">"Scott Joplin"</font>
  <font color="#0000FF">piece</font> = <font color="#C20F0F">"Tempo di marcia"</font>
<b><font color="#000000">}</font></b>

<b><font color="#000000">\paper</font></b> <b><font color="#000000">{</font></b>
  <font color="#0000FF">top-margin</font> = <font color="#808000">15</font>
  <font color="#0000FF">bottom-margin</font> = <font color="#808000">10</font>
  <font color="#0000FF">system-system-spacing</font> #'padding = #<font color="#808000">8</font>
  <font color="#0000FF">score-system-spacing</font> =
    #'<font color="#A04900">((basic-distance . 12)</font>
<font color="#A04900">       (minimum-distance . 6)</font>
<font color="#A04900">       (padding . 1)</font>
<font color="#A04900">       (stretchability . 12))</font>
<b><font color="#000000">}</font></b>

top =  <b><font color="#0000C0">\relative</font></b> c' <b><font color="#000000">{</font></b>
 <b><font color="#000000">\override</font></b> <font color="#CC33CC">TextScript</font>   #'padding = #<font color="#808000">2</font>
 
 <b><font color="#0000C0">\key</font></b> as <font color="#0000FF">\major</font>
 <b><font color="#0000C0">\time</font></b> <font color="#808000">2</font>/<font color="#808000">4</font>
 <b><font color="#0000C0">\clef</font></b> <font color="#0000FF">treble</font>
 <b><font color="#0000C0">\partial</font></b> <font color="#808000">8</font>
 r<font color="#008080">8</font> <font color="#FF6600">\f</font> |
 <b><font color="#0000C0">\repeat</font></b> <font color="#0000FF">volta</font> <font color="#808000">2</font> <b><font color="#000000">{</font></b>
  r<font color="#008080">16</font> as' &lt;es' es,&gt; as, c &lt;es es,&gt;<font color="#008080">8</font> g,<font color="#008080">16</font> |
  &lt;es' es,&gt;<font color="#008080">16</font> g, bes &lt;es es,&gt; <b><font color="#CC33CC">~</font></b> &lt;es es,&gt;<font color="#008080">4</font> |
  r<font color="#008080">16</font> as, &lt;es' es,&gt; as, c &lt;es es,&gt;<font color="#008080">8</font> g,<font color="#008080">16</font> |
  &lt;es' es,&gt;<font color="#008080">16</font> g, bes &lt;es es,&gt; <b><font color="#CC33CC">~</font></b> &lt;es es,&gt;<font color="#008080">8</font> r<font color="#008080">16</font> &lt;es es,&gt; |
  r<font color="#008080">16</font> as, ces &lt;fes fes,&gt; r<font color="#008080">16</font> &lt;es es,&gt; r<font color="#008080">16</font> &lt;es es,&gt; |
  r<font color="#008080">16</font> as, ces &lt;fes fes,&gt; r<font color="#008080">16</font> &lt;es es,&gt; r<font color="#008080">8</font> |
  <b><font color="#0000C0">\change</font></b> <b><font color="#CC33CC">Staff</font></b> = <font color="#C20F0F">"down"</font>
   <b><font color="#0000C0">\stemUp</font></b> r<font color="#008080">16</font><b><font color="#CC33CC">^</font></b><font color="#FF6600">\p</font> as,,,-<font color="#A04900">( ces as'-)</font> r as-<font color="#A04900">( ces as'-)</font> <b><font color="#0000C0">\stemNeutral</font></b> |
  <b><font color="#0000C0">\change</font></b> <b><font color="#CC33CC">Staff</font></b> = <font color="#C20F0F">"up"</font>
  r<font color="#008080">16</font> as-<font color="#A04900">( ces as'-)</font> r as-<font color="#A04900">( ces as'-)</font> |
  <b><font color="#000000">}</font></b>
<b><font color="#000000">}</font></b>

bottom =  <b><font color="#0000C0">\relative</font></b> c <b><font color="#000000">{</font></b>
 <b><font color="#0000C0">\key</font></b> as <font color="#0000FF">\major</font>
 <b><font color="#0000C0">\time</font></b> <font color="#808000">2</font>/<font color="#808000">4</font>
 <b><font color="#0000C0">\clef</font></b> <font color="#0000FF">bass</font>
 <b><font color="#0000C0">\partial</font></b> <font color="#808000">8</font>
 &lt;es es,&gt;<font color="#008080">8</font> |
 <b><font color="#0000C0">\repeat</font></b> <font color="#0000FF">volta</font> <font color="#808000">2</font> <b><font color="#000000">{</font></b>
  &lt;as as,&gt; &lt;c as es&gt; &lt;c as es&gt; &lt;a a,&gt; |
  &lt;bes bes,&gt; &lt;des g, es&gt; &lt;des g, es&gt; &lt;es, es,&gt; |
  &lt;as as,&gt; &lt;c as es&gt; &lt;c as es&gt; &lt;a a,&gt; |
  &lt;bes bes,&gt; &lt;des g, es&gt; &lt;des g, es&gt; &lt;es, es,&gt; |
  &lt;fes fes,&gt;<font color="#008080">4</font> &lt;es es,&gt;<font color="#008080">8</font> &lt;es es,&gt; |
  &lt;fes fes,&gt;<font color="#008080">4</font> &lt;es es,&gt;<font color="#008080">8</font> r |
  <b><font color="#0000C0">\stemDown</font></b> as,, r as' r <b><font color="#0000C0">\stemNeutral</font></b> |
  as' r as' r <b><font color="#0000C0">\clef</font></b> <font color="#0000FF">treble</font> |
  <b><font color="#000000">}</font></b>
<b><font color="#000000">}</font></b>

<b><font color="#000000">\score</font></b> <b><font color="#000000">{</font></b>
  <b><font color="#000000">\context</font></b> <b><font color="#CC33CC">PianoStaff</font></b> &lt;&lt;
  <b><font color="#000000">\context</font></b> <b><font color="#CC33CC">Staff</font></b> = <font color="#C20F0F">"up"</font>
   <b><font color="#0000C0">\applyMusic</font></b> #<font color="#0000FF">unfold-repeats</font> <b><font color="#0000C0">\top</font></b> 
  <b><font color="#000000">\context</font></b> <b><font color="#CC33CC">Staff</font></b> = <font color="#C20F0F">"down"</font>
   <b><font color="#0000C0">\applyMusic</font></b> #<font color="#0000FF">unfold-repeats</font> <b><font color="#0000C0">\bottom</font></b>
 &gt;&gt;
 
  <b><font color="#000000">\midi</font></b> <b><font color="#000000">{</font></b>
    <b><font color="#000000">\context</font></b> <b><font color="#000000">{</font></b>
      <b><font color="#CC33CC">\Score</font></b> <font color="#0000FF">tempoWholesPerMinute</font> = #<b><font color="#CC33CC">(</font></b>ly:<font color="#0000FF">make-moment</font> <font color="#808000">120</font> <font color="#808000">4</font><b><font color="#CC33CC">)</font></b>
    <b><font color="#000000">}</font></b>
    <b><font color="#000000">\context</font></b> <b><font color="#000000">{</font></b>
      <b><font color="#CC33CC">\Voice</font></b>
      <b><font color="#000000">\remove</font></b> Dynamic<b><font color="#CC33CC">_</font></b>performer
    <b><font color="#000000">}</font></b>
  <b><font color="#000000">}</font></b>
  <b><font color="#000000">\layout</font></b><b><font color="#000000">{}</font></b>
<b><font color="#000000">}</font></b>
</tt></pre>

--------------080008050604060400000800
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Help-source-highlight mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-source-highlight

--------------080008050604060400000800--