X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=80d9f5ac77a3fe9b6ba7cd715ca09e1eb660dad2;hb=17932f720e8e07049b52fe1f5c7697a7def5114a;hp=462a58de402ee1f8dac8dabd827919660e015005;hpb=0e5d83a9ceb4a143f83d22406d7eb816314ff9f7;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index 462a58de40..80d9f5ac77 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -1,10 +1,21 @@ /* - parser.yy -- Bison/C++ parser for LilyPond + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter - - (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 + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ %{ @@ -44,7 +55,7 @@ of the parse stack onto the heap. */ or - \repeat { \repeat } \alternative + \repeat { \repeat } \alternative */ @@ -151,8 +162,8 @@ void set_music_properties (Music *p, SCM a); FIXME: Bison needs to translate some of these, eg, STRING. -*/ - +*/ + /* Keyword tokens with plain escaped name. */ %token ACCEPTS "\\accepts" %token ADDLYRICS "\\addlyrics" @@ -266,6 +277,7 @@ If we give names, Bison complains. %token BOOK_IDENTIFIER %token CHORDMODIFIER_PITCH %token CHORD_MODIFIER +%token CHORD_REPETITION %token CONTEXT_DEF_IDENTIFIER %token DRUM_PITCH %token DURATION_IDENTIFIER @@ -353,10 +365,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 @@ -396,7 +408,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 @@ -433,7 +445,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 @@ -464,7 +476,7 @@ lilypond: /* empty */ object_id_setting: - OBJECTID STRING { $$ = $2; } + OBJECTID STRING { $$ = $2; } ; toplevel_expression: @@ -552,7 +564,11 @@ assignment_id: assignment: assignment_id '=' identifier_init { PARSER->lexer_->set_identifier ($1, $3); - + } + | assignment_id property_path '=' identifier_init { + SCM path = scm_cons (scm_string_to_symbol ($1), $2); + PARSER->lexer_->set_identifier (path, $4); + ; /* TODO: devise standard for protection in parser. @@ -655,6 +671,7 @@ book_block: BOOK '{' book_body '}' { $$ = $3; pop_paper (PARSER); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), SCM_BOOL_F); } ; @@ -669,12 +686,16 @@ 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); } | BOOK_IDENTIFIER { $$ = unsmob_book ($1); $$->protect (); $$->origin ()->set_spot (@$); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $1); } | book_body paper_block { $$->paper_ = $2; @@ -722,6 +743,7 @@ book_body: bookpart_block: BOOKPART '{' bookpart_body '}' { $$ = $3; + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), SCM_BOOL_F); } ; @@ -729,11 +751,13 @@ bookpart_body: { $$ = new Book; $$->origin ()->set_spot (@$); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), $$->self_scm ()); } | BOOK_IDENTIFIER { $$ = unsmob_book ($1); $$->protect (); $$->origin ()->set_spot (@$); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), $1); } | bookpart_body paper_block { $$->paper_ = $2; @@ -938,7 +962,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); @@ -1027,7 +1051,7 @@ grouped_music_list: ; function_scm_argument: - embedded_scm + embedded_scm | simple_string ; @@ -1045,6 +1069,9 @@ function_arglist_nonmusic_last: EXPECT_MARKUP function_arglist full_markup { $$ = scm_cons ($3, $2); } + | EXPECT_MARKUP function_arglist simple_string { + $$ = scm_cons ($3, $2); + } | EXPECT_SCM function_arglist function_scm_argument { $$ = scm_cons ($3, $2); } @@ -1056,6 +1083,9 @@ function_arglist_nonmusic: EXPECT_NO_MORE_ARGS { | EXPECT_MARKUP function_arglist_nonmusic full_markup { $$ = scm_cons ($3, $2); } + | EXPECT_MARKUP function_arglist_nonmusic simple_string { + $$ = scm_cons ($3, $2); + } | EXPECT_SCM function_arglist_nonmusic function_scm_argument { $$ = scm_cons ($3, $2); } @@ -1129,14 +1159,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)); @@ -1162,7 +1192,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)); @@ -1248,7 +1278,7 @@ property_path_revved: property_path: property_path_revved { $$ = scm_reverse_x ($1, SCM_EOL); - } + } ; property_operation: @@ -1260,7 +1290,7 @@ property_operation: $$ = scm_list_2 (ly_symbol2scm ("unset"), scm_string_to_symbol ($2)); } - | OVERRIDE simple_string property_path '=' embedded_scm { + | OVERRIDE simple_string property_path '=' scalar { $$ = scm_append (scm_list_2 (scm_list_3 (ly_symbol2scm ("push"), scm_string_to_symbol ($2), $5), $3)); @@ -1290,6 +1320,17 @@ context_mod: | context_def_mod STRING { $$ = scm_list_2 ($1, $2); } + | context_def_mod embedded_scm { + if (ly_symbol2scm ("consists") != $1) + { + $$ = SCM_EOL; + PARSER->parser_error (@1, _ ("only \\consists takes non-string argument.")); + } + else + { + $$ = scm_list_2 ($1, $2); + } + } ; context_prop_spec: @@ -1400,13 +1441,27 @@ event_chord: i.set_location (@1, @2); $$ = MAKE_SYNTAX ("event-chord", i, elts); } + | CHORD_REPETITION optional_notemode_duration post_events { + Input i; + i.set_location (@1, @3); + $$ = MAKE_SYNTAX ("repetition-chord", i, + PARSER->lexer_->chord_repetition_.last_chord_, + PARSER->lexer_->chord_repetition_.repetition_function_, + $2, $3); + } | MULTI_MEASURE_REST optional_notemode_duration post_events { Input i; i.set_location (@1, @3); $$ = MAKE_SYNTAX ("multi-measure-rest", i, $2, $3); } | command_element - | note_chord_element + /* note chord elements are memorized into + PARSER->lexer_->chord_repetition_ so that the chord repetition + mechanism copy them when a chord repetition symbol is found + */ + | note_chord_element { + PARSER->lexer_->chord_repetition_.last_chord_ = $$; + } ; @@ -1480,7 +1535,7 @@ chord_body_element: } $$ = n->unprotect (); } - | music_function_chord_body { + | music_function_chord_body { $$ = run_music_function (PARSER, $1); } ; @@ -1661,7 +1716,7 @@ direction_less_char: $$ = ly_symbol2scm ("bracketOpenSymbol"); } | ']' { - $$ = ly_symbol2scm ("bracketCloseSymbol"); + $$ = ly_symbol2scm ("bracketCloseSymbol"); } | '~' { $$ = ly_symbol2scm ("tildeSymbol"); @@ -2319,8 +2374,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)));