X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=d2f3a8c4dc9e9f0eae7f1512c673fbeabadcdf6d;hb=c869648595a848905a7636571778385acdc772f5;hp=e8be753f09ecbb426976cc57414757b3e282cf1a;hpb=c423fa1e62d3060b592ea9e56c841649b8504d8b;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index e8be753f09..d2f3a8c4dc 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--2007 Han-Wen Nienhuys + Copyright (C) 1997--2009 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 @@ -655,6 +667,7 @@ book_block: BOOK '{' book_body '}' { $$ = $3; pop_paper (PARSER); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), SCM_BOOL_F); } ; @@ -670,11 +683,15 @@ book_body: $$->paper_->unprotect (); push_paper (PARSER, $$->paper_); $$->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 +739,7 @@ book_body: bookpart_block: BOOKPART '{' bookpart_body '}' { $$ = $3; + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), SCM_BOOL_F); } ; @@ -729,11 +747,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; @@ -1045,6 +1065,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 +1079,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); } @@ -1260,7 +1286,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)); @@ -1400,13 +1426,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_ = $$; + } ;