]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
Issue 4487/3: Implement partial markups
[lilypond.git] / lily / parser.yy
index 581791d256badd07139b44758f2ed9fedb4e4a1a..9da363df933d208053348e40223a98e6ea359a6e 100644 (file)
@@ -510,6 +510,7 @@ embedded_scm_bare_arg:
                $$ = parser->lexer_->eval_scm_token ($1, @1);
        }
        | FRACTION
+       | partial_markup
        | full_markup_list
        | context_modification
        | score_block
@@ -692,26 +693,60 @@ identifier_init_nonumber:
        | FRACTION
        | string
         | embedded_scm
+       | partial_markup
        | full_markup_list
         | context_modification
        | partial_function ETC
+       {
+               $$ = MAKE_SYNTAX (partial_music_function, @$,
+                                 scm_reverse_x (scm_car ($1), SCM_EOL),
+                                 scm_reverse_x (scm_cdr ($1), SCM_EOL));
+       }
        ;
 
+// Partial functions
 partial_function:
        MUSIC_FUNCTION function_arglist_partial
        {
-               $$ = MAKE_SYNTAX (partial_music_function, @$,
-                                 $1, $2);
+               $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
        }
        | EVENT_FUNCTION function_arglist_partial
        {
-               $$ = MAKE_SYNTAX (partial_music_function, @$,
-                                 $1, $2);
+               $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
        }
        | SCM_FUNCTION function_arglist_partial
        {
-               $$ = MAKE_SYNTAX (partial_music_function, @$,
-                                 $1, $2);
+               $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
+       }
+       | MUSIC_FUNCTION EXPECT_SCM function_arglist_optional partial_function
+       {
+               $$ = scm_cons (scm_cons ($1, scm_car ($4)),
+                              scm_cons ($3, scm_cdr ($4)));
+       }
+       | EVENT_FUNCTION EXPECT_SCM function_arglist_optional partial_function
+       {
+               $$ = scm_cons (scm_cons ($1, scm_car ($4)),
+                              scm_cons ($3, scm_cdr ($4)));
+       }
+       | SCM_FUNCTION EXPECT_SCM function_arglist_optional partial_function
+       {
+               $$ = scm_cons (scm_cons ($1, scm_car ($4)),
+                              scm_cons ($3, scm_cdr ($4)));
+       }
+       | MUSIC_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function
+       {
+               $$ = scm_cons (scm_cons ($1, scm_car ($5)),
+                              scm_cons ($4, scm_cdr ($5)));
+       }
+       | EVENT_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function
+       {
+               $$ = scm_cons (scm_cons ($1, scm_car ($5)),
+                              scm_cons ($4, scm_cdr ($5)));
+       }
+       | SCM_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function
+       {
+               $$ = scm_cons (scm_cons ($1, scm_car ($5)),
+                              scm_cons ($4, scm_cdr ($5)));
        }
        ;
 
@@ -3579,11 +3614,24 @@ full_markup_list:
        }
        ;
 
-full_markup:
+markup_mode:
        MARKUP
-               { parser->lexer_->push_markup_state (); }
-       markup_top {
-               $$ = $3;
+       {
+               parser->lexer_->push_markup_state ();
+       }
+       ;
+
+full_markup:
+       markup_mode markup_top {
+               $$ = $2;
+               parser->lexer_->pop_state ();
+       }
+       ;
+
+partial_markup:
+       markup_mode markup_head_1_list ETC
+       {
+               $$ = MAKE_SYNTAX (partial_markup, @2, $2);
                parser->lexer_->pop_state ();
        }
        ;