X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=dfbe3dfc32118fcab336f3b7680a54f662398258;hb=5cc390968095201b69f142ad01842ac3f08144a2;hp=aee249d7567cd4a186a4f8e45bc350b36c326c9a;hpb=3adcf6c67a62a5f8b15003a5450efc925f23405d;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index aee249d756..dfbe3dfc32 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -5,7 +5,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2003 Han-Wen Nienhuys + (c) 1997--2004 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -58,7 +58,7 @@ TODO: #include "scm-option.hh" -#include "translator-def.hh" +#include "context-def.hh" #include "lily-guile.hh" #include "misc.hh" #include "my-lily-lexer.hh" @@ -74,7 +74,6 @@ TODO: #include "input.hh" #include "lilypond-input-version.hh" #include "scm-hash.hh" -#include "auto-change-iterator.hh" #include "ly-modules.hh" #include "music-sequence.hh" #include "input-smob.hh" @@ -238,6 +237,7 @@ yylex (YYSTYPE *s, void * v) %token ACCEPTS %token ADDLYRICS +%token NEWADDLYRICS %token ALIAS %token ALTERNATIVE %token APPLY @@ -283,7 +283,6 @@ yylex (YYSTYPE *s, void * v) %token PAPER %token PARTCOMBINE %token PARTIAL -%token PITCHNAMES %token PROPERTY %token RELATIVE %token REMOVE @@ -316,6 +315,7 @@ 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 @@ -326,7 +326,8 @@ yylex (YYSTYPE *s, void * v) %token DURATION_IDENTIFIER %token FRACTION %token IDENTIFIER -%token CHORDNAMES +%token DRUMS +%token DRUM_PITCH %token CHORD_MODIFIER %token SCORE_IDENTIFIER %token MUSIC_OUTPUT_DEF_IDENTIFIER @@ -342,6 +343,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 @@ -378,22 +380,19 @@ 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 relative_music re_rhythmed_music %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 music_output_def_body music_output_def_head %type post_event tagged_post_event -%type command_req verbose_command_req -%type hyphen_req +%type command_req %type string_number_event %type string bare_number number_expression number_term number_factor %type score_block score_body %type translator_spec_block translator_spec_body %type tempo_event -%type notenames_body notenames_block chordmodifiers_block %type script_abbreviation @@ -419,13 +418,7 @@ lilypond: /* empty */ ; toplevel_expression: - notenames_block { - THIS->lexer_->pitchname_tab_ = $1; - } - | chordmodifiers_block { - THIS->lexer_->chordmodifier_tab_ = $1; - } - | lilypond_header { + lilypond_header { THIS->input_file_->header_ = $1; } | score_block { @@ -446,7 +439,7 @@ toplevel_expression: for (int i=0; i < sc->defs_.size (); i++) default_rendering (sc->music_, sc->defs_[i]->self_scm(),head, outname); - if (sc->defs_.empty ()) + if (sc->defs_.is_empty ()) { Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier @@ -461,10 +454,13 @@ toplevel_expression: scm_gc_unprotect_object (sc->self_scm()); } | output_def { + SCM id = SCM_EOL; if (dynamic_cast ($1)) - THIS->lexer_->set_identifier (scm_makfrom0str ("$defaultpaper"), $1->self_scm ()); + id = scm_makfrom0str ("$defaultpaper"); else if (dynamic_cast ($1)) - THIS->lexer_->set_identifier (scm_makfrom0str ("$defaultmidi"), $1->self_scm ()); + id = scm_makfrom0str ("$defaultmidi"); + THIS->lexer_->set_identifier (id, $1->self_scm ()); + scm_gc_unprotect_object ($1->self_scm ()); } ; @@ -474,26 +470,7 @@ embedded_scm: ; -chordmodifiers_block: - CHORDMODIFIERS notenames_body { $$ = $2; } - ; - -notenames_block: - PITCHNAMES notenames_body { $$ = $2; } - ; - -notenames_body: - embedded_scm { - int i = scm_ilength ($1); - SCM tab = scm_make_vector (gh_int2scm (i), SCM_EOL); - for (SCM s = $1; gh_pair_p (s); s = ly_cdr (s)) { - SCM pt = ly_cdar (s); - scm_hashq_set_x (tab, ly_caar (s), pt); - } - $$ = tab; - } - ; lilypond_header_body: { @@ -545,7 +522,6 @@ all objects can be unprotected as soon as they're here. ; - identifier_init: score_block { $$ = $1->self_scm (); @@ -589,7 +565,7 @@ translator_spec_block: translator_spec_body: /**/ { - $$ = Translator_def::make_scm (); + $$ = Context_def::make_scm (); unsmob_context_def ($$)->set_spot (THIS->here_input ()); } | TRANSLATOR_IDENTIFIER { @@ -597,12 +573,14 @@ translator_spec_body: unsmob_context_def ($$)->set_spot (THIS->here_input ()); } | translator_spec_body GROBDESCRIPTIONS embedded_scm { - Translator_def*td = unsmob_context_def($$); + Context_def*td = unsmob_context_def($$); for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p)) { SCM tag = gh_caar (p); + + /* TODO: should make new tag "grob-definition" ? */ td->add_context_mod (scm_list_n (ly_symbol2scm ("assign"), - tag, ly_cdar (p), SCM_UNDEFINED)); + tag, gh_cons (ly_cdar (p), SCM_EOL), SCM_UNDEFINED)); } } | translator_spec_body context_mod { @@ -642,7 +620,7 @@ score_body: } | SCORE_IDENTIFIER { - $$ = unsmob_score ($1); + $$ = new Score ( *unsmob_score ($1)); $$->set_spot (THIS->here_input ()); } | score_body lilypond_header { @@ -650,6 +628,7 @@ score_body: } | score_body output_def { $$->defs_.push ($2); + scm_gc_unprotect_object ($2->self_scm ()); } | score_body error { @@ -667,8 +646,8 @@ output_def: } ; -music_output_def_body: - MIDI '{' { +music_output_def_head: + MIDI { Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultmidi")); @@ -681,7 +660,7 @@ music_output_def_body: $$ = p; THIS->lexer_->add_scope (p->scope_); } - | PAPER '{' { + | PAPER { Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper")); Paper_def *p = 0; if (id) @@ -692,16 +671,18 @@ music_output_def_body: THIS->lexer_->add_scope (p->scope_); $$ = p; } - | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER { - Music_output_def * o = unsmob_music_output_def ($3); - $$ =o; + ; - THIS->lexer_->add_scope (o->scope_); + +music_output_def_body: + music_output_def_head '{' { + } - | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER { + | music_output_def_head '{' MUSIC_OUTPUT_DEF_IDENTIFIER { + scm_gc_unprotect_object ($1->self_scm ()); Music_output_def * o = unsmob_music_output_def ($3); $$ = o; - + THIS->lexer_->remove_scope (); THIS->lexer_->add_scope (o->scope_); } | music_output_def_body assignment { @@ -709,7 +690,6 @@ music_output_def_body: } | music_output_def_body translator_spec_block { $$->assign_translator ($2); - } | music_output_def_body tempo_event { /* @@ -721,6 +701,7 @@ music_output_def_body: Midi_def * md = dynamic_cast ($$); if (md) md->set_tempo (d->get_length (), m); + scm_gc_unprotect_object ($2->self_scm ()); } | music_output_def_body error { @@ -905,16 +886,29 @@ context_mod_list: ; 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); + AUTOCHANGE Music { + static SCM proc ; + if (!proc) + proc = scm_c_eval_string ("make-autochange-music"); + + SCM res = scm_call_1 (proc, $2->self_scm ()); + scm_gc_unprotect_object ($2->self_scm ()); + $$ = unsmob_music (res); + scm_gc_protect_object (res); + $$->set_spot (THIS->here_input()); + } + | PARTCOMBINE Music Music { + static SCM proc; + if (!proc) + proc = scm_c_eval_string ("make-part-combine-music"); + SCM res = scm_call_1 (proc, gh_list ($2->self_scm (), + $3->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); - chm->set_mus_property ("what", scm_string_to_symbol ($2)); - - $$ = chm; - chm->set_spot (*$3->origin ()); + scm_gc_unprotect_object ($2->self_scm ()); + $$ = unsmob_music (res); + scm_gc_protect_object (res); + $$->set_spot (THIS->here_input()); } | grace_head Music { #if 1 @@ -953,7 +947,6 @@ basic music objects too, since the meaning is different. scm_gc_unprotect_object (startm->self_scm ()); } - Music* seq = MY_MAKE_MUSIC("SequentialMusic"); seq->set_mus_property ("elements", ms); @@ -1030,7 +1023,19 @@ basic music objects too, since the meaning is different. } } | NOTES - { THIS->lexer_->push_note_state (); } + { + SCM nn = THIS->lexer_->lookup_identifier ("pitchnames"); + THIS->lexer_->push_note_state (alist_to_hashq (nn)); + } + Music + { $$ = $3; + THIS->lexer_->pop_state (); + } + | DRUMS + { + SCM nn = THIS->lexer_->lookup_identifier ("drumPitchNames"); + THIS->lexer_->push_note_state (alist_to_hashq (nn)); + } Music { $$ = $3; THIS->lexer_->pop_state (); @@ -1046,10 +1051,13 @@ basic music objects too, since the meaning is different. THIS->lexer_->pop_state (); } - | CHORDS - { THIS->lexer_->push_chord_state (); } - Music - { + | CHORDS { + SCM nn = THIS->lexer_->lookup_identifier ("chordmodifiers"); + THIS->lexer_->chordmodifier_tab_ = alist_to_hashq (nn); + nn = THIS->lexer_->lookup_identifier ("pitchnames"); + THIS->lexer_->push_chord_state (alist_to_hashq (nn)); + + } Music { Music * chm = MY_MAKE_MUSIC("UnrelativableMusic"); chm->set_mus_property ("element", $3->self_scm ()); scm_gc_unprotect_object ($3->self_scm()); @@ -1066,7 +1074,6 @@ basic music objects too, since the meaning is different. } | relative_music { $$ = $1; } | re_rhythmed_music { $$ = $1; } - | part_combined_music { $$ = $1; } | TAG embedded_scm Music { tag_music ($3, $2, THIS->here_input ()); $$ = $3; @@ -1097,18 +1104,12 @@ re_rhythmed_music: scm_gc_unprotect_object ($2->self_scm ()); $$ = l; } - ; - -part_combined_music: - PARTCOMBINE STRING Music Music { - 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 ()); - scm_gc_unprotect_object ($4->self_scm ()); - - $$ = p; + | 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); } ; @@ -1288,9 +1289,22 @@ chord_body_element: if ($2 % 2 || $3 % 2) n->set_mus_property ("force-accidental", SCM_BOOL_T); - SCM arts = scm_reverse_x ($4, SCM_EOL); - n->set_mus_property ("articulations", arts); + if (gh_pair_p ($4)) { + SCM arts = scm_reverse_x ($4, SCM_EOL); + n->set_mus_property ("articulations", arts); + } + $$ = n; + } + | DRUM_PITCH post_events { + Music *n = MY_MAKE_MUSIC("NoteEvent"); + n->set_mus_property ("duration" ,$2); + n->set_mus_property ("drum-type" , $1); + n->set_spot (THIS->here_input()); + if (gh_pair_p ($2)) { + SCM arts = scm_reverse_x ($2, SCM_EOL); + n->set_mus_property ("articulations", arts); + } $$ = n; } ; @@ -1304,6 +1318,12 @@ command_element: $$-> set_spot (THIS->here_input ()); $1-> set_spot (THIS->here_input ()); } + | SKIP duration_length { + Music * skip = MY_MAKE_MUSIC("SkipMusic"); + skip->set_mus_property ("duration", $2); + + $$ = skip; + } | OCTAVE { THIS->push_spot (); } pitch { Music *l = MY_MAKE_MUSIC("RelativeOctaveCheck"); @@ -1381,41 +1401,28 @@ command_element: scm_gc_protect_object (result); $$ = unsmob_music (result); } - ; + | MARK scalar { + static SCM proc; + if (!proc) + proc = scm_c_eval_string ("make-mark-set"); -command_req: - shorthand_command_req { $$ = $1; } - | verbose_command_req { $$ = $1; } + SCM result = scm_call_1 (proc, $2); + scm_gc_protect_object (result); + $$ = unsmob_music (result); + } ; -shorthand_command_req: - hyphen_req { - $$ = $1; - } - | BREATHE { +command_req: + BREATHE { $$ = MY_MAKE_MUSIC("BreathingSignEvent"); } | E_TILDE { $$ = MY_MAKE_MUSIC("PesOrFlexaEvent"); } - ; - -verbose_command_req: - MARK DEFAULT { + | MARK DEFAULT { Music * m = MY_MAKE_MUSIC("MarkEvent"); $$ = m; } - | MARK scalar { - Music *m = MY_MAKE_MUSIC("MarkEvent"); - m->set_mus_property ("label", $2); - $$ = m; - } - | SKIP duration_length { - Music * skip = MY_MAKE_MUSIC("SkipEvent"); - skip->set_mus_property ("duration", $2); - - $$ = skip; - } | tempo_event { $$ = $1; } @@ -1467,6 +1474,11 @@ post_event: direction_less_event { $$ = $1; } + | HYPHEN { + if (!THIS->lexer_->lyric_state_b ()) + THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); + $$ = MY_MAKE_MUSIC("HyphenEvent"); + } | EXTENDER { if (!THIS->lexer_->lyric_state_b ()) THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); @@ -1558,7 +1570,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; @@ -1625,14 +1644,6 @@ pitch_also_in_chords: | steno_tonic_pitch ; -hyphen_req: - HYPHEN { - if (!THIS->lexer_->lyric_state_b ()) - THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); - $$ = MY_MAKE_MUSIC("HyphenEvent"); - } - ; - close_event: '(' { Music * s= MY_MAKE_MUSIC("SlurEvent"); @@ -1909,21 +1920,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); @@ -1938,6 +1954,21 @@ simple_element: n->set_spot (i); $$ = v; } + | DRUM_PITCH optional_notemode_duration { + Input i = THIS->pop_spot (); + + Music *n = MY_MAKE_MUSIC("NoteEvent"); + n->set_mus_property ("duration" ,$2); + n->set_mus_property ("drum-type" , $1); + + Music *v = MY_MAKE_MUSIC("EventChord"); + v->set_mus_property ("elements", scm_list_n (n->self_scm (), SCM_UNDEFINED)); + scm_gc_unprotect_object (n->self_scm()); + v->set_spot (i); + n->set_spot (i); + $$ = v; + + } | figure_spec optional_notemode_duration { Music * m = unsmob_music ($1); Input i = THIS->pop_spot (); @@ -1966,6 +1997,8 @@ simple_element: velt->set_mus_property ("elements", scm_list_n (ev->self_scm (),SCM_UNDEFINED)); velt->set_spot (i); + scm_gc_unprotect_object (ev->self_scm()); + $$ = velt; } | MULTI_MEASURE_REST optional_notemode_duration { @@ -2201,6 +2234,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); } @@ -2225,6 +2261,9 @@ markup: | MARKUP_HEAD_SCM0_SCM1_SCM2 embedded_scm embedded_scm embedded_scm { $$ = scm_list_n ($1, $2, $3, $4, SCM_UNDEFINED); } + | MARKUP_HEAD_SCM0_SCM1 embedded_scm embedded_scm { + $$ = scm_list_n ($1, $2, $3, SCM_UNDEFINED); + } | MARKUP_IDENTIFIER { $$ = $1; } @@ -2428,3 +2467,4 @@ get_next_unique_context () return scm_makfrom0str (s); } +