Interpret #... inside of music lists as music instead of ignoring it
authorDavid Kastrup <dak@gnu.org>
Thu, 5 Jul 2012 10:24:19 +0000 (12:24 +0200)
committerDavid Kastrup <dak@gnu.org>
Mon, 9 Jul 2012 05:44:52 +0000 (07:44 +0200)
One consequence is that you get a warning for things like

\revert Score.BarLine #'space-alist #'cue-clef

which actually reverts the whole of space-alist, then ignores #'cue-clef.

Another is that things like $(set-accidental-style 'dodecaphonic)
can be written as #(set-accidental-style 'dodecaphonic) without
getting ignored in most situations.

Void expressions (like most definitions, or the result of calling
\void) are still silently ignored since they are regarded as
intentional.

lily/parser.yy

index a6b3b99d585ae4c395ae5f0e7b04e63cc987018b..44284f6178fdc407edf4edf3a0507418f9594826 100644 (file)
@@ -405,6 +405,7 @@ If we give names, Bison complains.
 %type <scm> music_bare
 %type <scm> music_arg
 %type <scm> music_assign
+%type <scm> music_embedded
 %type <scm> complex_music
 %type <scm> complex_music_prefix
 %type <scm> mode_changed_music
@@ -702,9 +703,13 @@ embedded_lilypond:
                $$ = MAKE_SYNTAX ("void-music", @$);
        }
        | identifier_init
-       | music music music_list {
-               $$ = MAKE_SYNTAX ("sequential-music", @$,       
-                                 scm_cons2 ($1, $2, scm_reverse_x ($3, SCM_EOL)));
+       | music_embedded music_embedded music_list {
+               $3 = scm_reverse_x ($3, SCM_EOL);
+               if (unsmob_music ($2))
+                       $3 = scm_cons ($2, $3);
+               if (unsmob_music ($1))
+                       $3 = scm_cons ($1, $3);
+               $$ = MAKE_SYNTAX ("sequential-music", @$, $3);
        }
        | error {
                parser->error_level_ = 1;
@@ -1131,11 +1136,9 @@ music_list:
        /* empty */ {
                $$ = SCM_EOL;
        }
-       | music_list music {
-               $$ = scm_cons ($2, $1);
-       }
-       | music_list embedded_scm {
-
+       | music_list music_embedded {
+               if (unsmob_music ($2))
+                       $$ = scm_cons ($2, $1);
        }
        | music_list error {
                Music *m = MY_MAKE_MUSIC("Music", @$);
@@ -1157,6 +1160,21 @@ music:   music_arg
        | lyric_element_music
        ;
 
+music_embedded:
+       music
+       | embedded_scm
+       {
+               if (unsmob_music ($1)
+                   || scm_is_eq ($1, SCM_UNSPECIFIED))
+                       $$ = $1;
+               else
+               {
+                       @$.warning (_ ("Ignoring non-music expression"));
+                       $$ = SCM_UNSPECIFIED;
+               }
+       }
+       ;
+
 music_arg:
        simple_music
        {