From bd47120c2a2f83f19a45abebf78b45d1af780519 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Sun, 24 Jul 2011 22:02:51 +0200 Subject: [PATCH] parser.yy: rearrange to allow more lenient use of music arguments for music functions. --- lily/parser.yy | 80 ++++++++++++++++++-------------------------------- 1 file changed, 29 insertions(+), 51 deletions(-) diff --git a/lily/parser.yy b/lily/parser.yy index 6c45e59507..9c1e38db41 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -328,6 +328,7 @@ If we give names, Bison complains. %type composite_music %type grouped_music_list %type closed_music +%type open_music %type music %type prefix_composite_music %type repeated_music @@ -391,9 +392,8 @@ If we give names, Bison complains. %type full_markup_list %type function_scm_argument %type function_arglist -%type function_arglist_music_last -%type function_arglist_nonmusic_last -%type function_arglist_nonmusic +%type closed_function_arglist +%type open_function_arglist %type identifier_init %type lilypond_header %type lilypond_header_body @@ -413,7 +413,6 @@ If we give names, Bison complains. %type mode_changing_head %type mode_changing_head_with_context %type multiplied_duration -%type music_function_identifier_musicless_prefix %type music_function_event %type music_function_chord_body %type 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))); } ; -- 2.39.5