+function_arglist_skip:
+ function_arglist_common
+ | EXPECT_OPTIONAL EXPECT_PITCH function_arglist_skip
+ {
+ $$ = scm_cons ($1, $3);
+ } %prec FUNCTION_ARGLIST
+ | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_skip
+ {
+ $$ = scm_cons ($1, $3);
+ } %prec FUNCTION_ARGLIST
+ | EXPECT_SCM EXPECT_DURATION function_arglist_skip
+ {
+ $$ = scm_cons ($1, $3);
+ } %prec FUNCTION_ARGLIST
+ ;
+
+
+function_arglist_nonbackup:
+ EXPECT_OPTIONAL EXPECT_PITCH function_arglist pitch_also_in_chords {
+ $$ = scm_cons ($4, $3);
+ }
+ | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_closed duration_length {
+ $$ = scm_cons ($4, $3);
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist embedded_scm_arg_closed
+ {
+ $$ = check_scheme_arg (PARSER, @4, $1, $4, $3, $2);
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed bare_number
+ {
+ $$ = check_scheme_arg (PARSER, @4, $1, $4, $3, $2);
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed fraction
+ {
+ $$ = check_scheme_arg (PARSER, @4, $1, $4, $3, $2);
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed post_event
+ {
+ $$ = check_scheme_arg (PARSER, @4, $1, $4, $3, $2);
+ }
+ ;
+
+
+function_arglist_keep:
+ function_arglist_common
+ | function_arglist_backup
+ ;
+
+function_arglist_closed_keep:
+ function_arglist_closed_common
+ | function_arglist_backup
+ ;
+
+function_arglist_backup:
+ EXPECT_OPTIONAL EXPECT_SCM function_arglist_keep embedded_scm_arg_closed
+ {
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = scm_cons ($4, $3);
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (SCM_IDENTIFIER, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep post_event
+ {
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = scm_cons ($4, $3);
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (EVENT_IDENTIFIER, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_keep lyric_element
+ {
+ // There is no point interpreting a lyrics string as
+ // an event, since we don't allow music possibly
+ // followed by durations or postevent into closed
+ // music, and we only accept closed music in optional
+ // arguments at the moment. If this changes, more
+ // complex schemes might become interesting here as
+ // well: see how we do this at the mandatory argument
+ // point.
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ $$ = scm_cons ($3, $2);
+ else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (LYRIC_MARKUP_IDENTIFIER, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep UNSIGNED
+ {
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = $3;
+ MYREPARSE (@4, $1, $2, UNSIGNED, $4);
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (UNSIGNED, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep REAL
+ {
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = $3;
+ MYREPARSE (@4, $1, $2, REAL, $4);
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (REAL, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep NUMBER_IDENTIFIER
+ {
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = scm_cons ($4, $3);
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (NUMBER_IDENTIFIER, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep FRACTION
+ {
+ if (scm_is_true (scm_call_1 ($2, $4)))
+ {
+ $$ = scm_cons ($4, $3);
+ } else {
+ $$ = scm_cons (loc_on_music (@3, $1), $3);
+ MYBACKUP (FRACTION, $4, @4);
+ }
+ }
+ | EXPECT_OPTIONAL EXPECT_PITCH function_arglist_keep pitch_also_in_chords
+ {
+ $$ = scm_cons ($4, $3);
+ }
+ | EXPECT_OPTIONAL EXPECT_DURATION function_arglist_closed_keep duration_length
+ {
+ $$ = scm_cons ($4, $3);
+ }
+ | EXPECT_OPTIONAL EXPECT_SCM function_arglist_backup BACKUP
+ {
+ $$ = scm_cons ($1, $3);
+ MYBACKUP(0, SCM_UNDEFINED, @3);
+ }
+ | function_arglist_backup REPARSE embedded_scm_arg_closed
+ {
+ $$ = check_scheme_arg (PARSER, @3, scm_car ($2),
+ $3, $1, scm_cdr ($2));
+ }
+ | function_arglist_backup REPARSE bare_number
+ {
+ $$ = check_scheme_arg (PARSER, @3, scm_car ($2),
+ $3, $1, scm_cdr ($2));
+ }
+ | function_arglist_backup REPARSE fraction
+ {
+ $$ = check_scheme_arg (PARSER, @3, scm_car ($2),
+ $3, $1, scm_cdr ($2));
+ }
+ ;