]> git.donarmstrong.com Git - lilypond.git/commitdiff
parser.yy: factor out "multipliers" from "multiplied_duration"
authorDavid Kastrup <dak@gnu.org>
Thu, 25 Feb 2016 13:04:00 +0000 (14:04 +0100)
committerDavid Kastrup <dak@gnu.org>
Fri, 4 Mar 2016 11:37:16 +0000 (12:37 +0100)
lily/parser.yy

index 55a6ad41a6a7c023fc48e0050399b360c7da6abd..e85aa336e5020f67414ec68fce28e9960979647d 100644 (file)
@@ -3218,16 +3218,12 @@ steno_duration:
        ;
 
 multiplied_duration:
-       steno_duration {
-               $$ = $1;
-       }
-       | multiplied_duration '*' UNSIGNED {
-               $$ = unsmob<Duration> ($$)->compressed (scm_to_int ($3)).smobbed_copy ();
-       }
-       | multiplied_duration '*' FRACTION {
-               Rational  m (scm_to_int (scm_car ($3)), scm_to_int (scm_cdr ($3)));
-
-               $$ = unsmob<Duration> ($$)->compressed (m).smobbed_copy ();
+       steno_duration multipliers {
+               if (scm_is_number ($2)) {
+                       Rational m (ly_scm2rational ($2));
+                       $$ = unsmob<Duration> ($1)->compressed (m).smobbed_copy ();
+               } else
+                       $$ = $1;
        }
        ;
 
@@ -3240,6 +3236,28 @@ dots:
        }
        ;
 
+multipliers:
+       /* empty */
+       {
+               $$ = SCM_UNSPECIFIED;
+       }
+       | multipliers '*' UNSIGNED
+       {
+               if (scm_is_number ($1))
+                       $$ = scm_product ($1, $3);
+               else
+                       $$ = $3;
+       }
+       | multipliers '*' FRACTION
+       {
+               if (scm_is_number ($1))
+                       $$ = scm_product ($1, scm_divide (scm_car ($3),
+                                                         scm_cdr ($3)));
+               else
+                       $$ = scm_divide (scm_car ($3), scm_cdr ($3));
+       }
+       ;
+
 tremolo_type:
        ':'     {
                $$ = scm_from_int (parser->default_tremolo_type_);