X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=ac0d357f9a307831ddf95970f94ae9cc9dc74817;hb=5cec63df3df4d0e9ccbdeaaf27f520be5e63161c;hp=979ab2c26194e0a557ee1416afddc1082ca98afb;hpb=54ef49768776f686e5ea452acd49e02ef8715279;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index 979ab2c261..ac0d357f9a 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2009 Han-Wen Nienhuys + Copyright (C) 1997--2010 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -84,6 +84,7 @@ using namespace std; #include "book.hh" #include "context-def.hh" +#include "context-mod.hh" #include "dimensions.hh" #include "file-path.hh" #include "input.hh" @@ -198,7 +199,6 @@ void set_music_properties (Music *p, SCM a); %token MIDI "\\midi" %token NAME "\\name" %token NOTEMODE "\\notemode" -%token OBJECTID "\\objectid" %token OCTAVE "\\octave" %token ONCE "\\once" %token OVERRIDE "\\override" @@ -279,6 +279,7 @@ If we give names, Bison complains. %token CHORD_MODIFIER %token CHORD_REPETITION %token CONTEXT_DEF_IDENTIFIER +%token CONTEXT_MOD_IDENTIFIER %token DRUM_PITCH %token DURATION_IDENTIFIER %token EVENT_IDENTIFIER @@ -346,6 +347,7 @@ If we give names, Bison complains. %type chord_body_element %type command_element %type command_event +%type context_modification %type context_change %type direction_less_event %type direction_reqd_event @@ -365,10 +367,10 @@ If we give names, Bison complains. %type output_def_head %type output_def_head_with_mode_switch %type output_def -%type paper_block +%type paper_block %type alternative_music -%type generic_prefix_music_scm +%type generic_prefix_music_scm %type music_list %type absolute_pitch %type assignment_id @@ -408,7 +410,7 @@ If we give names, Bison complains. %type lyric_markup %type markup %type markup_braced_list -%type markup_braced_list_body +%type markup_braced_list_body %type markup_composed_list %type markup_command_list %type markup_head_1_item @@ -426,7 +428,6 @@ If we give names, Bison complains. %type number_expression %type number_factor %type number_term -%type object_id_setting %type octave_check %type optional_context_mod %type optional_id @@ -445,7 +446,7 @@ If we give names, Bison complains. %type steno_pitch %type steno_tonic_pitch %type step_number -%type step_numbers +%type step_numbers %type string %type score_block @@ -475,10 +476,6 @@ lilypond: /* empty */ ; -object_id_setting: - OBJECTID STRING { $$ = $2; } - ; - toplevel_expression: lilypond_header { PARSER->lexer_->set_identifier (ly_symbol2scm ("$defaultheader"), $1); @@ -497,7 +494,7 @@ toplevel_expression: } | score_block { Score *score = $1; - + SCM proc = PARSER->lexer_->lookup_identifier ("toplevel-score-handler"); scm_call_2 (proc, PARSER->self_scm (), score->self_scm ()); score->unprotect (); @@ -543,7 +540,7 @@ lilypond_header_body: PARSER->lexer_->add_scope ($$); } | lilypond_header_body assignment { - + } ; @@ -631,6 +628,9 @@ identifier_init: | DIGIT { $$ = scm_from_int ($1); } + | context_modification { + $$ = $1; + } ; context_def_spec_block: @@ -661,7 +661,14 @@ context_def_spec_body: } } | context_def_spec_body context_mod { - unsmob_context_def ($$)->add_context_mod ($2); + unsmob_context_def ($$)->add_context_mod ($2); + } + | context_def_spec_body context_modification { + Context_def *td = unsmob_context_def ($$); + SCM new_mods = unsmob_context_mod ($2)->get_mods (); + for (SCM m = new_mods; scm_is_pair (m); m = scm_cdr (m)) { + td->add_context_mod (scm_car (m)); + } } ; @@ -686,7 +693,7 @@ book_body: $$->paper_ = dynamic_cast (unsmob_output_def (PARSER->lexer_->lookup_identifier ("$defaultpaper"))->clone ()); $$->paper_->unprotect (); push_paper (PARSER, $$->paper_); - $$->header_ = PARSER->lexer_->lookup_identifier ("$defaultheader"); + $$->header_ = PARSER->lexer_->lookup_identifier ("$defaultheader"); PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $$->self_scm ()); PARSER->lexer_->set_identifier (ly_symbol2scm ("book-output-suffix"), SCM_BOOL_F); PARSER->lexer_->set_identifier (ly_symbol2scm ("book-filename"), SCM_BOOL_F); @@ -735,9 +742,6 @@ book_body: $$->scores_ = SCM_EOL; $$->bookparts_ = SCM_EOL; } - | book_body object_id_setting { - $$->user_key_ = ly_scm2string ($2); - } ; bookpart_block: @@ -789,9 +793,6 @@ bookpart_body: $$->paper_ = 0; $$->scores_ = SCM_EOL; } - | bookpart_body object_id_setting { - $$->user_key_ = ly_scm2string ($2); - } ; score_block: @@ -816,9 +817,6 @@ score_body: $$->protect (); $$->origin ()->set_spot (@$); } - | score_body object_id_setting { - $$->user_key_ = ly_scm2string ($2); - } | score_body lilypond_header { $$->set_header ($2); } @@ -826,7 +824,7 @@ score_body: if ($2->lookup_variable (ly_symbol2scm ("is-paper")) == SCM_BOOL_T) { PARSER->parser_error (@2, _("\\paper cannot be used in \\score, use \\layout instead")); - + } else { @@ -962,7 +960,7 @@ music_list: } | music_list error { Music *m = MY_MAKE_MUSIC("Music", @$); - // ugh. code dup + // ugh. code dup m->set_property ("error-found", SCM_BOOL_T); SCM s = $$; SCM c = scm_cons (m->self_scm (), SCM_EOL); @@ -1023,22 +1021,45 @@ simple_music: | context_change ; +context_modification: + WITH { PARSER->lexer_->push_initial_state (); } '{' context_mod_list '}' + { + PARSER->lexer_->pop_state (); + $$ = $4; + } + | WITH CONTEXT_MOD_IDENTIFIER + { + $$ = $2; + } + | CONTEXT_MOD_IDENTIFIER + { + $$ = $1; + } + ; + optional_context_mod: - /**/ { $$ = SCM_EOL; } - | WITH { PARSER->lexer_->push_initial_state (); } - '{' context_mod_list '}' - { - PARSER->lexer_->pop_state (); - $$ = $4; - } - ; + /**/ { + $$ = SCM_EOL; + } + | context_modification + { + $$ = $1; + } + ; context_mod_list: - /* */ { $$ = SCM_EOL; } - | context_mod_list context_mod { - $$ = scm_cons ($2, $1); - } - ; + /**/ { + $$ = Context_mod ().smobbed_copy (); + } + | context_mod_list context_mod { + unsmob_context_mod ($1)->add_context_mod ($2); + } + | context_mod_list CONTEXT_MOD_IDENTIFIER { + Context_mod *md = unsmob_context_mod ($2); + if (md) + unsmob_context_mod ($1)->add_context_mods (md->get_mods ()); + } + ; composite_music: prefix_composite_music { $$ = $1; } @@ -1051,12 +1072,12 @@ grouped_music_list: ; function_scm_argument: - embedded_scm + embedded_scm | simple_string ; /* An argument list. If a function \foo expects scm scm music, then the lexer expands \foo into the token sequence: - MUSIC_FUNCTION EXPECT_MUSIC EXPECT_SCM EXPECT_SCM + MUSIC_FUNCTION EXPECT_MUSIC EXPECT_SCM EXPECT_SCM EXPECT_NO_MORE_ARGS and this rule returns the reversed list of arguments. */ function_arglist_music_last: @@ -1112,7 +1133,7 @@ optional_id: | '=' simple_string { $$ = $2; } - ; + ; prefix_composite_music: @@ -1120,10 +1141,18 @@ prefix_composite_music: $$ = run_music_function (PARSER, $1); } | CONTEXT simple_string optional_id optional_context_mod music { - $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, $4, SCM_BOOL_F); + Context_mod *ctxmod = unsmob_context_mod ($4); + SCM mods = SCM_EOL; + if (ctxmod) + mods = ctxmod->get_mods (); + $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, mods, SCM_BOOL_F); } | NEWCONTEXT simple_string optional_id optional_context_mod music { - $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, $4, SCM_BOOL_T); + Context_mod *ctxmod = unsmob_context_mod ($4); + SCM mods = SCM_EOL; + if (ctxmod) + mods = ctxmod->get_mods (); + $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, mods, SCM_BOOL_T); } | TIMES fraction music { @@ -1148,7 +1177,11 @@ prefix_composite_music: PARSER->lexer_->pop_state (); } | mode_changing_head_with_context optional_context_mod grouped_music_list { - $$ = MAKE_SYNTAX ("context-specification", @$, $1, SCM_EOL, $3, $2, SCM_BOOL_T); + Context_mod *ctxmod = unsmob_context_mod ($2); + SCM mods = SCM_EOL; + if (ctxmod) + mods = ctxmod->get_mods (); + $$ = MAKE_SYNTAX ("context-specification", @$, $1, SCM_EOL, $3, mods, SCM_BOOL_T); if ($1 == ly_symbol2scm ("ChordNames")) { $$ = MAKE_SYNTAX ("unrelativable-music", @$, $$); @@ -1159,14 +1192,14 @@ prefix_composite_music: | re_rhythmed_music { $$ = $1; } ; -mode_changing_head: +mode_changing_head: NOTEMODE { SCM nn = PARSER->lexer_->lookup_identifier ("pitchnames"); PARSER->lexer_->push_note_state (alist_to_hashq (nn)); $$ = ly_symbol2scm ("notes"); } - | DRUMMODE + | DRUMMODE { SCM nn = PARSER->lexer_->lookup_identifier ("drumPitchNames"); PARSER->lexer_->push_note_state (alist_to_hashq (nn)); @@ -1192,7 +1225,7 @@ mode_changing_head: } ; -mode_changing_head_with_context: +mode_changing_head_with_context: DRUMS { SCM nn = PARSER->lexer_->lookup_identifier ("drumPitchNames"); PARSER->lexer_->push_note_state (alist_to_hashq (nn)); @@ -1278,7 +1311,7 @@ property_path_revved: property_path: property_path_revved { $$ = scm_reverse_x ($1, SCM_EOL); - } + } ; property_operation: @@ -1351,7 +1384,7 @@ context_prop_spec: simple_music_property_def: OVERRIDE context_prop_spec property_path '=' scalar { - $$ = scm_append (scm_list_2 (scm_list_n (scm_car ($2), + $$ = scm_append (scm_list_2 (scm_list_n (scm_car ($2), ly_symbol2scm ("OverrideProperty"), scm_cadr ($2), $5, SCM_UNDEFINED), @@ -1472,7 +1505,7 @@ note_chord_element: SCM dur = unsmob_duration ($2)->smobbed_copy (); SCM es = m->get_property ("elements"); SCM postevs = scm_reverse_x ($3, SCM_EOL); - + for (SCM s = es; scm_is_pair (s); s = scm_cdr (s)) unsmob_music (scm_car (s))->set_property ("duration", dur); es = ly_append2 (es, postevs); @@ -1535,7 +1568,7 @@ chord_body_element: } $$ = n->unprotect (); } - | music_function_chord_body { + | music_function_chord_body { $$ = run_music_function (PARSER, $1); } ; @@ -1644,7 +1677,7 @@ command_event: Music *key = MY_MAKE_MUSIC ("KeyChangeEvent", @$); if (scm_ilength ($3) > 0) - { + { key->set_property ("pitch-alist", $3); key->set_property ("tonic", Pitch (0, 0, 0).smobbed_copy ()); key->transpose (* unsmob_pitch ($2)); @@ -1666,7 +1699,7 @@ post_events: $$ = scm_cons ($2, $$); } ; - + post_event: direction_less_event { $$ = $1; @@ -1716,7 +1749,7 @@ direction_less_char: $$ = ly_symbol2scm ("bracketOpenSymbol"); } | ']' { - $$ = ly_symbol2scm ("bracketCloseSymbol"); + $$ = ly_symbol2scm ("bracketCloseSymbol"); } | '~' { $$ = ly_symbol2scm ("tildeSymbol"); @@ -1767,8 +1800,8 @@ direction_less_event: a->set_property ("tremolo-type", scm_from_int ($1)); $$ = a->unprotect (); } - ; - + ; + direction_reqd_event: gen_text_def { $$ = $1; @@ -1942,6 +1975,7 @@ steno_duration: | DURATION_IDENTIFIER dots { Duration *d = unsmob_duration ($1); Duration k (d->duration_log (), d->dot_count () + $2); + k = k.compressed (d->factor ()); *d = k; $$ = $1; } @@ -2114,7 +2148,7 @@ simple_element: n = MY_MAKE_MUSIC ("RestEvent", @$); else n = MY_MAKE_MUSIC ("NoteEvent", @$); - + n->set_property ("pitch", $1); n->set_property ("duration", $5); @@ -2136,7 +2170,7 @@ simple_element: n->set_property ("duration", $2); n->set_property ("drum-type", $1); - $$ = n->unprotect (); + $$ = n->unprotect (); } | RESTNAME optional_notemode_duration { Music *ev = 0; @@ -2146,7 +2180,7 @@ simple_element: } else { ev = MY_MAKE_MUSIC ("RestEvent", @$); - + } ev->set_property ("duration", $2); $$ = ev->unprotect (); @@ -2165,7 +2199,7 @@ simple_element: simple_chord_elements: simple_element { $$ = scm_list_1 ($1); - } + } | new_chord { if (!PARSER->lexer_->is_chord_state ()) PARSER->parser_error (@1, _ ("have to be in Chord mode for chords")); @@ -2177,7 +2211,7 @@ simple_chord_elements: unsmob_music (scm_car (s))->set_property ("duration", $2); } $$ = $1; - } + } ; lyric_element: @@ -2201,7 +2235,7 @@ new_chord: chord_items: /**/ { - $$ = SCM_EOL; + $$ = SCM_EOL; } | chord_items chord_item { $$ = scm_cons ($2, $$); @@ -2252,7 +2286,7 @@ step_number: | bare_unsigned CHORD_MINUS { $$ = make_chord_step ($1, FLAT_ALTERATION); } - ; + ; /* UTILITIES @@ -2324,7 +2358,7 @@ unsigned_number: $$ = $1; } ; - + exclamations: { $$ = 0; } @@ -2374,8 +2408,8 @@ full_markup: ; markup_top: - markup_list { - $$ = scm_list_2 (ly_lily_module_constant ("line-markup"), $1); + markup_list { + $$ = scm_list_2 (ly_lily_module_constant ("line-markup"), $1); } | markup_head_1_list simple_markup { $$ = scm_car (scm_call_2 (ly_lily_module_constant ("map-markup-command-list"), $1, scm_list_1 ($2))); @@ -2400,7 +2434,7 @@ markup_list: markup_composed_list: markup_head_1_list markup_braced_list { $$ = scm_call_2 (ly_lily_module_constant ("map-markup-command-list"), $1, $2); - + } ; @@ -2506,7 +2540,7 @@ simple_markup: $$ = scm_list_3 ($1, $2, $3); } ; - + markup: markup_head_1_list simple_markup { SCM mapper = ly_lily_module_constant ("map-markup-command-list"); @@ -2556,13 +2590,17 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid) } else if (scm_is_number (sid)) { *destination = sid; return NUMBER_IDENTIFIER; - } else if (unsmob_context_def (sid)) { - Context_def *def= unsmob_context_def (sid)->clone (); + } else if (unsmob_context_def (sid)) { + Context_def *def= unsmob_context_def (sid)->clone (); + + *destination = def->self_scm (); + def->unprotect (); - *destination = def->self_scm (); - def->unprotect (); - - return CONTEXT_DEF_IDENTIFIER; + return CONTEXT_DEF_IDENTIFIER; + } else if (unsmob_context_mod (sid)) { + *destination = unsmob_context_mod (sid)->smobbed_copy (); + + return CONTEXT_MOD_IDENTIFIER; } else if (unsmob_score (sid)) { Score *score = new Score (*unsmob_score (sid)); *destination = score->self_scm (); @@ -2586,7 +2624,7 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid) } else if (unsmob_output_def (sid)) { Output_def *p = unsmob_output_def (sid); p = p->clone (); - + *destination = p->self_scm (); p->unprotect (); return OUTPUT_DEF_IDENTIFIER; @@ -2597,7 +2635,7 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid) return MARKUP_IDENTIFIER; } - return -1; + return -1; } SCM @@ -2731,7 +2769,7 @@ make_music_relative (Pitch start, SCM music, Input loc) { Music *relative = MY_MAKE_MUSIC ("RelativeOctaveMusic", loc); relative->set_property ("element", music); - + Music *m = unsmob_music (music); Pitch last = m->to_relative_octave (start); if (lily_1_8_relative) @@ -2745,8 +2783,8 @@ yylex (YYSTYPE *s, YYLTYPE *loc, void *v) Lily_parser *pars = (Lily_parser*) v; Lily_lexer *lex = pars->lexer_; - lex->lexval = (void*) s; - lex->lexloc = loc; + lex->lexval_ = (void*) s; + lex->lexloc_ = loc; lex->prepare_for_next_token (); return lex->yylex (); }