]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
Merge branch 'master' into translation
[lilypond.git] / lily / parser.yy
index 9da363df933d208053348e40223a98e6ea359a6e..35d0aa48dc40cd46df5961780c6f8f2fab2d822e 100644 (file)
@@ -228,7 +228,7 @@ static Music *make_music_with_input (SCM name, Input where);
 SCM check_scheme_arg (Lily_parser *parser, Input loc,
                      SCM arg, SCM args, SCM pred, SCM disp = SCM_UNDEFINED);
 SCM make_music_from_simple (Lily_parser *parser, Input loc, SCM pitch);
-SCM loc_on_music (Input loc, SCM arg);
+SCM loc_on_music (Lily_parser *parser, Input loc, SCM arg);
 SCM make_chord_elements (Input loc, SCM pitch, SCM dur, SCM modification_list);
 SCM make_chord_step (SCM step, Rational alter);
 SCM make_simple_markup (SCM a);
@@ -692,15 +692,14 @@ identifier_init_nonumber:
        | pitch_or_music
        | FRACTION
        | string
-        | embedded_scm
+       | 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));
+                                 scm_reverse_x ($1, SCM_EOL));
        }
        ;
 
@@ -708,45 +707,79 @@ identifier_init_nonumber:
 partial_function:
        MUSIC_FUNCTION function_arglist_partial
        {
-               $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
+               $$ = scm_acons ($1, $2, SCM_EOL);
        }
        | EVENT_FUNCTION function_arglist_partial
        {
-               $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
+               $$ = scm_acons ($1, $2, SCM_EOL);
        }
        | SCM_FUNCTION function_arglist_partial
        {
-               $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
+               $$ = scm_acons ($1, $2, SCM_EOL);
+       }
+       | OVERRIDE grob_prop_path '='
+       {
+               if (SCM_UNBNDP ($2))
+                       $$ = scm_list_1 (SCM_BOOL_F);
+               else
+                       $$ = scm_cons
+                               (scm_list_3 (Syntax::property_override_function,
+                                            scm_cdr ($2), scm_car ($2)),
+                                SCM_EOL);
+       }
+       | SET context_prop_spec '='
+       {
+               if (SCM_UNBNDP ($2))
+                       $$ = scm_list_1 (SCM_BOOL_F);
+               else
+                       $$ = scm_cons
+                               (scm_list_3 (Syntax::property_set_function,
+                                            scm_cadr ($2), scm_car ($2)),
+                                SCM_EOL);
        }
        | MUSIC_FUNCTION EXPECT_SCM function_arglist_optional partial_function
        {
-               $$ = scm_cons (scm_cons ($1, scm_car ($4)),
-                              scm_cons ($3, scm_cdr ($4)));
+               $$ = scm_acons ($1, $3, $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_acons ($1, $3, $4);
        }
        | SCM_FUNCTION EXPECT_SCM function_arglist_optional partial_function
        {
-               $$ = scm_cons (scm_cons ($1, scm_car ($4)),
-                              scm_cons ($3, scm_cdr ($4)));
+               $$ = scm_acons ($1, $3, $4);
+       }
+       | OVERRIDE grob_prop_path '=' partial_function
+       {
+               if (SCM_UNBNDP ($2))
+                       $$ = scm_list_1 (SCM_BOOL_F);
+               else
+                       $$ = scm_cons
+                               (scm_list_3 (Syntax::property_override_function,
+                                            scm_cdr ($2), scm_car ($2)),
+                                $4);
+       }
+       | SET context_prop_spec '=' partial_function
+       {
+               if (SCM_UNBNDP ($2))
+                       $$ = scm_list_1 (SCM_BOOL_F);
+               else
+                       $$ = scm_cons
+                               (scm_list_3 (Syntax::property_set_function,
+                                            scm_cadr ($2), scm_car ($2)),
+                                $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)));
+               $$ = scm_acons ($1, $4, $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_acons ($1, $4, $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)));
+               $$ = scm_acons ($1, $4, $5);
        }
        ;
 
@@ -1249,10 +1282,10 @@ tempo_event:
        TEMPO steno_duration '=' tempo_range    {
                $$ = MAKE_SYNTAX (tempo, @$, SCM_EOL, $2, $4);
        }
-       | TEMPO scalar steno_duration '=' tempo_range   {
+       | TEMPO text steno_duration '=' tempo_range     {
                $$ = MAKE_SYNTAX (tempo, @$, $2, $3, $5);
        }
-       | TEMPO scalar {
+       | TEMPO text {
                $$ = MAKE_SYNTAX (tempo, @$, $2);
        } %prec ':'
        ;
@@ -1490,11 +1523,19 @@ context_prefix:
        ;
 
 new_lyrics:
-       ADDLYRICS lyric_mode_music {
-               $$ = scm_list_1 ($2);
+       ADDLYRICS optional_context_mod lyric_mode_music {
+               Context_mod *ctxmod = unsmob<Context_mod> ($2);
+               SCM mods = SCM_EOL;
+               if (ctxmod)
+                       mods = ctxmod->get_mods ();
+               $$ = scm_acons ($3, mods, SCM_EOL);
        }
-       | new_lyrics ADDLYRICS lyric_mode_music {
-               $$ = scm_cons ($3, $1);
+       | new_lyrics ADDLYRICS optional_context_mod lyric_mode_music {
+               Context_mod *ctxmod = unsmob<Context_mod> ($3);
+               SCM mods = SCM_EOL;
+               if (ctxmod)
+                       mods = ctxmod->get_mods ();
+               $$ = scm_acons ($4, mods, $1);
        }
        ;
 
@@ -1841,7 +1882,7 @@ function_arglist_backup:
                                $$ = scm_cons ($$, $3);
                        else
                        {
-                               $$ = scm_cons (loc_on_music (@3, $1), $3);
+                               $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                                MYBACKUP (SCM_ARG, $4, @4);
                        }
                }
@@ -1852,7 +1893,7 @@ function_arglist_backup:
                {
                        $$ = scm_cons ($4, $3);
                } else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (EVENT_IDENTIFIER, $4, @4);
                }
        }
@@ -1868,7 +1909,7 @@ function_arglist_backup:
                } else if (scm_is_true (scm_call_1 ($2, $4)))
                        $$ = scm_cons ($4, $3);
                else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (PITCH_IDENTIFIER, $4, @4);
                }
        }
@@ -1884,7 +1925,7 @@ function_arglist_backup:
                } else if (scm_is_true (scm_call_1 ($2, $4)))
                        $$ = scm_cons ($4, $3);
                else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (TONICNAME_PITCH, $4, @4);
                }
        }
@@ -1893,7 +1934,7 @@ function_arglist_backup:
                if (scm_is_true (scm_call_1 ($2, $4)))
                        $$ = scm_cons ($4, $3);
                else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (SCM_IDENTIFIER, $4, @4);
                }
        }
@@ -1907,7 +1948,7 @@ function_arglist_backup:
                        SCM d = make_duration ($4);
                        if (SCM_UNBNDP (d) || scm_is_false (scm_call_1 ($2, d)))
                        {
-                               $$ = scm_cons (loc_on_music (@3, $1), $3);
+                               $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                                MYBACKUP (UNSIGNED, $4, @4);
                        } else {
                                MYREPARSE (@4, $2, DURATION_IDENTIFIER, d);
@@ -1922,7 +1963,7 @@ function_arglist_backup:
                        $$ = $3;
                        MYREPARSE (@4, $2, REAL, $4);
                } else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (REAL, $4, @4);
                }
        }
@@ -1932,7 +1973,7 @@ function_arglist_backup:
                {
                        $$ = scm_cons ($4, $3);
                } else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (NUMBER_IDENTIFIER, $4, @4);
                }
        }
@@ -1949,7 +1990,7 @@ function_arglist_backup:
                        if (scm_is_true (scm_call_1 ($2, $$)))
                                $$ = scm_cons ($$, $3);
                        else {
-                               $$ = scm_cons (loc_on_music (@3, $1), $3);
+                               $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                                MYBACKUP (UNSIGNED, $5, @5);
                                parser->lexer_->push_extra_token (@4, '-');
                        }
@@ -1962,7 +2003,7 @@ function_arglist_backup:
                        MYREPARSE (@5, $2, REAL, n);
                        $$ = $3;
                } else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (REAL, n, @5);
                }
        }
@@ -1972,7 +2013,7 @@ function_arglist_backup:
                if (scm_is_true (scm_call_1 ($2, n))) {
                        $$ = scm_cons (n, $3);
                } else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (NUMBER_IDENTIFIER, n, @5);
                }
        }
@@ -1983,7 +2024,7 @@ function_arglist_backup:
                        MYREPARSE (@4, $2, DURATION_IDENTIFIER, $4);
                        $$ = $3;
                } else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (DURATION_IDENTIFIER, $4, @4);
                }
        }
@@ -1998,7 +2039,7 @@ function_arglist_backup:
                        else
                                $$ = scm_cons (res, $3);
                else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (SCM_IDENTIFIER, $4, @4);
                }
        }
@@ -2013,7 +2054,7 @@ function_arglist_backup:
                        else
                                $$ = scm_cons (res, $3);
                else {
-                       $$ = scm_cons (loc_on_music (@3, $1), $3);
+                       $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
                        MYBACKUP (STRING, $4, @4);
                }
        }
@@ -2047,7 +2088,7 @@ function_arglist:
        function_arglist_nonbackup
        | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_nonbackup DEFAULT
        {
-               $$ = scm_cons (loc_on_music (@4, $1), $3);
+               $$ = scm_cons (loc_on_music (parser, @4, $1), $3);
        }
        ;
 
@@ -2055,7 +2096,7 @@ function_arglist_skip_nonbackup:
        function_arglist_nonbackup
        | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_nonbackup
        {
-               $$ = scm_cons (loc_on_music (@3, $1), $3);
+               $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
        }
        ;
 
@@ -2293,7 +2334,7 @@ function_arglist_optional:
        function_arglist_backup
        | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_backup DEFAULT
        {
-               $$ = scm_cons (loc_on_music (@4, $1), $3);
+               $$ = scm_cons (loc_on_music (parser, @4, $1), $3);
        }
        | function_arglist_skip_backup BACKUP
        ;
@@ -2302,7 +2343,7 @@ function_arglist_skip_backup:
        function_arglist_backup
        | EXPECT_OPTIONAL EXPECT_SCM function_arglist_skip_backup
        {
-               $$ = scm_cons (loc_on_music (@3, $1), $3);
+               $$ = scm_cons (loc_on_music (parser, @3, $1), $3);
        }
        ;
 
@@ -2646,29 +2687,21 @@ music_property_def:
        OVERRIDE grob_prop_path '=' scalar {
                if (SCM_UNBNDP ($2))
                        $$ = MAKE_SYNTAX (void_music, @$);
-               else {
-                       $$ = MAKE_SYNTAX (property_operation, @$,
+               else
+                       $$ = MAKE_SYNTAX (property_override, @$,
                                          scm_car ($2),
-                                         ly_symbol2scm ("OverrideProperty"),
-                                         scm_cadr ($2),
-                                         $4,
-                                         scm_cddr ($2));
-               }
+                                         scm_cdr ($2),
+                                         $4);
        }
        | REVERT simple_revert_context revert_arg {
-               $$ = MAKE_SYNTAX (property_operation, @$,
-                                 $2,
-                                 ly_symbol2scm ("RevertProperty"),
-                                 scm_car ($3),
-                                 scm_cdr ($3));
+               $$ = MAKE_SYNTAX (property_revert, @$, $2, $3);
        }
        | SET context_prop_spec '=' scalar {
                if (SCM_UNBNDP ($2))
                        $$ = MAKE_SYNTAX (void_music, @$);
                else
-                       $$ = MAKE_SYNTAX (property_operation, @$,
+                       $$ = MAKE_SYNTAX (property_set, @$,
                                          scm_car ($2),
-                                         ly_symbol2scm ("PropertySet"),
                                          scm_cadr ($2),
                                          $4);
        }
@@ -2676,23 +2709,32 @@ music_property_def:
                if (SCM_UNBNDP ($2))
                        $$ = MAKE_SYNTAX (void_music, @$);
                else
-                       $$ = MAKE_SYNTAX (property_operation, @$,
+                       $$ = MAKE_SYNTAX (property_unset, @$,
                                          scm_car ($2),
-                                         ly_symbol2scm ("PropertyUnset"),
                                          scm_cadr ($2));
        }
        ;
 
 string:
-       STRING {
-               $$ = $1;
-       }
+       STRING
        | full_markup
        ;
 
-simple_string: STRING {
-               $$ = $1;
+text:
+       STRING
+       | full_markup
+       | embedded_scm_bare
+       {
+               if (Text_interface::is_markup ($1)) {
+                       $$ = $1;
+               } else {
+                       parser->parser_error (@1, (_ ("markup expected")));
+                       $$ = scm_string (SCM_EOL);
+               }
        }
+       ;
+
+simple_string: STRING
        | embedded_scm_bare
        {
                if (scm_is_string ($1)) {
@@ -2779,8 +2821,8 @@ note_chord_element:
                  unsmob<Music> (scm_car (s))->set_property ("duration", dur);
                es = ly_append2 (es, postevs);
 
-               m-> set_property ("elements", es);
-               m->set_spot (@$);
+               m->set_property ("elements", es);
+               m->set_spot (parser->lexer_->override_input (@$));
                $$ = m->self_scm ();
        } %prec ':'
        ;
@@ -2887,7 +2929,7 @@ post_events:
                                        $$ = scm_cons (scm_car (p), $$);
                                }
                        } else {
-                               m->set_spot (@2);
+                               m->set_spot (parser->lexer_->override_input (@2));
                                $$ = scm_cons ($2, $$);
                        }
                }
@@ -3923,12 +3965,12 @@ SCM check_scheme_arg (Lily_parser *parser, Input loc,
        return args;
 }
 
-SCM loc_on_music (Input loc, SCM arg)
+SCM loc_on_music (Lily_parser *parser, Input loc, SCM arg)
 {
        if (Music *m = unsmob<Music> (arg))
        {
                m = m->clone ();
-               m->set_spot (loc);
+               m->set_spot (parser->lexer_->override_input (loc));
                return m->unprotect ();
        }
        return arg;
@@ -4063,14 +4105,12 @@ make_duration (SCM d, int dots)
 SCM
 make_chord_step (SCM step_scm, Rational alter)
 {
-        int step = scm_to_int (step_scm);
+       Pitch m (0, scm_to_int (step_scm) - 1, alter);
 
-       if (step == 7)
-               alter += FLAT_ALTERATION;
+       // Notename/octave are normalized
+       if (m.get_notename () == 6)
+               m = m.transposed (Pitch (0, 0, FLAT_ALTERATION));
 
-       while (step < 0)
-               step += 7;
-       Pitch m ((step -1) / 7, (step - 1) % 7, alter);
        return m.smobbed_copy ();
 }