X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fparser.yy;h=fcb719e317d8215848accaed517b0dd1eef8eb7c;hb=3f0eeade60254cf648e559d5b74a7f0e343c34e7;hp=9c1cee4c1787443c498931f9dd576e96e5859ad4;hpb=48631a04b6181cd7be65702574eaaa6c52284bd2;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index 9c1cee4c17..fcb719e317 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -23,6 +23,7 @@ this. */ +#include #include #include "translator-def.hh" @@ -36,15 +37,14 @@ this. #include "file-path.hh" #include "warn.hh" #include "dimensions.hh" -#include "command-request.hh" -#include "musical-request.hh" + +#include "request.hh" #include "my-lily-parser.hh" -#include "context-specced-music.hh" #include "score.hh" #include "music-list.hh" #include "output-property-music-iterator.hh" #include "property-iterator.hh" -#include "file-results.hh" +#include "input-file-results.hh" #include "input.hh" #include "relative-music.hh" #include "lyric-combine-music.hh" @@ -54,11 +54,11 @@ this. #include "untransposable-music.hh" #include "lilypond-input-version.hh" #include "grace-music.hh" -#include "part-combine-music.hh" #include "scm-hash.hh" #include "auto-change-iterator.hh" #include "un-relativable-music.hh" #include "chord.hh" +#include "ly-modules.hh" bool regular_identifier_b (SCM id) @@ -76,18 +76,6 @@ regular_identifier_b (SCM id) } -Music* -set_property_music (SCM sym, SCM value) -{ - Music * p = new Music (SCM_EOL); - p->set_mus_property ("symbol", sym); - p->set_mus_property ("iterator-ctor", - Property_iterator::constructor_cxx_function); - - p->set_mus_property ("value", value); - return p; -} - bool is_duration_b (int t) { @@ -105,13 +93,31 @@ set_music_properties (Music *p, SCM a) +#define MY_MAKE_MUSIC(x) make_music_by_name (ly_symbol2scm (x)) +Music* +set_property_music (SCM sym, SCM value) +{ + Music * p = MY_MAKE_MUSIC("PropertySet"); + p->set_mus_property ("symbol", sym); + p->set_mus_property ("value", value); + return p; +} - +Music* +make_span_req (SCM name) +{ + static SCM proc; + if (!proc) + proc = scm_c_eval_string ("old-span-request->event"); + SCM m = scm_call_1 (proc, name); + scm_gc_protect_object (m); + return unsmob_music (m); +} // needed for bison.simple's malloc () and free () -#include +// #include #include @@ -124,7 +130,6 @@ set_music_properties (Music *p, SCM a) ((My_lily_parser *) my_lily_parser) #define yyerror THIS->parser_error -#define ARRAY_SIZE(a,s) if (a.size () != s) THIS->parser_error (_f ("Expecting %d arguments", s)) %} @@ -135,19 +140,14 @@ of the parse stack onto the heap. */ %union { - Link_array *reqvec; + Link_array *reqvec; String *string; // needed by the lexer as temporary scratch area. Music *music; Score *score; Scheme_hash_table *scmhash; Music_output_def * outputdef; - - Request * request; - SCM scm; - - Tempo_req *tempo; int i; } %{ @@ -210,6 +210,7 @@ yylex (YYSTYPE *s, void * v) %token NAME %token PITCHNAMES %token NOTES +%token ONCE %token PAPER %token PARTIAL %token PENALTY @@ -243,10 +244,10 @@ yylex (YYSTYPE *s, void * v) %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 E_UNSIGNED +%token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET CHORD_SLASH %token FIGURE_SPACE - %type exclamations questions dots optional_rest %type bass_number bass_mod %type br_bass_figure bass_figure figure_list figure_spec @@ -273,9 +274,9 @@ yylex (YYSTYPE *s, void * v) %token REAL %type output_def -%type lilypond_header lilypond_header_body -%type open_request_parens close_request_parens open_request close_request -%type request_with_dir request_that_take_dir verbose_request +%type lilypond_header lilypond_header_body +%type open_request_parens close_request_parens open_request close_request +%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 Repeated_music @@ -283,14 +284,13 @@ yylex (YYSTYPE *s, void * v) %type tremolo_type %type bare_int bare_unsigned %type script_dir - %type identifier_init %type steno_duration optional_notemode_duration multiplied_duration %type verbose_duration %type pre_requests post_requests -%type gen_text_def +%type gen_text_def %type steno_pitch pitch absolute_pitch %type explicit_pitch steno_tonic_pitch @@ -302,20 +302,21 @@ yylex (YYSTYPE *s, void * v) %type embedded_scm scalar %type Music Sequential_music Simultaneous_music %type relative_music re_rhythmed_music part_combined_music -%type property_def translator_change +%type property_def translator_change simple_property_def %type Music_list %type music_output_def_body -%type shorthand_command_req -%type post_request +%type shorthand_command_req +%type post_request %type command_req verbose_command_req -%type extender_req -%type hyphen_req +%type extender_req +%type hyphen_req +%type string_request %type string bare_number number_expression number_term number_factor %type score_block score_body %type translator_spec_block translator_spec_body -%type tempo_request +%type tempo_request %type notenames_body notenames_block chordmodifiers_block %type script_abbreviation @@ -349,9 +350,7 @@ toplevel_expression: THIS->lexer_->chordmodifier_tab_ = $1; } | lilypond_header { - if (THIS->input_file_->global_header_) - scm_gc_unprotect_object (THIS->input_file_->global_header_->self_scm ()); - THIS->input_file_->global_header_ = $1; + THIS->input_file_->header_ = $1; } | score_block { THIS->input_file_->scores_.push ($1); @@ -400,18 +399,17 @@ notenames_body: lilypond_header_body: { - $$ = new Scheme_hash_table; - THIS->lexer_-> scopes_.push ($$); + $$ = ly_make_anonymous_module (); + THIS->lexer_->add_scope ($$); } | lilypond_header_body assignment { - + } ; lilypond_header: HEADER '{' lilypond_header_body '}' { - $$ = $3; - THIS->lexer_->scopes_.pop (); + $$ = THIS->lexer_-> remove_scope(); } ; @@ -432,7 +430,7 @@ assignment: if (! regular_identifier_b ($1)) { - ip.warning (_ ("Identifier should have alphabetic characters only")); + ip.warning (_ ("Identifier should have alphabetic characters only")); } THIS->lexer_->set_identifier ($1, $4); @@ -524,7 +522,7 @@ translator_spec_body: } | translator_spec_body ALIAS STRING { Translator_def*td = unsmob_translator_def ($$); - td->type_aliases_ = gh_cons ($3, td->type_aliases_); + td->type_aliases_ = scm_cons ($3, td->type_aliases_); } | translator_spec_body GROBDESCRIPTIONS embedded_scm { Translator_def*td = unsmob_translator_def($$); @@ -587,7 +585,6 @@ score_body: $$->set_spot (THIS->here_input ()); } | score_body lilypond_header { - scm_gc_unprotect_object ($2->self_scm ()); $$->header_ = $2; } | score_body output_def { @@ -605,23 +602,23 @@ score_body: output_def: music_output_def_body '}' { $$ = $1; - THIS-> lexer_-> scopes_.pop (); + THIS-> lexer_-> remove_scope (); } ; music_output_def_body: MIDI '{' { - Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultmidi")); + Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultmidi")); - - Midi_def* p =0; - if (id) - p = dynamic_cast (id->clone ()); - else - p = new Midi_def; - $$ = p; - THIS->lexer_->scopes_.push (p->variable_tab_); + Midi_def* p =0; + if (id) + p = dynamic_cast (id->clone ()); + else + p = new Midi_def; + + $$ = p; + THIS->lexer_->add_scope (p->scope_); } | PAPER '{' { Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper")); @@ -630,20 +627,20 @@ music_output_def_body: p = dynamic_cast (id->clone ()); else p = new Paper_def; - THIS-> lexer_-> scopes_.push (p->variable_tab_); + THIS-> lexer_->add_scope (p->scope_); $$ = p; } | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER { Music_output_def *p = unsmob_music_output_def ($3); p = p->clone (); - THIS->lexer_->scopes_.push (p->variable_tab_); + THIS->lexer_->add_scope (p->scope_); $$ = p; } | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER { Music_output_def *p = unsmob_music_output_def ($3); p = p->clone (); - THIS->lexer_->scopes_.push (p->variable_tab_); + THIS->lexer_->add_scope (p->scope_); $$ = p; } | music_output_def_body assignment { @@ -673,7 +670,7 @@ music_output_def_body: tempo_request: TEMPO steno_duration '=' bare_unsigned { - $$ = new Tempo_req; + $$ = MY_MAKE_MUSIC("TempoEvent"); $$->set_mus_property ("duration", $2); $$->set_mus_property ("metronome-count", gh_int2scm ( $4)); } @@ -687,11 +684,11 @@ The representation of a list is the to have efficient append. */ Music_list: /* empty */ { - $$ = gh_cons (SCM_EOL, SCM_EOL); + $$ = scm_cons (SCM_EOL, SCM_EOL); } | Music_list Music { SCM s = $$; - SCM c = gh_cons ($2->self_scm (), SCM_EOL); + SCM c = scm_cons ($2->self_scm (), SCM_EOL); scm_gc_unprotect_object ($2->self_scm ()); /* UGH */ if (gh_pair_p (ly_cdr (s))) gh_set_cdr_x (ly_cdr (s), c); /* append */ @@ -731,7 +728,14 @@ Repeated_music: alts = ly_truncate_list (times, alts); } - Repeated_music * r = new Repeated_music (SCM_EOL); + + static SCM proc; + if (!proc) + proc = scm_c_eval_string ("make-repeated-music"); + + SCM mus = scm_call_1 (proc, $2); + scm_gc_protect_object (mus); // UGH. + Music *r =unsmob_music (mus); if (beg) { r-> set_mus_property ("element", beg->self_scm ()); @@ -740,23 +744,18 @@ Repeated_music: r->set_mus_property ("repeat-count", gh_int2scm (times >? 1)); r-> set_mus_property ("elements",alts); - SCM func = scm_primitive_eval (ly_symbol2scm ("repeat-name-to-ctor")); - SCM result = gh_call1 (func, $2); - if (gh_equal_p ($2, scm_makfrom0str ("tremolo"))) { /* we can not get durations and other stuff correct down the line, so we have to add to the duration log here. - - TODO: do dots. */ SCM func = scm_primitive_eval (ly_symbol2scm ("shift-duration-log")); - gh_call2 (func, r->self_scm (), gh_int2scm(-intlog2 ($3))); + if (($3 % 3) == 0) + gh_call3 (func, r->self_scm (), gh_int2scm(-intlog2 ($3*2/3)),gh_int2scm(1)); + else + gh_call3 (func, r->self_scm (), gh_int2scm(-intlog2 ($3)), gh_int2scm(0)); } - - set_music_properties (r, result); - r->set_spot (*$4->origin ()); $$ = r; @@ -765,12 +764,12 @@ Repeated_music: Sequential_music: SEQUENTIAL '{' Music_list '}' { - $$ = new Sequential_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("SequentialMusic"); $$->set_mus_property ("elements", ly_car ($3)); $$->set_spot(THIS->here_input()); } | '{' Music_list '}' { - $$ = new Sequential_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("SequentialMusic"); $$->set_mus_property ("elements", ly_car ($2)); $$->set_spot(THIS->here_input()); } @@ -778,13 +777,13 @@ Sequential_music: Simultaneous_music: SIMULTANEOUS '{' Music_list '}'{ - $$ = new Simultaneous_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("SimultaneousMusic"); $$->set_mus_property ("elements", ly_car ($3)); $$->set_spot(THIS->here_input()); } | '<' Music_list '>' { - $$ = new Simultaneous_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("SimultaneousMusic"); $$->set_mus_property ("elements", ly_car ($2)); $$->set_spot(THIS->here_input()); } @@ -798,18 +797,16 @@ Simple_music: { THIS->parser_error (_ ("Second argument must be a symbol")); } - /*hould check # args */ + /* Should check # args */ if (!gh_procedure_p (pred)) { - THIS->parser_error (_ ("First argument must be a procedure taking 1 argument")); + THIS->parser_error (_ ("First argument must be a procedure taking one argument")); } - Music *m = new Music (SCM_EOL); + Music*m = MY_MAKE_MUSIC("OutputPropertySetMusic"); m->set_mus_property ("predicate", pred); m->set_mus_property ("grob-property", $3); m->set_mus_property ("grob-value", $5); - m->set_mus_property ("iterator-ctor", - Output_property_music_iterator::constructor_cxx_function); $$ = m; } @@ -825,7 +822,8 @@ Simple_music: Composite_music: CONTEXT STRING Music { - Context_specced_music *csm = new Context_specced_music (SCM_EOL); + Music*csm =MY_MAKE_MUSIC("ContextSpeccedMusic"); + csm->set_mus_property ("element", $3->self_scm ()); scm_gc_unprotect_object ($3->self_scm ()); @@ -835,9 +833,8 @@ Composite_music: $$ = csm; } | AUTOCHANGE STRING Music { - Music * chm = new Music_wrapper (SCM_EOL); + Music*chm = MY_MAKE_MUSIC("AutoChangeMusic"); chm->set_mus_property ("element", $3->self_scm ()); - chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_cxx_function); scm_gc_unprotect_object ($3->self_scm ()); chm->set_mus_property ("what", $2); @@ -860,31 +857,34 @@ Composite_music: SCM ms = SCM_EOL; if (stopm) { stopm = stopm->clone (); - ms = gh_cons (stopm->self_scm (), ms); + ms = scm_cons (stopm->self_scm (), ms); scm_gc_unprotect_object (stopm->self_scm ()); } - ms = gh_cons ($2->self_scm (), ms); + ms = scm_cons ($2->self_scm (), ms); scm_gc_unprotect_object ($2->self_scm()); if (startm) { startm = startm->clone (); - ms = gh_cons (startm->self_scm () , ms); + ms = scm_cons (startm->self_scm () , ms); scm_gc_unprotect_object (startm->self_scm ()); } - Music* seq = new Sequential_music (SCM_EOL); + + Music* seq = MY_MAKE_MUSIC("SequentialMusic"); seq->set_mus_property ("elements", ms); - $$ = new Grace_music (SCM_EOL); + + $$ = MY_MAKE_MUSIC("GraceMusic"); $$->set_mus_property ("element", seq->self_scm ()); scm_gc_unprotect_object (seq->self_scm ()); #else - $$ = new Grace_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("GraceMusic"); $$->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); + Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); + csm->set_mus_property ("element", $5->self_scm ()); scm_gc_unprotect_object ($5->self_scm ()); @@ -902,7 +902,7 @@ Composite_music: { int n = gh_scm2int (ly_car ($3)); int d = gh_scm2int (ly_cdr ($3)); Music *mp = $4; - $$ = new Time_scaled_music (SCM_EOL); + $$= MY_MAKE_MUSIC("TimeScaledMusic"); $$->set_spot (THIS->pop_spot ()); @@ -917,7 +917,7 @@ Composite_music: | Simultaneous_music { $$ = $1; } | Sequential_music { $$ = $1; } | TRANSPOSE pitch Music { - $$ = new Transposed_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("TransposedMusic"); Music *p = $3; Pitch pit = *unsmob_pitch ($2); @@ -926,7 +926,7 @@ Composite_music: scm_gc_unprotect_object (p->self_scm ()); } | TRANSPOSE steno_tonic_pitch Music { - $$ = new Transposed_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("TransposedMusic"); Music *p = $3; Pitch pit = *unsmob_pitch ($2); @@ -940,7 +940,7 @@ Composite_music: Music *m = unsmob_music (ret); if (!m) { THIS->parser_error ("\\apply must return a Music"); - m = new Music (SCM_EOL); + m = MY_MAKE_MUSIC("Music"); } $$ = m; } @@ -954,7 +954,7 @@ Composite_music: { THIS->lexer_->push_figuredbass_state (); } Music { - Music * chm = new Untransposable_music () ; + Music * chm = MY_MAKE_MUSIC("UntransposableMusic"); chm->set_mus_property ("element", $3->self_scm ()); $$ = chm; scm_gc_unprotect_object ($3->self_scm()); @@ -965,7 +965,7 @@ Composite_music: { THIS->lexer_->push_chord_state (); } Music { - Music * chm = new Un_relativable_music ; + Music * chm = MY_MAKE_MUSIC("UnrelativableMusic"); chm->set_mus_property ("element", $3->self_scm ()); scm_gc_unprotect_object ($3->self_scm()); $$ = chm; @@ -988,7 +988,7 @@ relative_music: RELATIVE absolute_pitch Music { Music * p = $3; Pitch pit = *unsmob_pitch ($2); - $$ = new Relative_octave_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("RelativeOctaveMusic"); $$->set_mus_property ("element", p->self_scm ()); scm_gc_unprotect_object (p->self_scm ()); @@ -1000,7 +1000,7 @@ relative_music: re_rhythmed_music: ADDLYRICS Music Music { - Lyric_combine_music * l = new Lyric_combine_music (SCM_EOL); + Music*l =MY_MAKE_MUSIC("LyricCombineMusic"); 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 ()); @@ -1010,8 +1010,7 @@ re_rhythmed_music: part_combined_music: PARTCOMBINE STRING Music Music { - Part_combine_music * p = new Part_combine_music (SCM_EOL); - + Music * p= MY_MAKE_MUSIC("PartCombineMusic"); p->set_mus_property ("what", $2); p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED)); @@ -1024,9 +1023,7 @@ part_combined_music: translator_change: TRANSLATOR STRING '=' STRING { - Music * t = new Music (SCM_EOL); - t->set_mus_property ("iterator-ctor", - Change_iterator::constructor_cxx_function); + Music*t= MY_MAKE_MUSIC("TranslatorChange"); t-> set_mus_property ("change-to-type", $2); t-> set_mus_property ("change-to-id", $4); @@ -1036,12 +1033,20 @@ translator_change: ; property_def: + simple_property_def + | ONCE simple_property_def { + $$ = $2; + SCM e = $2->get_mus_property ("element"); + unsmob_music (e)->set_mus_property ("once", SCM_BOOL_T); + } + ; + +simple_property_def: PROPERTY STRING '.' STRING '=' scalar { - Music *t = set_property_music (scm_string_to_symbol ($4), $6); - Context_specced_music *csm = new Context_specced_music (SCM_EOL); + Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); - csm->set_mus_property ("element", t->self_scm ()); + csm->set_mus_property ("element", t->self_scm ()); scm_gc_unprotect_object (t->self_scm ()); $$ = csm; @@ -1050,13 +1055,11 @@ property_def: csm-> set_mus_property ("context-type", $2); } | PROPERTY STRING '.' STRING UNSET { - Music *t = new Music (SCM_EOL); - - t->set_mus_property ("iterator-ctor", - Property_unset_iterator::constructor_cxx_function); + + Music *t = MY_MAKE_MUSIC("PropertyUnset"); t->set_mus_property ("symbol", scm_string_to_symbol ($4)); - Context_specced_music *csm = new Context_specced_music (SCM_EOL); + Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); csm->set_mus_property ("element", t->self_scm ()); scm_gc_unprotect_object (t->self_scm ()); @@ -1066,14 +1069,21 @@ property_def: csm-> set_mus_property ("context-type", $2); } | PROPERTY STRING '.' STRING SET embedded_scm '=' embedded_scm { - Music *t = new Music (SCM_EOL); - t->set_mus_property ("iterator-ctor", - Push_property_iterator::constructor_cxx_function); + bool autobeam + = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings")); + bool itc = internal_type_checking_global_b; + Music *t = MY_MAKE_MUSIC("OverrideProperty"); + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("pop-first", SCM_BOOL_T); + if (autobeam) + internal_type_checking_global_b = false; t->set_mus_property ("grob-property", $6); + if (autobeam) + internal_type_checking_global_b = itc; t->set_mus_property ("grob-value", $8); - Context_specced_music *csm = new Context_specced_music (SCM_EOL); + + Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); csm->set_mus_property ("element", t->self_scm ()); scm_gc_unprotect_object (t->self_scm ()); $$ = csm; @@ -1081,14 +1091,26 @@ property_def: csm-> set_mus_property ("context-type", $2); } - | PROPERTY STRING '.' STRING OVERRIDE embedded_scm '=' embedded_scm { - Music *t = new Music (SCM_EOL); - t->set_mus_property ("iterator-ctor", - Push_property_iterator::constructor_cxx_function); + | PROPERTY STRING '.' STRING OVERRIDE + embedded_scm '=' embedded_scm + { + /* + UGH UGH UGH UGH. + */ + bool autobeam + = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings")); + bool itc = internal_type_checking_global_b; + + Music *t = MY_MAKE_MUSIC("OverrideProperty"); t->set_mus_property ("symbol", scm_string_to_symbol ($4)); + if (autobeam) + internal_type_checking_global_b = false; t->set_mus_property ("grob-property", $6); t->set_mus_property ("grob-value", $8); - Context_specced_music *csm = new Context_specced_music (SCM_EOL); + if (autobeam) + internal_type_checking_global_b = itc; + + Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); csm->set_mus_property ("element", t->self_scm ()); scm_gc_unprotect_object (t->self_scm ()); @@ -1096,15 +1118,22 @@ property_def: $$->set_spot (THIS->here_input ()); csm-> set_mus_property ("context-type", $2); + } | PROPERTY STRING '.' STRING REVERT embedded_scm { - Music *t = new Music (SCM_EOL); - t->set_mus_property ("iterator-ctor", - Pop_property_iterator::constructor_cxx_function); + Music *t = MY_MAKE_MUSIC("RevertProperty"); + bool autobeam + = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings")); + bool itc = internal_type_checking_global_b; + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); + if (autobeam) + internal_type_checking_global_b = false; t->set_mus_property ("grob-property", $6); - - Context_specced_music *csm = new Context_specced_music (SCM_EOL); + if (autobeam) + internal_type_checking_global_b = itc; + + Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); csm->set_mus_property ("element", t->self_scm ()); scm_gc_unprotect_object (t->self_scm ()); @@ -1144,68 +1173,65 @@ request_chord: command_element: command_req { - $$ = new Request_chord (SCM_EOL); - $$->set_mus_property ("elements", gh_cons ($1->self_scm (), SCM_EOL)); + $$ = MY_MAKE_MUSIC("RequestChord"); + $$->set_mus_property ("elements", scm_cons ($1->self_scm (), SCM_EOL)); scm_gc_unprotect_object ($1->self_scm()); $$-> 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", scm_makfrom0str ("ligature")); + Music *l = MY_MAKE_MUSIC("LigatureEvent"); + l->set_mus_property ("span-direction", gh_int2scm (START)); l->set_spot (THIS->here_input ()); - $$ = new Request_chord (SCM_EOL); - $$->set_mus_property ("elements", gh_cons (l->self_scm (), SCM_EOL)); + $$ = MY_MAKE_MUSIC("RequestChord"); + $$->set_mus_property ("elements", scm_cons (l->self_scm (), SCM_EOL)); scm_gc_unprotect_object (l->self_scm()); $$->set_spot (THIS->here_input ()); } | E_RIGHTSQUARE { - Span_req *l = new Span_req; - l->set_span_dir (STOP); - l->set_mus_property ("span-type", scm_makfrom0str ("ligature")); + Music *l = MY_MAKE_MUSIC("LigatureEvent"); + l->set_mus_property ("span-direction", gh_int2scm (STOP)); l->set_spot (THIS->here_input ()); - $$ = new Request_chord (SCM_EOL); - $$->set_mus_property ("elements", gh_cons (l->self_scm (), SCM_EOL)); + $$ = MY_MAKE_MUSIC("RequestChord"); + $$->set_mus_property ("elements", scm_cons (l->self_scm (), SCM_EOL)); $$->set_spot (THIS->here_input ()); scm_gc_unprotect_object (l->self_scm()); } | E_BACKSLASH { - $$ = new Music (gh_list (gh_cons (ly_symbol2scm ("name"), ly_symbol2scm ("separator")), SCM_UNDEFINED)); + $$ = MY_MAKE_MUSIC("VoiceSeparator"); $$->set_spot (THIS->here_input ()); } | '|' { - extern Music * get_barcheck(); - $$ = get_barcheck (); + $$ = MY_MAKE_MUSIC("BarCheck"); $$->set_spot (THIS->here_input ()); } | BAR STRING { Music *t = set_property_music (ly_symbol2scm ("whichBar"), $2); - Context_specced_music *csm = new Context_specced_music (SCM_EOL); + Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); csm->set_mus_property ("element", t->self_scm ()); scm_gc_unprotect_object (t->self_scm ()); $$ = csm; $$->set_spot (THIS->here_input ()); - csm->set_mus_property ("context-type", scm_makfrom0str ("Score")); + csm->set_mus_property ("context-type", scm_makfrom0str ("Timing")); } | PARTIAL duration_length { Moment m = - unsmob_duration ($2)->length_mom (); Music * p = set_property_music (ly_symbol2scm ( "measurePosition"),m.smobbed_copy ()); - Context_specced_music * sp = new Context_specced_music (SCM_EOL); + Music * sp = MY_MAKE_MUSIC("ContextSpeccedMusic"); sp->set_mus_property ("element", p->self_scm ()); scm_gc_unprotect_object (p->self_scm ()); $$ =sp ; - sp-> set_mus_property ("context-type", scm_makfrom0str ( "Score")); + sp-> set_mus_property ("context-type", scm_makfrom0str ("Timing")); } | CLEF STRING { SCM func = scm_primitive_eval (ly_symbol2scm ("clef-name-to-properties")); @@ -1213,15 +1239,15 @@ command_element: SCM l = SCM_EOL; for (SCM s = result ; gh_pair_p (s); s = ly_cdr (s)) { - Music * p = new Music (SCM_EOL); + Music * p = MY_MAKE_MUSIC("Music"); set_music_properties (p, ly_car (s)); - l = gh_cons (p->self_scm (), l); + l = scm_cons (p->self_scm (), l); scm_gc_unprotect_object (p->self_scm ()); } - Sequential_music * seq = new Sequential_music (SCM_EOL); + Music * seq = MY_MAKE_MUSIC("SequentialMusic"); seq->set_mus_property ("elements", l); - Context_specced_music * sp = new Context_specced_music (SCM_EOL); + Music * sp = MY_MAKE_MUSIC("ContextSpeccedMusic"); sp->set_mus_property ("element", seq->self_scm ()); scm_gc_unprotect_object (seq->self_scm ()); @@ -1242,15 +1268,13 @@ command_element: Music *p3 = set_property_music (ly_symbol2scm ("beatLength"), one_beat.smobbed_copy ()); SCM list = scm_list_n (p1->self_scm (), p2->self_scm (), p3->self_scm(), SCM_UNDEFINED); - Sequential_music *seq = new Sequential_music (SCM_EOL); + Music *seq = MY_MAKE_MUSIC("SequentialMusic"); seq->set_mus_property ("elements", list); - Context_specced_music * sp = new Context_specced_music (SCM_EOL); + Music * sp = MY_MAKE_MUSIC("ContextSpeccedMusic"); sp->set_mus_property ("element", seq->self_scm ()); - - scm_gc_unprotect_object (p3->self_scm ()); scm_gc_unprotect_object (p2->self_scm ()); scm_gc_unprotect_object (p1->self_scm ()); @@ -1258,11 +1282,7 @@ command_element: $$ = sp; -/* - TODO: should make alias TimingContext for Score -*/ - - sp-> set_mus_property ("context-type", scm_makfrom0str ( "Score")); + sp-> set_mus_property ("context-type", scm_makfrom0str ( "Timing")); } ; @@ -1279,60 +1299,58 @@ shorthand_command_req: $$ = $1; } | '~' { - $$ = new Tie_req; + $$ = MY_MAKE_MUSIC("TieEvent"); } | '[' { - Span_req*b= new Span_req; - b->set_span_dir (START); - b->set_mus_property ("span-type", scm_makfrom0str ("beam")); + Music *b= MY_MAKE_MUSIC("BeamEvent"); + b->set_mus_property ("span-direction", gh_int2scm (START)) +; $$ =b; THIS->last_beam_start_ = b->self_scm (); } | ']' { - Span_req*b= new Span_req; - b->set_span_dir ( STOP); - b->set_mus_property ("span-type", scm_makfrom0str ("beam")); + Music *b= MY_MAKE_MUSIC("BeamEvent"); + b->set_mus_property ("span-direction", gh_int2scm (STOP)); $$ = b; } | BREATHE { - $$ = new Breathing_sign_req; + $$ = MY_MAKE_MUSIC("BreathingSignEvent"); } | E_TILDE { - $$ = new Porrectus_req; + $$ = MY_MAKE_MUSIC("PorrectusEvent"); } ; verbose_command_req: - COMMANDSPANREQUEST bare_int STRING { /*TODO: junkme */ - Span_req * sp = new Span_req; - sp-> set_span_dir ( Direction ($2)); - sp->set_mus_property ("span-type",$3); + COMMANDSPANREQUEST bare_int STRING { + Music *sp = make_span_req ($3); + sp->set_mus_property ("span-direction", gh_int2scm (Direction ($2))); sp->set_spot (THIS->here_input ()); $$ = sp; } | MARK DEFAULT { - Mark_req * m = new Mark_req; + Music * m = MY_MAKE_MUSIC("MarkEvent"); $$ = m; } | MARK scalar { - Mark_req *m = new Mark_req; + Music *m = MY_MAKE_MUSIC("MarkEvent"); m->set_mus_property ("label", $2); $$ = m; } | PENALTY SCM_T { - Break_req * b = new Break_req; + Music * b = MY_MAKE_MUSIC("BreakEvent"); SCM s = $2; if (!gh_number_p (s)) - s =gh_int2scm (0); + s = gh_int2scm (0); b->set_mus_property ("penalty", s); b->set_spot (THIS->here_input ()); $$ = b; } | SKIP duration_length { - Skip_req * skip = new Skip_req; + Music * skip = MY_MAKE_MUSIC("SkipEvent"); skip->set_mus_property ("duration", $2); $$ = skip; @@ -1341,11 +1359,11 @@ verbose_command_req: $$ = $1; } | KEY DEFAULT { - Key_change_req *key= new Key_change_req; + Music *key= MY_MAKE_MUSIC("KeyChangeEvent"); $$ = key; } | KEY NOTENAME_PITCH SCM_IDENTIFIER { - Key_change_req *key= new Key_change_req; + Music *key= MY_MAKE_MUSIC("KeyChangeEvent"); key->set_mus_property ("pitch-alist", $3); ((Music*)key)->transpose (* unsmob_pitch ($2)); @@ -1355,7 +1373,7 @@ verbose_command_req: post_requests: { - $$ = new Link_array; + $$ = new Link_array; } | post_requests post_request { $2->set_spot (THIS->here_input ()); @@ -1367,6 +1385,17 @@ post_request: verbose_request | request_with_dir | close_request + | string_request + ; + + +string_request: + E_UNSIGNED { + Music * s = MY_MAKE_MUSIC("StringNumberEvent"); + s->set_mus_property ("string-number", gh_int2scm($1)); + s->set_spot (THIS->here_input ()); + $$ = s; + } ; @@ -1375,7 +1404,7 @@ request_that_take_dir: | verbose_request | script_abbreviation { SCM s = THIS->lexer_->lookup_identifier ("dash" + ly_scm2string ($1)); - Articulation_req *a = new Articulation_req; + Music *a = MY_MAKE_MUSIC("ArticulationEvent"); if (gh_string_p (s)) a->set_mus_property ("articulation-type", s); else THIS->parser_error (_ ("Expecting string as script definition")); @@ -1385,24 +1414,21 @@ request_that_take_dir: request_with_dir: script_dir request_that_take_dir { - if (Script_req * gs = dynamic_cast ($2)) - gs->set_direction (Direction ($1)); - else if ($1) - $2->origin ()->warning (_ ("Can't specify direction for this request")); + $2->set_mus_property ("direction", gh_int2scm ($1)); $$ = $2; } ; verbose_request: REQUEST_IDENTIFIER { - $$ = dynamic_cast (unsmob_music ($1)->clone ()); + $$ = unsmob_music ($1)->clone (); $$->set_spot (THIS->here_input ()); } | DYNAMICSCRIPT embedded_scm { /* TODO: junkme, use text-type == dynamic */ - Text_script_req *d = new Text_script_req; + Music *d = MY_MAKE_MUSIC("TextScriptEvent"); SCM dyn = ly_symbol2scm ("dynamic"); d->set_mus_property ("text-type" , dyn); d->set_mus_property ("text", $2); @@ -1410,34 +1436,35 @@ verbose_request: $$ = d; } | SPANREQUEST bare_int STRING { - Span_req * sp = new Span_req; - sp->set_span_dir ( Direction ($2)); - sp->set_mus_property ("span-type", $3); + + Music * sp = make_span_req ($3); + sp->set_mus_property ("span-direction", gh_int2scm ( $2)); sp->set_spot (THIS->here_input ()); $$ = sp; } | tremolo_type { - Tremolo_req* a = new Tremolo_req; + Music * a = MY_MAKE_MUSIC("TremoloEvent"); a->set_spot (THIS->here_input ()); a->set_mus_property ("tremolo-type", gh_int2scm ($1)); $$ = a; } | SCRIPT STRING { - Articulation_req * a = new Articulation_req; + Music * a = MY_MAKE_MUSIC("ArticulationEvent"); a->set_mus_property ("articulation-type", $2); a->set_spot (THIS->here_input ()); $$ = a; } + /* -duh, junk this syntax from the parser, if possible. + duh, junk this syntax from the parser, if possible. */ | ARPEGGIO { - Arpeggio_req *a = new Arpeggio_req; + Music *a = MY_MAKE_MUSIC("ArpeggioEvent"); a->set_spot (THIS->here_input ()); $$ = a; } | GLISSANDO { - Glissando_req *g = new Glissando_req; + Music *g = MY_MAKE_MUSIC("GlissandoEvent"); g->set_spot /* No pun intended */ (THIS->here_input ()); $$ = g; } @@ -1535,7 +1562,7 @@ extender_req: EXTENDER { if (!THIS->lexer_->lyric_state_b ()) THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); - $$ = new Extender_req; + $$ = MY_MAKE_MUSIC("ExtenderEvent"); } ; @@ -1543,40 +1570,37 @@ hyphen_req: HYPHEN { if (!THIS->lexer_->lyric_state_b ()) THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); - $$ = new Hyphen_req; + $$ = MY_MAKE_MUSIC("HyphenEvent"); } ; close_request: close_request_parens { $$ = $1; - dynamic_cast ($$)->set_span_dir ( START); + dynamic_cast ($$)->set_mus_property ("span-direction", gh_int2scm (START)) +; } ; close_request_parens: '(' { - Span_req* s= new Span_req; + Music * s= MY_MAKE_MUSIC("SlurEvent"); $$ = s; - s->set_mus_property ("span-type", scm_makfrom0str ( "slur")); s->set_spot (THIS->here_input()); } | E_OPEN { - Span_req* s= new Span_req; + Music * s= MY_MAKE_MUSIC("PhrasingSlurEvent"); $$ = s; - s->set_mus_property ("span-type", scm_makfrom0str ( "phrasing-slur")); s->set_spot (THIS->here_input()); } | E_SMALLER { - Span_req*s =new Span_req; + Music *s =MY_MAKE_MUSIC("CrescendoEvent"); $$ = s; - s->set_mus_property ("span-type", scm_makfrom0str ( "crescendo")); s->set_spot (THIS->here_input()); } | E_BIGGER { - Span_req*s =new Span_req; + Music *s =MY_MAKE_MUSIC("DecrescendoEvent"); $$ = s; - s->set_mus_property ("span-type", scm_makfrom0str ("decrescendo")); s->set_spot (THIS->here_input()); } ; @@ -1585,27 +1609,26 @@ close_request_parens: open_request: open_request_parens { $$ = $1; - dynamic_cast ($$)->set_span_dir (STOP); + dynamic_cast ($$)->set_mus_property ("span-direction", gh_int2scm (STOP)) +; } ; open_request_parens: E_EXCLAMATION { - Span_req *s = new Span_req; - s->set_mus_property ("span-type", scm_makfrom0str ( "crescendo")); + Music *s = MY_MAKE_MUSIC("CrescendoEvent"); s->set_spot (THIS->here_input()); $$ = s; } | ')' { - Span_req* s= new Span_req; + Music * s= MY_MAKE_MUSIC("SlurEvent"); $$ = s; - s->set_mus_property ("span-type", scm_makfrom0str ( "slur")); s->set_spot (THIS->here_input()); } | E_CLOSE { - Span_req* s= new Span_req; + Music * s= MY_MAKE_MUSIC("PhrasingSlurEvent"); $$ = s; s->set_mus_property ("span-type", scm_makfrom0str ( "phrasing-slur")); s->set_spot (THIS->here_input()); @@ -1614,20 +1637,20 @@ open_request_parens: gen_text_def: embedded_scm { - Text_script_req *t = new Text_script_req; + Music *t = MY_MAKE_MUSIC("TextScriptEvent"); t->set_mus_property ("text", $1); t->set_spot (THIS->here_input ()); $$ = t; } | string { - Text_script_req *t = new Text_script_req; + Music *t = MY_MAKE_MUSIC("TextScriptEvent"); t->set_mus_property ("text", $1); t->set_spot (THIS->here_input ()); $$ = t; } | DIGIT { String ds = to_string ($1); - Text_script_req* t = new Text_script_req; + Music * t = MY_MAKE_MUSIC("TextScriptEvent"); SCM finger = ly_symbol2scm ("finger"); t->set_mus_property ("text", scm_makfrom0str (ds.to_str0 ())); t->set_mus_property ("text-type" , finger); @@ -1655,6 +1678,9 @@ script_abbreviation: | '.' { $$ = scm_makfrom0str ("Dot"); } + | '_' { + $$ = scm_makfrom0str ("Underscore"); + } ; script_dir: @@ -1665,7 +1691,7 @@ script_dir: pre_requests: { - $$ = new Link_array; + $$ = new Link_array; } | pre_requests open_request { $$->push ($2); @@ -1743,7 +1769,7 @@ multiplied_duration: fraction: FRACTION { $$ = $1; } | UNSIGNED '/' UNSIGNED { - $$ = gh_cons (gh_int2scm ($1), gh_int2scm ($3)); + $$ = scm_cons (gh_int2scm ($1), gh_int2scm ($3)); } ; @@ -1782,12 +1808,12 @@ bass_mod: bass_figure: FIGURE_SPACE { - Bass_figure_req *bfr = new Bass_figure_req; + Music *bfr = MY_MAKE_MUSIC("BassFigureEvent"); $$ = bfr->self_scm(); scm_gc_unprotect_object ($$); } | bass_number { - Bass_figure_req *bfr = new Bass_figure_req; + Music *bfr = MY_MAKE_MUSIC("BassFigureEvent"); $$ = bfr->self_scm(); bfr->set_mus_property ("figure", gh_int2scm ($1)); @@ -1826,13 +1852,13 @@ figure_list: $$ = SCM_EOL; } | figure_list br_bass_figure { - $$ = gh_cons ($2, $1); + $$ = scm_cons ($2, $1); } ; figure_spec: FIGURE_OPEN figure_list FIGURE_CLOSE { - Music * m = new Request_chord (SCM_EOL); + Music * m = MY_MAKE_MUSIC("RequestChord"); $2 = scm_reverse_x ($2, SCM_EOL); m->set_mus_property ("elements", $2); $$ = m->self_scm (); @@ -1854,9 +1880,9 @@ simple_element: Music *n = 0; if ($5) - n = new Rest_req ; + n = MY_MAKE_MUSIC("RestEvent"); else - n = new Note_req; + n = MY_MAKE_MUSIC("NoteEvent"); n->set_mus_property ("pitch", $1); n->set_mus_property ("duration", $4); @@ -1867,7 +1893,7 @@ simple_element: if ($2 % 2 || $3 % 2) n->set_mus_property ("force-accidental", SCM_BOOL_T); - Simultaneous_music*v = new Request_chord (SCM_EOL); + Music *v = MY_MAKE_MUSIC("RequestChord"); v->set_mus_property ("elements", scm_list_n (n->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object (n->self_scm()); @@ -1891,62 +1917,60 @@ simple_element: SCM e = SCM_UNDEFINED; if (ly_scm2string ($1) =="s") { /* Space */ - Skip_req * skip = new Skip_req; + Music * skip = MY_MAKE_MUSIC("SkipEvent"); skip->set_mus_property ("duration" ,$2); skip->set_spot (i); e = skip->self_scm (); } else { - Rest_req * rest_req = new Rest_req; + Music * rest_req = MY_MAKE_MUSIC("RestEvent"); rest_req->set_mus_property ("duration", $2); rest_req->set_spot (i); e = rest_req->self_scm (); } - Simultaneous_music* velt = new Request_chord (SCM_EOL); + Music * velt = MY_MAKE_MUSIC("RequestChord"); velt-> set_mus_property ("elements", scm_list_n (e,SCM_UNDEFINED)); velt->set_spot (i); $$ = velt; } | MULTI_MEASURE_REST optional_notemode_duration { - Input i = THIS->pop_spot (); + THIS->pop_spot (); - Skip_req * sk = new Skip_req; + Music * sk = MY_MAKE_MUSIC("SkipEvent"); sk->set_mus_property ("duration", $2); - Span_req *sp1 = new Span_req; - Span_req *sp2 = new Span_req; - sp1-> set_span_dir ( START); - sp2-> set_span_dir ( STOP); - SCM r = scm_makfrom0str ("rest"); - sp1->set_mus_property ("span-type", r); - sp2->set_mus_property ("span-type", r); - - Request_chord * rqc1 = new Request_chord (SCM_EOL); + Music *sp1 = MY_MAKE_MUSIC("MultiMeasureRestEvent"); + Music *sp2 = MY_MAKE_MUSIC("MultiMeasureRestEvent"); + sp1-> set_mus_property ("span-direction", gh_int2scm (START)) +; + sp2-> set_mus_property ("span-direction", gh_int2scm (STOP)) +; + Music *rqc1 = MY_MAKE_MUSIC("RequestChord"); rqc1->set_mus_property ("elements", scm_list_n (sp1->self_scm (), SCM_UNDEFINED)); - Request_chord * rqc2 = new Request_chord (SCM_EOL); + Music *rqc2 = MY_MAKE_MUSIC("RequestChord"); rqc2->set_mus_property ("elements", scm_list_n (sk->self_scm (), SCM_UNDEFINED));; - Request_chord * rqc3 = new Request_chord (SCM_EOL); + Music *rqc3 = MY_MAKE_MUSIC("RequestChord"); rqc3->set_mus_property ("elements", scm_list_n (sp2->self_scm (), SCM_UNDEFINED));; SCM ms = scm_list_n (rqc1->self_scm (), rqc2->self_scm (), rqc3->self_scm (), SCM_UNDEFINED); - $$ = new Sequential_music (SCM_EOL); + $$ = MY_MAKE_MUSIC("SequentialMusic"); $$->set_mus_property ("elements", ms); } | STRING optional_notemode_duration { Input i = THIS->pop_spot (); - Lyric_req* lreq = new Lyric_req; + Music * lreq = MY_MAKE_MUSIC("LyricEvent"); lreq->set_mus_property ("text", $1); lreq->set_mus_property ("duration",$2); lreq->set_spot (i); - Simultaneous_music* velt = new Request_chord (SCM_EOL); + Music * velt = MY_MAKE_MUSIC("RequestChord"); velt->set_mus_property ("elements", scm_list_n (lreq->self_scm (), SCM_UNDEFINED)); $$= velt; } | chord { - Input i = THIS->pop_spot (); + THIS->pop_spot (); if (!THIS->lexer_->chord_state_b ()) THIS->parser_error (_ ("Have to be in Chord mode for chords")); @@ -1993,7 +2017,7 @@ chord_inversion: { $$ = SCM_EOL; } - | '/' steno_tonic_pitch { + | CHORD_SLASH steno_tonic_pitch { $$ = $2; } ; @@ -2009,10 +2033,10 @@ chord_bass: chord_step: chord_note { - $$ = gh_cons ($1, SCM_EOL); + $$ = scm_cons ($1, SCM_EOL); } | CHORDMODIFIER_PITCH { - $$ = gh_cons (unsmob_pitch ($1)->smobbed_copy (), SCM_EOL); + $$ = scm_cons (unsmob_pitch ($1)->smobbed_copy (), SCM_EOL); } | CHORDMODIFIER_PITCH chord_note { /* Ugh. */ $$ = scm_list_n (unsmob_pitch ($1)->smobbed_copy (),