X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=881ea25c60accbbbbb4c0d6bcd7efbaa0c2c575e;hb=540390f466a6e881b5793ac1441e8e7a32ffa579;hp=3650603e31512af7c2b42d760cbe5b3f630e4341;hpb=955f829883aa125b2b633b1e71f6256da5b773fa;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index 3650603e31..881ea25c60 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -10,7 +10,7 @@ */ /* - Two shift/reduce problems: + Four shift/reduce problems: 1. foo = bar. @@ -19,6 +19,12 @@ "bar" -> String -> string-assignment +Similar problem for + + * \markup identifier. + * \markup { } + + 2. \repeat \repeat .. \alternative @@ -90,7 +96,23 @@ My_lily_parser* my_lily_parser; #define yyerror THIS->parser_error +/* + Add symbols to the TAGS field of a music object. +*/ +void +tag_music (Music*m, SCM tag, Input ip) +{ + SCM tags = m->get_mus_property ("tags"); + if (gh_symbol_p (tag)) + tags = scm_cons (tag, tags); + else if (gh_list_p (tag)) + tags = gh_append2 (tag, tags); + else + ip.warning (_("Tag must be symbol or list of symbols.")); + + m->set_mus_property ("tags", tags); +} @@ -210,72 +232,73 @@ yylex (YYSTYPE *s, void * v) %pure_parser -/* tokens which are not keywords */ -%token AUTOCHANGE + +%token ACCEPTS +%token ADDLYRICS %token ALIAS +%token ALTERNATIVE +%token APPLY %token APPLYCONTEXT %token APPLYOUTPUT -%token APPLY -%token ACCEPTS -%token ALTERNATIVE +%token AUTOCHANGE %token BAR %token BREATHE %token CHORDMODIFIERS %token CHORDS +%token LESSLESS +%token MOREMORE %token CLEF +%token COMMANDSPANREQUEST %token CONSISTS -%token DURATION -%token SEQUENTIAL -%token GROBDESCRIPTIONS -%token SIMULTANEOUS %token CONSISTSEND +%token CONTEXT +%token DEFAULT %token DENIES %token DESCRIPTION %token EXTENDER %token FIGURES FIGURE_OPEN FIGURE_CLOSE %token FIGURE_BRACKET_CLOSE FIGURE_BRACKET_OPEN %token GRACE +%token ACCIACCATURA +%token APPOGGIATURA +%token GROBDESCRIPTIONS %token HEADER %token HYPHEN %token INVALID %token KEY %token LYRICS %token MARK -%token MULTI_MEASURE_REST %token MIDI -%token PITCH -%token DEFAULT +%token MULTI_MEASURE_REST %token NAME -%token PITCHNAMES +%token NEWCONTEXT %token NOTES +%token OCTAVE %token ONCE +%token OVERRIDE SET REVERT %token PAPER +%token PARTCOMBINE %token PARTIAL +%token PITCHNAMES %token PROPERTY -%token OVERRIDE SET REVERT %token RELATIVE %token REMOVE %token REPEAT -%token ADDLYRICS -%token PARTCOMBINE +%token REST %token SCM_T %token SCORE +%token SEQUENTIAL +%token SIMULTANEOUS %token SKIP %token SPANREQUEST -%token COMMANDSPANREQUEST +%token TAG %token TEMPO -%token OUTPUTPROPERTY -%token OCTAVE -%token TIME_T %token TIMES +%token TIME_T %token TRANSLATOR %token TRANSPOSE %token TYPE %token UNSET -%token CONTEXT -%token REST -%token CHORD_OPEN -%token CHORD_CLOSE /* escaped */ @@ -288,6 +311,8 @@ yylex (YYSTYPE *s, void * v) %type exclamations questions dots optional_rest %type bass_mod +%type grace_head +%type lyric_element %type bass_number br_bass_figure bass_figure figure_list figure_spec %token DIGIT %token NOTENAME_PITCH @@ -339,12 +364,11 @@ yylex (YYSTYPE *s, void * v) %type note_chord_element chord_body chord_body_element %type chord_body_elements %type steno_duration optional_notemode_duration multiplied_duration -%type verbose_duration -%type post_events +%type post_events %type gen_text_def direction_less_event direction_reqd_event %type steno_pitch pitch absolute_pitch pitch_also_in_chords -%type explicit_pitch steno_tonic_pitch +%type steno_tonic_pitch %type duration_length fraction %type new_chord step_number chord_items chord_item chord_separator step_numbers @@ -356,7 +380,7 @@ yylex (YYSTYPE *s, void * v) %type Music_list %type music_output_def_body %type shorthand_command_req -%type post_event +%type post_event tagged_post_event %type command_req verbose_command_req %type extender_req %type hyphen_req @@ -513,9 +537,6 @@ identifier_init: $$ = $1->self_scm (); scm_gc_unprotect_object ($$); } - | verbose_duration { - $$ = $1; - } | number_expression { $$ = $1; } @@ -564,14 +585,14 @@ translator_spec_body: scm_string_to_symbol ($2), $4); } | translator_spec_body NAME STRING { - unsmob_translator_def ($$)->type_name_ = $3; + 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 ($3, td->type_aliases_); + td->type_aliases_ = scm_cons (scm_string_to_symbol ($3), td->type_aliases_); } | translator_spec_body GROBDESCRIPTIONS embedded_scm { Translator_def*td = unsmob_translator_def($$); @@ -583,10 +604,10 @@ translator_spec_body: unsmob_translator_def ($$)->add_last_element ( $3); } | translator_spec_body ACCEPTS STRING { - unsmob_translator_def ($$)->set_acceptor ($3,true); + unsmob_translator_def ($$)->set_acceptor (scm_string_to_symbol ($3), true); } | translator_spec_body DENIES STRING { - unsmob_translator_def ($$)->set_acceptor ($3,false); + unsmob_translator_def ($$)->set_acceptor (scm_string_to_symbol ($3), false); } | translator_spec_body REMOVE STRING { unsmob_translator_def ($$)->remove_element ($3); @@ -842,7 +863,7 @@ Simultaneous_music: $$->set_spot(THIS->here_input()); } - | '<' Music_list '>' { + | simul_open Music_list simul_close { $$ = MY_MAKE_MUSIC("SimultaneousMusic"); $$->set_mus_property ("elements", ly_car ($2)); $$->set_spot(THIS->here_input()); @@ -865,25 +886,6 @@ Simple_music: $$->set_mus_property ("procedure", $2); $$->set_spot (THIS->here_input()); } - | OUTPUTPROPERTY embedded_scm embedded_scm '=' embedded_scm { - SCM pred = $2; - if (!gh_symbol_p ($3)) - { - THIS->parser_error (_ ("Second argument must be a symbol")); - } - /* Should check # args */ - if (!gh_procedure_p (pred)) - { - THIS->parser_error (_ ("First argument must be a procedure taking one argument")); - } - - 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; - } | MUSIC_IDENTIFIER { $$ = unsmob_music ($1); } @@ -892,6 +894,13 @@ Simple_music: ; +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"); @@ -899,7 +908,7 @@ Composite_music: csm->set_mus_property ("element", $3->self_scm ()); scm_gc_unprotect_object ($3->self_scm ()); - csm->set_mus_property ("context-type",$2); + csm->set_mus_property ("context-type", scm_string_to_symbol ($2)); csm->set_mus_property ("context-id", scm_makfrom0str ("")); $$ = csm; @@ -910,20 +919,31 @@ Composite_music: chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_proc); scm_gc_unprotect_object ($3->self_scm ()); - chm->set_mus_property ("what", $2); + chm->set_mus_property ("what", scm_string_to_symbol ($2)); $$ = chm; chm->set_spot (*$3->origin ()); } - | GRACE Music { + | grace_head Music { #if 1 /* The other version is for easier debugging of Sequential_music_iterator in combination with grace notes. */ - SCM start = THIS->lexer_->lookup_identifier ("startGraceMusic"); - SCM stop = THIS->lexer_->lookup_identifier ("stopGraceMusic"); +/* + +TODO: should distinguish between both grace types in the +basic music objects too, since the meaning is different. + +*/ + + String start_str = "start" + ly_scm2string ($1) + "Music"; + String stop_str = "stop" + ly_scm2string ($1) + "Music"; + + SCM start = THIS->lexer_->lookup_identifier (start_str); + SCM stop = THIS->lexer_->lookup_identifier (stop_str); + Music *startm = unsmob_music (start); Music *stopm = unsmob_music (stop); @@ -961,11 +981,28 @@ Composite_music: csm->set_mus_property ("element", $5->self_scm ()); scm_gc_unprotect_object ($5->self_scm ()); - csm->set_mus_property ("context-type", $2); + csm->set_mus_property ("context-type", scm_string_to_symbol ($2)); csm->set_mus_property ("context-id", $4); $$ = 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; + } | TIMES { THIS->push_spot (); } @@ -975,9 +1012,9 @@ Composite_music: { int n = gh_scm2int (ly_car ($3)); int d = gh_scm2int (ly_cdr ($3)); Music *mp = $4; - $$= MY_MAKE_MUSIC("TimeScaledMusic"); - $$->set_spot (THIS->pop_spot ()); + $$= MY_MAKE_MUSIC("TimeScaledMusic"); + $$->set_spot (THIS->pop_spot ()); $$->set_mus_property ("element", mp->self_scm ()); scm_gc_unprotect_object (mp->self_scm ()); @@ -1048,7 +1085,11 @@ Composite_music: } | relative_music { $$ = $1; } | re_rhythmed_music { $$ = $1; } - | part_combined_music { $$ = $1; } + | part_combined_music { $$ = $1; } + | TAG embedded_scm Music { + tag_music ($3, $2, THIS->here_input ()); + $$ = $3; + } ; relative_music: @@ -1061,9 +1102,9 @@ relative_music: scm_gc_unprotect_object (p->self_scm ()); + Pitch retpitch = p->to_relative_octave (pit); if (lily_1_8_relative) - $$->set_mus_property ("last-pitch", p->to_relative_octave (pit).smobbed_copy ()); - + $$->set_mus_property ("last-pitch", retpitch.smobbed_copy ()); } ; @@ -1079,8 +1120,8 @@ re_rhythmed_music: part_combined_music: PARTCOMBINE STRING Music Music { - Music * p= MY_MAKE_MUSIC("PartCombineMusic"); - p->set_mus_property ("what", $2); + Music * p= MY_MAKE_MUSIC("PartCombineMusic"); + p->set_mus_property ("what", scm_string_to_symbol ($2)); p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); @@ -1093,7 +1134,7 @@ part_combined_music: translator_change: TRANSLATOR STRING '=' STRING { Music*t= MY_MAKE_MUSIC("TranslatorChange"); - t-> set_mus_property ("change-to-type", $2); + t-> set_mus_property ("change-to-type", scm_string_to_symbol ($2)); t-> set_mus_property ("change-to-id", $4); $$ = t; @@ -1121,7 +1162,7 @@ simple_property_def: $$ = csm; $$->set_spot (THIS->here_input ()); - csm-> set_mus_property ("context-type", $2); + csm-> set_mus_property ("context-type", scm_string_to_symbol ($2)); } | PROPERTY STRING '.' STRING UNSET { @@ -1135,7 +1176,7 @@ simple_property_def: $$ = csm; $$->set_spot (THIS->here_input ()); - csm-> set_mus_property ("context-type", $2); + csm-> set_mus_property ("context-type", scm_string_to_symbol ($2)); } | PROPERTY STRING '.' STRING SET embedded_scm '=' embedded_scm { bool autobeam @@ -1157,7 +1198,7 @@ simple_property_def: $$ = csm; $$->set_spot (THIS->here_input ()); - csm-> set_mus_property ("context-type", $2); + csm-> set_mus_property ("context-type", scm_string_to_symbol ($2)); } | PROPERTY STRING '.' STRING OVERRIDE embedded_scm '=' embedded_scm @@ -1185,7 +1226,7 @@ simple_property_def: $$ = csm; $$->set_spot (THIS->here_input ()); - csm-> set_mus_property ("context-type", $2); + csm-> set_mus_property ("context-type", scm_string_to_symbol ($2)); } | PROPERTY STRING '.' STRING REVERT embedded_scm { @@ -1208,7 +1249,7 @@ simple_property_def: $$ = csm; $$->set_spot (THIS->here_input ()); - csm-> set_mus_property ("context-type", $2); + csm-> set_mus_property ("context-type", scm_string_to_symbol ($2)); } ; @@ -1276,8 +1317,20 @@ note_chord_element: } ; +chord_open: '<' + ; + +chord_close: '>' + ; + +simul_open: LESSLESS + ; + +simul_close: MOREMORE + ; + chord_body: - CHORD_OPEN chord_body_elements CHORD_CLOSE + chord_open chord_body_elements chord_close { $$ = MY_MAKE_MUSIC("EventChord"); $$->set_mus_property ("elements", @@ -1365,7 +1418,7 @@ command_element: $$ = csm; $$->set_spot (THIS->here_input ()); - csm->set_mus_property ("context-type", scm_makfrom0str ("Timing")); + csm->set_mus_property ("context-type", ly_symbol2scm ("Timing")); } | PARTIAL duration_length { Moment m = - unsmob_duration ($2)->get_length (); @@ -1376,7 +1429,7 @@ command_element: scm_gc_unprotect_object (p->self_scm ()); $$ =sp ; - sp-> set_mus_property ("context-type", scm_makfrom0str ("Timing")); + sp-> set_mus_property ("context-type", ly_symbol2scm ("Timing")); } | CLEF STRING { static SCM proc ; @@ -1466,20 +1519,33 @@ post_events: $$ = gh_cons ($2->self_scm(), $$); scm_gc_unprotect_object ($2->self_scm()); } + | post_events tagged_post_event { + $2 -> set_spot (THIS->here_input ()); + $$ = scm_cons ($2->self_scm(), $$); + scm_gc_unprotect_object ($2->self_scm()); + } ; +tagged_post_event: + '-' TAG embedded_scm post_event { + tag_music ($4, $3, THIS->here_input ()); + $$ = $4; + } + ; post_event: direction_less_event { $$ = $1; } | script_dir direction_reqd_event { - $2->set_mus_property ("direction", gh_int2scm ($1)); + if ($1) + $2->set_mus_property ("direction", gh_int2scm ($1)); $$ = $2; } | script_dir direction_less_event { - $2->set_mus_property ("direction", gh_int2scm ($1)); + if ($1) + $2->set_mus_property ("direction", gh_int2scm ($1)); $$ = $2; } | string_number_event @@ -1508,19 +1574,19 @@ configurable, i.e. (set-articulation '~ "trill") */ - Music * m = MY_MAKE_MUSIC ("NewBeamEvent"); + Music * m = MY_MAKE_MUSIC ("BeamEvent"); m->set_spot (THIS->here_input()); m->set_mus_property ("span-direction" , gh_int2scm (START)); $$ = m; } | ']' { - Music * m = MY_MAKE_MUSIC ("NewBeamEvent"); + Music * m = MY_MAKE_MUSIC ("BeamEvent"); m->set_spot (THIS->here_input()); m->set_mus_property ("span-direction" , gh_int2scm (STOP)); $$ = m; } | '~' { - Music * m = MY_MAKE_MUSIC ("NewTieEvent"); + Music * m = MY_MAKE_MUSIC ("TieEvent"); m->set_spot (THIS->here_input()); $$ = m; } @@ -1530,7 +1596,7 @@ configurable, i.e. } | 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); @@ -1616,9 +1682,6 @@ pitch: steno_pitch { $$ = $1; } - | explicit_pitch { - $$ = $1; - } ; pitch_also_in_chords: @@ -1626,26 +1689,9 @@ pitch_also_in_chords: | steno_tonic_pitch ; -explicit_pitch: - PITCH embedded_scm { - $$ = $2; - if (!unsmob_pitch ($2)) { - THIS->parser_error (_f ("Expecting musical-pitch value", 3)); - $$ = Pitch ().smobbed_copy (); - } - } - ; -verbose_duration: - DURATION embedded_scm { - $$ = $2; - if (!unsmob_duration ($2)) - { - THIS->parser_error (_ ("Must have duration object")); - $$ = Duration ().smobbed_copy (); - } - } - ; + + extender_req: EXTENDER { @@ -1771,9 +1817,6 @@ duration_length: multiplied_duration { $$ = $1; } - | verbose_duration { - $$ = $1; - } ; optional_notemode_duration: @@ -1789,10 +1832,6 @@ optional_notemode_duration: THIS->beam_check ($$); } - | verbose_duration { - $$ = $1; - THIS->default_duration_ = *unsmob_duration ($$); - } ; steno_duration: @@ -1871,7 +1910,7 @@ bass_number: | UNSIGNED { $$ = scm_number_to_string (gh_int2scm ($1), gh_int2scm (10)); } - | STRING { $$ = $1 } + | STRING { $$ = $1; } ; bass_mod: @@ -2017,8 +2056,11 @@ simple_element: scm_gc_protect_object (mus); $$ = unsmob_music (mus); } - | STRING optional_notemode_duration { + + | lyric_element optional_notemode_duration { Input i = THIS->pop_spot (); + if (!THIS->lexer_->lyric_state_b ()) + THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); Music * lreq = MY_MAKE_MUSIC("LyricEvent"); lreq->set_mus_property ("text", $1); @@ -2038,6 +2080,11 @@ simple_element: } ; +lyric_element: + full_markup { $$ = $1; } + | STRING { $$ = $1 ; } + ; + new_chord: steno_tonic_pitch optional_notemode_duration { $$ = make_chord ($1, $2, SCM_EOL); @@ -2261,7 +2308,7 @@ markup: ; markup_list: - CHORD_OPEN markup_list_body CHORD_CLOSE { $$ = scm_reverse_x ($2, SCM_EOL); } + chord_open markup_list_body chord_close { $$ = scm_reverse_x ($2, SCM_EOL); } ; markup_line: @@ -2327,13 +2374,6 @@ My_lily_parser::beam_check (SCM dur) -bool -markup_p (SCM x) -{ - return gh_pair_p (x) - && SCM_BOOL_F != scm_object_property (gh_car (x), ly_symbol2scm ("markup-signature")); -} - /* @@ -2372,7 +2412,7 @@ My_lily_lexer::try_special_identifiers (SCM * destination, SCM sid) *destination = p->self_scm(); return MUSIC_OUTPUT_DEF_IDENTIFIER; - } else if (new_markup_p (sid)) { + } else if (Text_item::markup_p (sid)) { *destination = sid; return MARKUP_IDENTIFIER; }