+bass_number:
+ DIGIT
+ | UNSIGNED
+ ;
+
+bass_mod:
+ '-' { $$ = -1; }
+ | '+' { $$ = 1; }
+ | '!' { $$ = 0; }
+ ;
+
+bass_figure:
+ FIGURE_SPACE {
+ Bass_figure_req *bfr = new Bass_figure_req;
+ $$ = bfr->self_scm();
+ scm_gc_unprotect_object ($$);
+ }
+ | bass_number {
+ Bass_figure_req *bfr = new Bass_figure_req;
+ $$ = bfr->self_scm();
+
+ bfr->set_mus_property ("figure", gh_int2scm ($1));
+
+ scm_gc_unprotect_object ($$);
+ }
+ | bass_figure bass_mod {
+ Music *m = unsmob_music ($1);
+ if ($2) {
+ SCM salter =m->get_mus_property ("alteration");
+ int alter = gh_number_p( salter) ? gh_scm2int (salter) : 0;
+ m->set_mus_property ("alteration",
+ gh_int2scm (alter + $2));
+ } else {
+ m->set_mus_property ("alteration", gh_int2scm (0));
+ }
+ }
+ ;
+
+br_bass_figure:
+ '[' bass_figure {
+ $$ = $2;
+ unsmob_music ($$)->set_mus_property ("bracket-start", SCM_BOOL_T);
+ }
+ | bass_figure {
+ $$ = $1;
+ }
+ | br_bass_figure ']' {
+ $$ = $1;
+ unsmob_music ($1)->set_mus_property ("bracket-stop", SCM_BOOL_T);
+ }
+ ;
+
+figure_list:
+ /**/ {
+ $$ = SCM_EOL;
+ }
+ | figure_list br_bass_figure {
+ $$ = gh_cons ($2, $1);
+ }
+ ;
+
+figure_spec:
+ FIGURE_OPEN figure_list FIGURE_CLOSE {
+ Music * m = new Request_chord (SCM_EOL);
+ $2 = scm_reverse_x ($2, SCM_EOL);
+ m->set_mus_property ("elements", $2);
+ $$ = m->self_scm ();
+ }
+ ;
+
+
+optional_rest:
+ /**/ { $$ = 0; }
+ | REST { $$ = 1; }
+ ;
+