X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=86a1dbf40be75fd56b8f55fea4268a828cfbac5d;hb=cfd909d602dd851f367c6db0e402505cc0bf55aa;hp=ef36c806ea1ef7b3266883d0c27659439aab7b01;hpb=6ecc01fbd54016594f4fcd9891fb3aa75272d0a3;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index ef36c806ea..86a1dbf40b 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -84,7 +84,9 @@ TODO: #define MY_MAKE_MUSIC(x) make_music_by_name (ly_symbol2scm (x)) - +Music *property_op_to_music (SCM op); +Music *context_spec_music (SCM type, SCM id, Music * m, SCM ops_); +SCM get_next_unique_context (); #define YYERROR_VERBOSE 1 @@ -236,6 +238,7 @@ yylex (YYSTYPE *s, void * v) %token ACCEPTS %token ADDLYRICS +%token NEWADDLYRICS %token ALIAS %token ALTERNATIVE %token APPLY @@ -244,6 +247,7 @@ yylex (YYSTYPE *s, void * v) %token AUTOCHANGE %token BAR %token BREATHE +%token CHANGE %token CHORDMODIFIERS %token CHORDS %token LESSLESS @@ -300,7 +304,7 @@ yylex (YYSTYPE *s, void * v) %token TRANSPOSE %token TYPE %token UNSET - +%token WITH /* escaped */ %token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE @@ -313,6 +317,8 @@ yylex (YYSTYPE *s, void * v) %type exclamations questions dots optional_rest %type bass_mod %type grace_head +%type oct_check +%type context_mod_list %type lyric_element %type bass_number br_bass_figure bass_figure figure_list figure_spec %token DIGIT @@ -323,9 +329,7 @@ yylex (YYSTYPE *s, void * v) %token FRACTION %token IDENTIFIER %token CHORDNAMES - -%token CHORD_MODIFIER - +%token CHORD_MODIFIER %token SCORE_IDENTIFIER %token MUSIC_OUTPUT_DEF_IDENTIFIER %token NUMBER_IDENTIFIER @@ -340,6 +344,7 @@ yylex (YYSTYPE *s, void * v) %token MARKUP %token MARKUP_HEAD_MARKUP0 +%token MARKUP_HEAD_EMPTY %token MARKUP_HEAD_MARKUP0_MARKUP1 %token MARKUP_HEAD_SCM0 %token MARKUP_HEAD_SCM0_MARKUP1 @@ -377,8 +382,9 @@ 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 simple_property_def +%type music_property_def context_change %type Music_list +%type property_operation context_mod translator_mod optional_context_mod %type music_output_def_body %type shorthand_command_req %type post_event tagged_post_event @@ -586,61 +592,24 @@ translator_spec_block: translator_spec_body: /**/ { - $$ = Translator_def::make_scm (); - unsmob_translator_def ($$)->set_spot (THIS->here_input ()); + $$ = Context_def::make_scm (); + unsmob_context_def ($$)->set_spot (THIS->here_input ()); } | TRANSLATOR_IDENTIFIER { $$ = $1; - unsmob_translator_def ($$)-> set_spot (THIS->here_input ()); - } - | translator_spec_body TYPE STRING { - unsmob_translator_def ($$)->translator_group_type_ = $3; - } - | translator_spec_body DESCRIPTION string { - unsmob_translator_def ($$)->description_ = $3; - } - | translator_spec_body STRING '=' embedded_scm { - unsmob_translator_def ($$)->add_property_assign ($2, $4); - } - | translator_spec_body STRING OVERRIDE embedded_scm '=' embedded_scm { - unsmob_translator_def ($$) - ->add_push_property (scm_string_to_symbol ($2), $4, $6); - } - | translator_spec_body STRING SET embedded_scm '=' embedded_scm { - unsmob_translator_def ($$) - ->add_push_property (scm_string_to_symbol ($2), $4, $6); - } - | translator_spec_body STRING REVERT embedded_scm { - unsmob_translator_def ($$)->add_pop_property ( - scm_string_to_symbol ($2), $4); - } - | translator_spec_body NAME STRING { - unsmob_translator_def ($$)->type_name_ = scm_string_to_symbol ($3); - } - | translator_spec_body CONSISTS STRING { - unsmob_translator_def ($$)->add_element ($3); - } - | translator_spec_body ALIAS STRING { - Translator_def*td = unsmob_translator_def ($$); - td->type_aliases_ = scm_cons (scm_string_to_symbol ($3), td->type_aliases_); + unsmob_context_def ($$)->set_spot (THIS->here_input ()); } | 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)) - 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); - } - | translator_spec_body ACCEPTS STRING { - unsmob_translator_def ($$)->set_acceptor (scm_string_to_symbol ($3), true); - } - | translator_spec_body DENIES STRING { - unsmob_translator_def ($$)->set_acceptor (scm_string_to_symbol ($3), false); + Context_def*td = unsmob_context_def($$); + + for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p)) { + SCM tag = gh_caar (p); + td->add_context_mod (scm_list_n (ly_symbol2scm ("assign"), + tag, ly_cdar (p), SCM_UNDEFINED)); + } } - | translator_spec_body REMOVE STRING { - unsmob_translator_def ($$)->remove_element ($3); + | translator_spec_body context_mod { + unsmob_context_def ($$)->add_context_mod ($2); } ; @@ -915,30 +884,31 @@ Simple_music: | MUSIC_IDENTIFIER { $$ = unsmob_music ($1); } - | property_def - | translator_change + | music_property_def + | context_change ; +optional_context_mod: + /**/ { $$ = SCM_EOL; } + | WITH '{' context_mod_list '}' { $$ = $3; } + ; + grace_head: GRACE { $$ = scm_makfrom0str ("Grace"); } | ACCIACCATURA { $$ = scm_makfrom0str ("Acciaccatura"); } | APPOGGIATURA { $$ = scm_makfrom0str ("Appoggiatura"); } ; -Composite_music: - CONTEXT STRING Music { - Music*csm =MY_MAKE_MUSIC("ContextSpeccedMusic"); - - csm->set_mus_property ("element", $3->self_scm ()); - scm_gc_unprotect_object ($3->self_scm ()); - - csm->set_mus_property ("context-type", scm_string_to_symbol ($2)); - csm->set_mus_property ("context-id", scm_makfrom0str ("")); - - $$ = csm; +context_mod_list: + /* */ { $$ = SCM_EOL; } + | context_mod_list context_mod { + $$ = gh_cons ($2, $1); } - | AUTOCHANGE STRING Music { + ; + +Composite_music: + AUTOCHANGE STRING Music { Music*chm = MY_MAKE_MUSIC("AutoChangeMusic"); chm->set_mus_property ("element", $3->self_scm ()); chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_proc); @@ -1000,34 +970,18 @@ basic music objects too, since the meaning is different. scm_gc_unprotect_object ($2->self_scm ()); #endif } - | CONTEXT string '=' string Music { - Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); - - csm->set_mus_property ("element", $5->self_scm ()); - scm_gc_unprotect_object ($5->self_scm ()); - - csm->set_mus_property ("context-type", scm_string_to_symbol ($2)); - csm->set_mus_property ("context-id", $4); + | CONTEXT string '=' string optional_context_mod Music { + $$ = context_spec_music ($2, $4, $6, $5); - $$ = csm; } - | NEWCONTEXT string Music { - static int new_context_count; - - Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); - - csm->set_mus_property ("element", $3->self_scm ()); - scm_gc_unprotect_object ($3->self_scm ()); - - csm->set_mus_property ("context-type", scm_string_to_symbol ($2)); - - char s[1024]; - snprintf (s, 1024, "uniqueContext%d", new_context_count ++); - - SCM new_id = scm_makfrom0str (s); - csm->set_mus_property ("context-id", new_id); - $$ = csm; + | CONTEXT STRING optional_context_mod Music { + $$ = context_spec_music ($2, SCM_UNDEFINED, $4, $3); } + | NEWCONTEXT string optional_context_mod Music { + $$ = context_spec_music ($2, get_next_unique_context (), + $4, $3); + } + | TIMES { THIS->push_spot (); } @@ -1146,6 +1100,13 @@ re_rhythmed_music: scm_gc_unprotect_object ($2->self_scm ()); $$ = l; } + | NEWADDLYRICS string Music { + Music*l =MY_MAKE_MUSIC("NewLyricCombineMusic"); + l->set_mus_property ("element", $3->self_scm ()); + scm_gc_unprotect_object ($3->self_scm ()); + $$ = l; + l->set_mus_property ("associated-context", $2); + } ; part_combined_music: @@ -1161,8 +1122,8 @@ part_combined_music: } ; -translator_change: - TRANSLATOR STRING '=' STRING { +context_change: + CHANGE STRING '=' STRING { Music*t= MY_MAKE_MUSIC("TranslatorChange"); t-> set_mus_property ("change-to-type", scm_string_to_symbol ($2)); t-> set_mus_property ("change-to-id", $4); @@ -1172,111 +1133,55 @@ 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); +property_operation: + STRING '=' scalar { + $$ = scm_list_n (ly_symbol2scm ("assign"), + scm_string_to_symbol ($1), $3, SCM_UNDEFINED); } - ; - -simple_property_def: - PROPERTY STRING '.' STRING '=' scalar { - Music *t = set_property_music (scm_string_to_symbol ($4), $6); - 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_string_to_symbol ($2)); + | STRING UNSET { + $$ = scm_list_n (ly_symbol2scm ("unset"), + scm_string_to_symbol ($1), SCM_UNDEFINED); } - | PROPERTY STRING '.' STRING UNSET { - - Music *t = MY_MAKE_MUSIC("PropertyUnset"); - t->set_mus_property ("symbol", scm_string_to_symbol ($4)); - - 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_string_to_symbol ($2)); + | STRING SET embedded_scm '=' embedded_scm { + $$ = scm_list_n (ly_symbol2scm ("poppush"), + scm_string_to_symbol ($1), $3, $5, SCM_UNDEFINED); } - | PROPERTY STRING '.' STRING SET embedded_scm '=' embedded_scm { - 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); - - 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_string_to_symbol ($2)); + | STRING OVERRIDE embedded_scm '=' embedded_scm { + $$ = scm_list_n (ly_symbol2scm ("push"), + scm_string_to_symbol ($1), $3, $5, SCM_UNDEFINED); } - | 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; + | STRING REVERT embedded_scm { + $$ = scm_list_n (ly_symbol2scm ("pop"), + scm_string_to_symbol ($1), $3, SCM_UNDEFINED); + } + ; - 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); - if (autobeam) - internal_type_checking_global_b = itc; +translator_mod: + CONSISTSEND { $$ = ly_symbol2scm ("consists-end"); } + | CONSISTS { $$ = ly_symbol2scm ("consists"); } + | REMOVE { $$ = ly_symbol2scm ("remove"); } - Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); - csm->set_mus_property ("element", t->self_scm ()); - scm_gc_unprotect_object (t->self_scm ()); + | ACCEPTS { $$ = ly_symbol2scm ("accepts"); } + | DENIES { $$ = ly_symbol2scm ("denies"); } - $$ = csm; - $$->set_spot (THIS->here_input ()); - - csm-> set_mus_property ("context-type", scm_string_to_symbol ($2)); + | ALIAS { $$ = ly_symbol2scm ("alias"); } + | TYPE { $$ = ly_symbol2scm ("translator-type"); } + | DESCRIPTION { $$ = ly_symbol2scm ("description"); } + | NAME { $$ = ly_symbol2scm ("context-name"); } + ; +context_mod: + property_operation { $$ = $1; } + | translator_mod STRING { + $$ = scm_list_n ($1, $2, SCM_UNDEFINED); } - | PROPERTY STRING '.' STRING REVERT embedded_scm { - Music *t = MY_MAKE_MUSIC("RevertProperty"); - - /* - UGH. - */ - 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); - if (autobeam) - internal_type_checking_global_b = itc; - +music_property_def: + PROPERTY STRING '.' property_operation { + Music * t = property_op_to_music ($4); Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); + csm->set_mus_property ("element", t->self_scm ()); scm_gc_unprotect_object (t->self_scm ()); @@ -1285,6 +1190,11 @@ simple_property_def: csm-> set_mus_property ("context-type", scm_string_to_symbol ($2)); } + | ONCE music_property_def { + $$ = $2; + SCM e = $2->get_mus_property ("element"); + unsmob_music (e)->set_mus_property ("once", SCM_BOOL_T); + } ; @@ -1296,8 +1206,6 @@ scalar: | DIGIT { $$ = gh_int2scm ($1); } ; - - /* This is a trick: @@ -1628,11 +1536,13 @@ configurable, i.e. } | close_event { $$ = $1; - dynamic_cast ($$)->set_mus_property ("span-direction", gh_int2scm (START)); + dynamic_cast ($$)->set_mus_property ("span-direction", + gh_int2scm (START)); } | open_event { $$ = $1; - dynamic_cast ($$)->set_mus_property ("span-direction", gh_int2scm (STOP)); + dynamic_cast ($$)->set_mus_property ("span-direction", + gh_int2scm (STOP)); } | EVENT_IDENTIFIER { $$ = unsmob_music ($1); @@ -1658,7 +1568,14 @@ direction_reqd_event: $$ = a; } ; - + +oct_check: + /**/ { $$ = SCM_EOL; } + | '=' { $$ = gh_int2scm (0); } + | '=' sub_quotes { $$ = gh_int2scm ($2); } + | '=' sup_quotes { $$ = gh_int2scm ($2); } + ; + sup_quotes: '\'' { $$ = 1; @@ -1725,10 +1642,6 @@ pitch_also_in_chords: | steno_tonic_pitch ; - - - - hyphen_req: HYPHEN { if (!THIS->lexer_->lyric_state_b ()) @@ -2013,21 +1926,26 @@ optional_rest: ; simple_element: - pitch exclamations questions optional_notemode_duration optional_rest { + pitch exclamations questions oct_check optional_notemode_duration optional_rest { Input i = THIS->pop_spot (); if (!THIS->lexer_->note_state_b ()) THIS->parser_error (_ ("Have to be in Note mode for notes")); Music *n = 0; - if ($5) + if ($6) n = MY_MAKE_MUSIC("RestEvent"); else n = MY_MAKE_MUSIC("NoteEvent"); n->set_mus_property ("pitch", $1); - n->set_mus_property ("duration", $4); + n->set_mus_property ("duration", $5); + if (gh_number_p ($4)) + { + int q = gh_scm2int ($4); + n->set_mus_property ("absolute-octave", gh_int2scm (q-1)); + } if ($3 % 2) n->set_mus_property ("cautionary", SCM_BOOL_T); @@ -2305,6 +2223,9 @@ markup: STRING { $$ = make_simple_markup ($1); } + | MARKUP_HEAD_EMPTY { + $$ = scm_list_n ($1, SCM_UNDEFINED); + } | MARKUP_HEAD_MARKUP0 markup { $$ = scm_list_n ($1, $2, SCM_UNDEFINED); } @@ -2418,8 +2339,8 @@ My_lily_lexer::try_special_identifiers (SCM * destination, SCM sid) } else if (gh_number_p (sid)) { *destination = sid; return NUMBER_IDENTIFIER; - } else if (unsmob_translator_def (sid)) { - *destination = unsmob_translator_def (sid)->clone_scm(); + } else if (unsmob_context_def (sid)) { + *destination = unsmob_context_def (sid)->clone_scm(); return TRANSLATOR_IDENTIFIER; } else if (unsmob_score (sid)) { Score *sc = new Score (*unsmob_score (sid)); @@ -2447,3 +2368,88 @@ My_lily_lexer::try_special_identifiers (SCM * destination, SCM sid) return -1; } + +Music * +property_op_to_music (SCM op) +{ + Music * m = 0; + SCM tag = gh_car (op); + SCM symbol = gh_cadr (op); + SCM args = gh_cddr (op); + SCM grob_val = SCM_UNDEFINED; + SCM grob_sym = SCM_UNDEFINED; + SCM val = SCM_UNDEFINED; + + if (tag == ly_symbol2scm ("assign")) + { + m = MY_MAKE_MUSIC("PropertySet"); + val = gh_car (args); + } + else if (tag == ly_symbol2scm ("unset")) + m = MY_MAKE_MUSIC("PropertyUnset"); + else if (tag == ly_symbol2scm ("poppush") + || tag == ly_symbol2scm ("push")) + { + m = MY_MAKE_MUSIC("OverrideProperty"); + grob_sym = gh_car (args); + grob_val = gh_cadr (args); + } + else if (tag == ly_symbol2scm ("pop")) { + m = MY_MAKE_MUSIC("RevertProperty"); + grob_sym = gh_car (args); + } + + m->set_mus_property ("symbol", symbol); + + if (val != SCM_UNDEFINED) + m->set_mus_property ("value", val); + if (grob_val != SCM_UNDEFINED) + m->set_mus_property ("grob-value", grob_val); + + if (grob_sym != SCM_UNDEFINED) + { + bool itc = internal_type_checking_global_b; + /* UGH. + */ + bool autobeam = gh_equal_p (symbol, ly_symbol2scm ("autoBeamSettings")); + if (autobeam) + internal_type_checking_global_b = false; + m->set_mus_property ("grob-property", grob_sym); + if (autobeam) + internal_type_checking_global_b = itc; + } + + if (op == ly_symbol2scm ("poppush")) + m->set_mus_property ("pop-first", SCM_BOOL_T); + + + return m; +} + +Music* +context_spec_music (SCM type, SCM id, Music * m, SCM ops) +{ + Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic"); + + csm->set_mus_property ("element", m->self_scm ()); + scm_gc_unprotect_object (m->self_scm ()); + + csm->set_mus_property ("context-type", scm_string_to_symbol (type)); + csm->set_mus_property ("property-operations", ops); + + if (gh_string_p (id)) + csm->set_mus_property ("context-id", id); + return csm; +} + + +SCM +get_next_unique_context () +{ + static int new_context_count; + + char s[1024]; + snprintf (s, 1024, "uniqueContext%d", new_context_count ++); + + return scm_makfrom0str (s); +}