]> git.donarmstrong.com Git - lilypond.git/commitdiff
parser.yy: rearrange to allow more lenient use of music arguments for music functions.
authorDavid Kastrup <dak@gnu.org>
Sun, 24 Jul 2011 20:02:51 +0000 (22:02 +0200)
committerDavid Kastrup <dak@gnu.org>
Fri, 29 Jul 2011 14:24:55 +0000 (16:24 +0200)
lily/parser.yy

index 6c45e5950717b12c093bc339aaad79985718052f..9c1e38db41e33bca01281c8f10d54a989c04ad4c 100644 (file)
@@ -328,6 +328,7 @@ If we give names, Bison complains.
 %type <scm> composite_music
 %type <scm> grouped_music_list
 %type <scm> closed_music
+%type <scm> open_music
 %type <scm> music
 %type <scm> prefix_composite_music
 %type <scm> repeated_music
@@ -391,9 +392,8 @@ If we give names, Bison complains.
 %type <scm> full_markup_list
 %type <scm> function_scm_argument
 %type <scm> function_arglist
-%type <scm> function_arglist_music_last
-%type <scm> function_arglist_nonmusic_last
-%type <scm> function_arglist_nonmusic
+%type <scm> closed_function_arglist
+%type <scm> open_function_arglist
 %type <scm> identifier_init
 %type <scm> lilypond_header
 %type <scm> lilypond_header_body
@@ -413,7 +413,6 @@ If we give names, Bison complains.
 %type <scm> mode_changing_head
 %type <scm> mode_changing_head_with_context
 %type <scm> multiplied_duration
-%type <scm> music_function_identifier_musicless_prefix
 %type <scm> music_function_event
 %type <scm> music_function_chord_body
 %type <scm> new_chord
@@ -968,6 +967,7 @@ music_list:
 music:
        simple_music
        | composite_music
+       | MUSIC_IDENTIFIER
        ;
 
 alternative_music:
@@ -1007,7 +1007,6 @@ simultaneous_music:
 
 simple_music:
        event_chord
-       | MUSIC_IDENTIFIER
        | music_property_def
        | context_change
        ;
@@ -1063,6 +1062,12 @@ closed_music:
        | grouped_music_list
        ;
 
+/* Music that potentially accepts additional events or durations */
+open_music:
+       simple_music
+       | prefix_composite_music
+       ;
 grouped_music_list:
        simultaneous_music              { $$ = $1; }
        | sequential_music              { $$ = $1; }
@@ -1077,13 +1082,22 @@ function_scm_argument:
  MUSIC_FUNCTION EXPECT_MUSIC EXPECT_SCM EXPECT_SCM EXPECT_NO_MORE_ARGS
 and this rule returns the reversed list of arguments. */
 
-function_arglist_music_last:
-       EXPECT_MUSIC function_arglist music {
+
+function_arglist:
+       closed_function_arglist
+       | open_function_arglist
+       ;
+
+open_function_arglist:
+       EXPECT_MUSIC function_arglist open_music {
                $$ = scm_cons ($3, $2);
        }
        ;
 
-function_arglist_nonmusic_last:
+/* a closed argument list is one that does not end in a music
+   expression that could still take a duration or event */
+
+closed_function_arglist:
        EXPECT_NO_MORE_ARGS {
                /* This is for 0-ary functions, so they don't need to
                   read a lookahead token */
@@ -1098,37 +1112,15 @@ function_arglist_nonmusic_last:
        | EXPECT_PITCH function_arglist pitch {
                $$ = scm_cons ($3, $2);
        }
-       | EXPECT_DURATION function_arglist_nonmusic_last duration_length {
+       | EXPECT_DURATION closed_function_arglist duration_length {
                $$ = scm_cons ($3, $2);
        }
        | EXPECT_SCM function_arglist function_scm_argument {
                $$ = scm_cons ($3, $2);
        }
-       ;
-
-function_arglist_nonmusic: EXPECT_NO_MORE_ARGS {
-               $$ = SCM_EOL;
-       }
-       | EXPECT_MARKUP function_arglist_nonmusic full_markup {
-               $$ = scm_cons ($3, $2);
-       }
-       | EXPECT_MARKUP function_arglist_nonmusic simple_string {
+       | EXPECT_MUSIC function_arglist closed_music {
                $$ = scm_cons ($3, $2);
-       }
-       | EXPECT_PITCH function_arglist_nonmusic pitch {
-               $$ = scm_cons ($3, $2);
-       }
-       | EXPECT_DURATION function_arglist_nonmusic duration_length {
-               $$ = scm_cons ($3, $2);
-       }
-       | EXPECT_SCM function_arglist_nonmusic function_scm_argument {
-               $$ = scm_cons ($3, $2);
-       }
-       ;
-
-function_arglist:
-       function_arglist_music_last
-       | function_arglist_nonmusic_last
+               }
        ;
 
 generic_prefix_music_scm:
@@ -1583,35 +1575,21 @@ chord_body_element:
        }
        ;
 
-music_function_identifier_musicless_prefix: MUSIC_FUNCTION {
-               SCM sig = scm_object_property (yylval.scm, ly_symbol2scm ("music-function-signature"));
-               if (scm_is_pair (sig) && to_boolean (scm_memq (ly_music_p_proc, scm_cdr (scm_reverse (sig)))))
-               {
-                       PARSER->parser_error (@$, "Music function applied to event may not have a Music argument, except as the last argument.");
-               }
-       }
-       ;
 
 music_function_chord_body:
-       /* We could allow chord functions to have multiple music arguments,
-          but it's more consistent with music_function_event if we
-          prohibit it here too */
-       music_function_identifier_musicless_prefix EXPECT_MUSIC function_arglist_nonmusic chord_body_element {
+       MUSIC_FUNCTION EXPECT_MUSIC function_arglist chord_body_element {
                $$ = scm_cons ($1, scm_cons (make_input (@$), scm_reverse_x ($3, scm_list_1 ($4))));
        }
-       | music_function_identifier_musicless_prefix function_arglist_nonmusic {
+       | MUSIC_FUNCTION closed_function_arglist {
                $$ = scm_cons ($1, scm_cons (make_input (@$), scm_reverse_x ($2, SCM_EOL)));
        }
        ;
 
 music_function_event:
-       /* Post-events can only have the last argument as music, without this
-          restriction we get a shift/reduce conflict from e.g.
-          c8-\partcombine c8 -. */
-       music_function_identifier_musicless_prefix EXPECT_MUSIC function_arglist_nonmusic post_event {
+       MUSIC_FUNCTION EXPECT_MUSIC closed_function_arglist post_event {
                $$ = scm_cons ($1, scm_cons (make_input (@$), scm_reverse_x ($3, scm_list_1 ($4))));
        }
-       | music_function_identifier_musicless_prefix function_arglist_nonmusic {
+       | MUSIC_FUNCTION closed_function_arglist {
                $$ = scm_cons ($1, scm_cons (make_input (@$), scm_reverse_x ($2, SCM_EOL)));
        }
        ;