X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=13ec353baab3d76ae8f2f1c29ea2732fd39acb70;hb=7cb049f7f3705e414c2a49c7cf14f43a51914c48;hp=5afb5648a1b1175381857039a51443db0644c002;hpb=75f8a001fe30f30fa2d32a961218d0f1cdbeeb7e;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index 5afb5648a1..13ec353baa 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -47,7 +47,6 @@ this. #include "property-iterator.hh" #include "file-results.hh" #include "input.hh" -#include "scope.hh" #include "relative-music.hh" #include "lyric-combine-music.hh" #include "transposed-music.hh" @@ -101,7 +100,7 @@ set_music_properties (Music *p, SCM a) { for (SCM k = a; gh_pair_p (k); k = ly_cdr (k)) { - p->set_mus_property (gh_caar (k), gh_cdar (k)); + p->internal_set_mus_property (ly_caar (k), ly_cdar (k)); } } @@ -112,11 +111,11 @@ set_music_properties (Music *p, SCM a) // needed for bison.simple's malloc () and free () + #include +#include + -#ifndef NDEBUG -#define YYDEBUG 1 -#endif #define YYERROR_VERBOSE 1 @@ -130,6 +129,10 @@ set_music_properties (Music *p, SCM a) %} +/* We use SCMs to do strings, because it saves us the trouble of +deleting them. Let's hope that a stack overflow doesnt trigger a move +of the parse stack onto the heap. */ + %union { @@ -138,16 +141,11 @@ set_music_properties (Music *p, SCM a) String *string; // needed by the lexer as temporary scratch area. Music *music; Score *score; - Scope *scope; Scheme_hash_table *scmhash; Music_output_def * outputdef; Request * request; - /* We use SCMs to do strings, because it saves us the trouble of -deleting them. Let's hope that a stack overflow doesnt trigger a move -of the parse stack onto the heap. */ - SCM scm; Tempo_req *tempo; @@ -188,13 +186,14 @@ yylex (YYSTYPE *s, void * v_l) %token CONSISTS %token DURATION %token SEQUENTIAL -%token ELEMENTDESCRIPTIONS +%token GROBDESCRIPTIONS %token SIMULTANEOUS %token CONSISTSEND %token DENIES %token DURATION %token EXTENDER %token FIGURES FIGURE_OPEN FIGURE_CLOSE +%token FIGURE_BRACKET_CLOSE FIGURE_BRACKET_OPEN %token GLISSANDO %token GRACE %token HEADER @@ -239,14 +238,19 @@ yylex (YYSTYPE *s, void * v_l) %token TYPE %token UNSET %token CONTEXT +%token REST /* escaped */ -%token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE E_TILDE -%token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET +%token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE +%token E_LEFTSQUARE E_RIGHTSQUARE E_TILDE +%token E_BACKSLASH +%token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET +%token FIGURE_SPACE + -%type exclamations questions dots +%type exclamations questions dots optional_rest %type bass_number bass_mod -%type bass_figure figure_list figure_spec +%type br_bass_figure bass_figure figure_list figure_spec %token DIGIT %token NOTENAME_PITCH %token TONICNAME_PITCH @@ -275,7 +279,8 @@ yylex (YYSTYPE *s, void * v_l) %type request_with_dir request_that_take_dir verbose_request %type sub_quotes sup_quotes %type simple_element request_chord command_element Simple_music Composite_music -%type Alternative_music Repeated_music +%type Repeated_music +%type Alternative_music %type tremolo_type %type bare_int bare_unsigned %type script_dir @@ -283,7 +288,7 @@ yylex (YYSTYPE *s, void * v_l) %type identifier_init %type steno_duration optional_notemode_duration multiplied_duration -%type explicit_duration +%type verbose_duration %type pre_requests post_requests %type gen_text_def @@ -296,7 +301,7 @@ yylex (YYSTYPE *s, void * v_l) %type duration_length fraction %type embedded_scm scalar -%type Music Sequential_music Simultaneous_music Music_sequence +%type Music Sequential_music Simultaneous_music %type relative_music re_rhythmed_music part_combined_music %type property_def translator_change %type Music_list @@ -354,9 +359,9 @@ toplevel_expression: } | output_def { if (dynamic_cast ($1)) - THIS->lexer_p_->set_identifier ("$defaultpaper", $1->self_scm ()); + THIS->lexer_p_->set_identifier (gh_str02scm ("$defaultpaper"), $1->self_scm ()); else if (dynamic_cast ($1)) - THIS->lexer_p_->set_identifier ("$defaultmidi", $1->self_scm ()); + THIS->lexer_p_->set_identifier (gh_str02scm ("$defaultmidi"), $1->self_scm ()); } | embedded_scm { // junk value @@ -383,11 +388,11 @@ notenames_body: SCM tab = scm_make_vector (gh_int2scm (i), SCM_EOL); for (SCM s = $1; gh_pair_p (s); s = ly_cdr (s)) { - SCM pt = gh_cdar (s); + SCM pt = ly_cdar (s); if (!unsmob_pitch (pt)) THIS->parser_error ("Need pitch object."); else - scm_hashq_set_x (tab, gh_caar (s), pt); + scm_hashq_set_x (tab, ly_caar (s), pt); } $$ = tab; @@ -397,9 +402,7 @@ notenames_body: lilypond_header_body: { $$ = new Scheme_hash_table; - - Scope *sc = new Scope ($$); - THIS->lexer_p_-> scope_l_arr_.push (sc); + THIS->lexer_p_-> scope_l_arr_.push ($$); } | lilypond_header_body assignment { @@ -409,7 +412,7 @@ lilypond_header_body: lilypond_header: HEADER '{' lilypond_header_body '}' { $$ = $3; - delete THIS->lexer_p_-> scope_l_arr_.pop (); + THIS->lexer_p_->scope_l_arr_.pop (); } ; @@ -433,7 +436,7 @@ assignment: ip.warning (_ ("Identifier should have alphabetic characters only")); } - THIS->lexer_p_->set_identifier (ly_scm2string ($1), $4); + THIS->lexer_p_->set_identifier ($1, $4); /* TODO: devise standard for protection in parser. @@ -467,7 +470,7 @@ identifier_init: $$ = $1->self_scm (); scm_gc_unprotect_object ($$); } - | explicit_duration { + | verbose_duration { $$ = $1; } | number_expression { @@ -520,11 +523,11 @@ translator_spec_body: Translator_def*td = unsmob_translator_def ($$); td->type_aliases_ = gh_cons ($3, td->type_aliases_); } - | translator_spec_body ELEMENTDESCRIPTIONS embedded_scm { + | translator_spec_body GROBDESCRIPTIONS embedded_scm { + Translator_def*td = unsmob_translator_def($$); + // td->add_property_assign (ly_symbol2scm ("allGrobDescriptions"), $3); for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p)) - unsmob_translator_def ($$) - ->add_property_assign (scm_symbol_to_string (gh_caar (p)), gh_cdar (p)); - + td->add_property_assign (scm_symbol_to_string (ly_caar (p)), ly_cdar (p)); } | translator_spec_body CONSISTSEND STRING { unsmob_translator_def ($$)->add_last_element ( $3); @@ -567,6 +570,13 @@ score_body: SCM m = $1->self_scm (); scm_gc_unprotect_object (m); $$->music_ = m; + + /* + guh. + */ + SCM check_func = scm_c_eval_string ("check-start-chords"); + gh_call1 (check_func, m); + } | SCORE_IDENTIFIER { $$ = new Score (*unsmob_score ($1)); @@ -607,7 +617,7 @@ music_output_def_body: p = new Midi_def; $$ = p; - THIS->lexer_p_->scope_l_arr_.push (p->scope_p_); + THIS->lexer_p_->scope_l_arr_.push (p->variable_tab_); } | PAPER '{' { Music_output_def *id = unsmob_music_output_def (THIS->lexer_p_->lookup_identifier ("$defaultpaper")); @@ -616,20 +626,20 @@ music_output_def_body: p = dynamic_cast (id->clone ()); else p = new Paper_def; - THIS-> lexer_p_-> scope_l_arr_.push (p->scope_p_); + THIS-> lexer_p_-> scope_l_arr_.push (p->variable_tab_); $$ = p; } | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER { Music_output_def *p = unsmob_music_output_def ($3); p = p->clone (); - THIS->lexer_p_->scope_l_arr_.push (p->scope_p_); + THIS->lexer_p_->scope_l_arr_.push (p->variable_tab_); $$ = p; } | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER { Music_output_def *p = unsmob_music_output_def ($3); p = p->clone (); - THIS->lexer_p_->scope_l_arr_.push (p->scope_p_); + THIS->lexer_p_->scope_l_arr_.push (p->variable_tab_); $$ = p; } | music_output_def_body assignment { @@ -663,6 +673,13 @@ tempo_request: } ; +/* +The representation of a list is the + + (LIST . LAST-CONS) + + to have efficient append. +*/ Music_list: /* empty */ { $$ = gh_cons (SCM_EOL, SCM_EOL); } @@ -688,41 +705,35 @@ Music: Alternative_music: /* empty */ { - $$ = 0; + $$ = SCM_EOL; } - | ALTERNATIVE Music_sequence { - $$ = $2; - $2->set_spot (THIS->here_input ()); + | ALTERNATIVE '{' Music_list '}' { + $$ = $3; } ; - - - Repeated_music: REPEAT string bare_unsigned Music Alternative_music { - Music_sequence* alts = dynamic_cast ($5); - if (alts && $3 < alts->length_i ()) - $5->origin ()->warning (_ ("More alternatives than repeats. Junking excess alternatives.")); Music *beg = $4; int times = $3; + SCM alts = gh_pair_p ($5) ? gh_car ($5) : SCM_EOL; + if (times < scm_ilength (alts)) { + unsmob_music (gh_car (alts)) + ->origin ()->warning ( + _("More alternatives than repeats. Junking excess alternatives.")); + alts = ly_truncate_list (times, alts); + } Repeated_music * r = new Repeated_music (SCM_EOL); - if (beg) { - r-> set_mus_property ("body", beg->self_scm ()); + r-> set_mus_property ("element", beg->self_scm ()); scm_gc_unprotect_object (beg->self_scm ()); } r->set_mus_property ("repeat-count", gh_int2scm (times >? 1)); - if (alts) - { - alts->truncate (times); - r-> set_mus_property ("alternatives", alts->self_scm ()); - scm_gc_unprotect_object (alts->self_scm ()); - } + r-> set_mus_property ("elements",alts); SCM func = scm_primitive_eval (ly_symbol2scm ("repeat-name-to-ctor")); SCM result = gh_call1 (func, $2); @@ -733,20 +744,16 @@ Repeated_music: } ; -Music_sequence: '{' Music_list '}' { - $$ = new Music_sequence (SCM_EOL); - $$->set_mus_property ("elements", ly_car ($2)); - } - ; - Sequential_music: SEQUENTIAL '{' Music_list '}' { $$ = new Sequential_music (SCM_EOL); $$->set_mus_property ("elements", ly_car ($3)); + $$->set_spot(THIS->here_input()); } | '{' Music_list '}' { $$ = new Sequential_music (SCM_EOL); $$->set_mus_property ("elements", ly_car ($2)); + $$->set_spot(THIS->here_input()); } ; @@ -754,11 +761,13 @@ Simultaneous_music: SIMULTANEOUS '{' Music_list '}'{ $$ = new Simultaneous_music (SCM_EOL); $$->set_mus_property ("elements", ly_car ($3)); + $$->set_spot(THIS->here_input()); } | '<' Music_list '>' { $$ = new Simultaneous_music (SCM_EOL); $$->set_mus_property ("elements", ly_car ($2)); + $$->set_spot(THIS->here_input()); } ; @@ -787,6 +796,8 @@ Simple_music: } | MUSIC_IDENTIFIER { $$ = unsmob_music ($1)->clone (); + + $$->set_spot (THIS->here_input()); } | property_def | translator_change @@ -852,8 +863,6 @@ Composite_music: $$->set_mus_property ("element", $2->self_scm ()); scm_gc_unprotect_object ($2->self_scm ()); #endif - - } | CONTEXT string '=' string Music { Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -971,8 +980,7 @@ relative_music: re_rhythmed_music: ADDLYRICS Music Music { Lyric_combine_music * l = new Lyric_combine_music (SCM_EOL); - l->set_mus_property ("music", $2->self_scm ()); - l->set_mus_property ("lyrics", $3->self_scm ()); + l->set_mus_property ("elements", gh_list ($2->self_scm (), $3->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); scm_gc_unprotect_object ($2->self_scm ()); $$ = l; @@ -984,13 +992,11 @@ part_combined_music: Part_combine_music * p = new Part_combine_music (SCM_EOL); p->set_mus_property ("what", $2); - p->set_mus_property ("one", $3->self_scm ()); - p->set_mus_property ("two", $4->self_scm ()); + p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); scm_gc_unprotect_object ($4->self_scm ()); - $$ = p; } ; @@ -1042,7 +1048,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", Push_property_iterator::constructor_cxx_function); - t->set_mus_property ("symbols", scm_string_to_symbol ($4)); + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("pop-first", SCM_BOOL_T); t->set_mus_property ("grob-property", $6); t->set_mus_property ("grob-value", $8); @@ -1058,7 +1064,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", Push_property_iterator::constructor_cxx_function); - t->set_mus_property ("symbols", scm_string_to_symbol ($4)); + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("grob-property", $6); t->set_mus_property ("grob-value", $8); Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -1074,7 +1080,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", Pop_property_iterator::constructor_cxx_function); - t->set_mus_property ("symbols", scm_string_to_symbol ($4)); + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("grob-property", $6); Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -1100,15 +1106,16 @@ request_chord: THIS->push_spot (); } /*cont */ simple_element post_requests { Music_sequence *l = dynamic_cast ($3); - if (l) { - for (int i=0; i < $1->size (); i++) - l->append_music ($1->elem (i)); - for (int i=0; i < $4->size (); i++) - l->append_music ($4->elem (i)); - } - else - programming_error ("Need Sequence to add music to"); + + $1->concat (*$4); + for (int i=0; i < $1->size (); i++) { + Music * m = $1->elem (i); + l->append_music (m); + } $$ = $3; + + delete $1; + delete $4; } | command_element ; @@ -1120,6 +1127,36 @@ command_element: $$-> set_spot (THIS->here_input ()); $1-> set_spot (THIS->here_input ()); } + | E_LEFTSQUARE { + Span_req *l = new Span_req; + l->set_span_dir (START); + l->set_mus_property ("span-type", ly_str02scm ("ligature")); + l->set_spot (THIS->here_input ()); + + $$ = new Request_chord (SCM_EOL); + $$->set_mus_property ("elements", gh_cons (l->self_scm (), SCM_EOL)); + $$->set_spot (THIS->here_input ()); + } + | E_RIGHTSQUARE { + Span_req *l = new Span_req; + l->set_span_dir (STOP); + l->set_mus_property ("span-type", ly_str02scm ("ligature")); + l->set_spot (THIS->here_input ()); + + $$ = new Request_chord (SCM_EOL); + $$->set_mus_property ("elements", gh_cons (l->self_scm (), SCM_EOL)); + $$->set_spot (THIS->here_input ()); + } + | E_BACKSLASH { + $$ = new Music (gh_list (gh_cons (ly_symbol2scm ("name"), ly_symbol2scm ("separator")), SCM_UNDEFINED)); + $$->set_spot (THIS->here_input ()); + } + | '|' { + + extern Music * get_barcheck(); + $$ = get_barcheck (); + $$->set_spot (THIS->here_input ()); + } | BAR STRING { Music *t = set_property_music (ly_symbol2scm ("whichBar"), $2); @@ -1167,11 +1204,11 @@ command_element: | TIME_T fraction { Music * p1 = set_property_music (ly_symbol2scm ( "timeSignatureFraction"), $2); - int l = gh_scm2int (ly_car ($2)); - int o = gh_scm2int (ly_cdr ($2)); - - Moment one_beat = Moment (1)/Moment (o); - Moment len = Moment (l) * one_beat; + int l = gh_scm2int (ly_car ($2)); + int o = gh_scm2int (ly_cdr ($2)); + + Moment one_beat = Moment (1)/Moment (o); + Moment len = Moment (l) * one_beat; Music *p2 = set_property_music (ly_symbol2scm ("measureLength"), len.smobbed_copy ()); @@ -1214,9 +1251,6 @@ shorthand_command_req: | hyphen_req { $$ = $1; } - | '|' { - $$ = new Barcheck_req; - } | '~' { $$ = new Tie_req; } @@ -1225,6 +1259,9 @@ shorthand_command_req: b->set_span_dir (START); b->set_mus_property ("span-type", ly_str02scm ("beam")); $$ =b; + + + THIS->last_beam_start_ = b->self_scm (); } | ']' { Span_req*b= new Span_req; @@ -1259,8 +1296,6 @@ verbose_command_req: } | PENALTY SCM_T { - - Break_req * b = new Break_req; SCM s = $2; if (!gh_number_p (s)) @@ -1287,7 +1322,7 @@ verbose_command_req: Key_change_req *key_p= new Key_change_req; key_p->set_mus_property ("pitch-alist", $3); - ((Music* )key_p)->transpose (* unsmob_pitch ($2)); + ((Music*)key_p)->transpose (* unsmob_pitch ($2)); $$ = key_p; } ; @@ -1342,7 +1377,8 @@ verbose_request: TODO: junkme, use text-type == dynamic */ Text_script_req *d = new Text_script_req; - d->set_mus_property ("text-type" , ly_symbol2scm ("dynamic")); + SCM dyn = ly_symbol2scm ("dynamic"); + d->set_mus_property ("text-type" , dyn); d->set_mus_property ("text", $2); d->set_spot (THIS->here_input ()); $$ = d; @@ -1458,7 +1494,7 @@ explicit_pitch: } ; -explicit_duration: +verbose_duration: DURATION embedded_scm { $$ = $2; if (!unsmob_duration ($2)) @@ -1490,7 +1526,8 @@ close_request: $$ = $1; dynamic_cast ($$)->set_span_dir ( START); } - + ; + close_request_parens: '(' { Span_req* s= new Span_req; @@ -1557,9 +1594,9 @@ gen_text_def: | DIGIT { String ds = to_str ($1); Text_script_req* t = new Text_script_req; - + SCM finger = ly_symbol2scm ("finger"); t->set_mus_property ("text", ly_str02scm (ds.ch_C ())); - t->set_mus_property ("text-type" , ly_symbol2scm ("finger")); + t->set_mus_property ("text-type" , finger); t->set_spot (THIS->here_input ()); $$ = t; } @@ -1586,7 +1623,6 @@ script_abbreviation: } ; - script_dir: '_' { $$ = DOWN; } | '^' { $$ = UP; } @@ -1612,20 +1648,27 @@ duration_length: multiplied_duration { $$ = $1; } - | explicit_duration { + | verbose_duration { $$ = $1; } ; optional_notemode_duration: { - $$ = THIS->default_duration_.smobbed_copy (); + Duration dd = THIS->default_duration_; + $$ = dd.smobbed_copy (); + + THIS->beam_check ($$); } | multiplied_duration { $$ = $1; + THIS->default_duration_ = *unsmob_duration ($$); + + THIS->beam_check ($$); } - | explicit_duration { + | verbose_duration { $$ = $1; + THIS->default_duration_ = *unsmob_duration ($$); } ; @@ -1638,15 +1681,11 @@ steno_duration: l = intlog2 ($1); $$ = Duration (l, $2).smobbed_copy (); - - THIS->set_last_duration (unsmob_duration ($$)); } | DURATION_IDENTIFIER dots { Duration *d =unsmob_duration ($1); Duration k (d->duration_log (),d->dot_count () + $2); $$ = k.smobbed_copy (); - - THIS->set_last_duration (unsmob_duration ($$)); } ; @@ -1708,31 +1747,51 @@ bass_mod: ; bass_figure: - bass_number { - Pitch p ; - p .notename_i_ = $1 - 1; - p.normalise(); - - Note_req * nr = new Note_req; - $$ = nr->self_scm (); - nr->set_mus_property ("pitch", p.smobbed_copy ()); + 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 { - if ($2) { - SCM sp = unsmob_music ($1)->get_mus_property ("pitch"); - unsmob_pitch (sp)->alteration_i_ += $2; + 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 { - unsmob_music ($1)->set_mus_property ("force-accidental", SCM_BOOL_T); + 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 bass_figure { + | figure_list br_bass_figure { $$ = gh_cons ($2, $1); } ; @@ -1746,18 +1805,29 @@ figure_spec: } ; + +optional_rest: + /**/ { $$ = 0; } + | REST { $$ = 1; } + ; + simple_element: - pitch exclamations questions optional_notemode_duration { + pitch exclamations questions optional_notemode_duration optional_rest { Input i = THIS->pop_spot (); if (!THIS->lexer_p_->note_state_b ()) THIS->parser_error (_ ("Have to be in Note mode for notes")); - Note_req *n = new Note_req; + Music *n = 0; + if ($5) + n = new Rest_req ; + else + n = new Note_req; n->set_mus_property ("pitch", $1); n->set_mus_property ("duration", $4); + if ($3 % 2) n->set_mus_property ("cautionary", SCM_BOOL_T); if ($2 % 2 || $3 % 2) @@ -1765,7 +1835,7 @@ simple_element: Simultaneous_music*v = new Request_chord (SCM_EOL); v->set_mus_property ("elements", scm_list_n (n->self_scm (), SCM_UNDEFINED)); - + v->set_spot (i); n->set_spot (i); $$ = v; @@ -2061,9 +2131,9 @@ questions: %% void -My_lily_parser::set_yydebug (bool b) +My_lily_parser::set_yydebug (bool ) { -#ifdef YYDEBUG +#if 0 yydebug = b; #endif } @@ -2079,3 +2149,24 @@ My_lily_parser::do_yyparse () } +/* +Should make this optional? It will also complain when you do + + [s4] + +which is entirely legitimate. + +Or we can scrap it. Barchecks should detect wrong durations, and +skipTypesetting speeds it up a lot. +*/ +void +My_lily_parser::beam_check (SCM dur) +{ + Duration *d = unsmob_duration (dur); + if (unsmob_music (last_beam_start_) && d->duration_log () <= 2) + { + Music * m = unsmob_music (last_beam_start_); + m->origin ()->warning (_("Suspect duration found following this beam")); + } + last_beam_start_ = SCM_EOL; +}