X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=813452ef599e814421704a6e3b3a52344dd15f97;hb=b3f0c2f6c352a850f03dc44a947776199eb3fa0b;hp=be4e7e26e521cba2ff39792d7c14dcd8b475f0d8;hpb=1e55f09955cfbff635df165952697d1d75d57bba;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index be4e7e26e5..813452ef59 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2007 Han-Wen Nienhuys + (c) 1997--2009 Han-Wen Nienhuys Jan Nieuwenhuizen */ @@ -159,6 +159,7 @@ void set_music_properties (Music *p, SCM a); %token ALIAS "\\alias" %token ALTERNATIVE "\\alternative" %token BOOK "\\book" +%token BOOKPART "\\bookpart" %token CHANGE "\\change" %token CHORDMODE "\\chordmode" %token CHORDS "\\chords" @@ -306,6 +307,8 @@ If we give names, Bison complains. %type book_block %type book_body +%type bookpart_block +%type bookpart_body %type bare_unsigned %type figured_bass_alteration @@ -474,6 +477,12 @@ toplevel_expression: scm_call_2 (proc, PARSER->self_scm (), book->self_scm ()); book->unprotect (); } + | bookpart_block { + Book *bookpart = $1; + SCM proc = PARSER->lexer_->lookup_identifier ("toplevel-bookpart-handler"); + scm_call_2 (proc, PARSER->self_scm (), bookpart->self_scm ()); + bookpart->unprotect (); + } | score_block { Score *score = $1; @@ -565,6 +574,10 @@ identifier_init: $$ = $1->self_scm (); $1->unprotect (); } + | bookpart_block { + $$ = $1->self_scm (); + $1->unprotect (); + } | output_def { $$ = $1->self_scm (); $1->unprotect (); @@ -641,6 +654,8 @@ context_def_spec_body: book_block: BOOK '{' book_body '}' { $$ = $3; + pop_paper (PARSER); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), SCM_BOOL_F); } ; @@ -650,19 +665,30 @@ book_block: book_body: { $$ = new Book; + init_papers (PARSER); $$->origin ()->set_spot (@$); $$->paper_ = dynamic_cast (unsmob_output_def (PARSER->lexer_->lookup_identifier ("$defaultpaper"))->clone ()); $$->paper_->unprotect (); + push_paper (PARSER, $$->paper_); $$->header_ = PARSER->lexer_->lookup_identifier ("$defaultheader"); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $$->self_scm ()); } | BOOK_IDENTIFIER { $$ = unsmob_book ($1); $$->protect (); $$->origin ()->set_spot (@$); + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), $1); } | book_body paper_block { $$->paper_ = $2; $2->unprotect (); + set_paper (PARSER, $2); + } + | book_body bookpart_block { + Book *bookpart = $2; + SCM proc = PARSER->lexer_->lookup_identifier ("book-bookpart-handler"); + scm_call_2 (proc, $$->self_scm (), bookpart->self_scm ()); + bookpart->unprotect (); } | book_body score_block { Score *score = $2; @@ -689,12 +715,67 @@ book_body: | book_body error { $$->paper_ = 0; $$->scores_ = SCM_EOL; + $$->bookparts_ = SCM_EOL; } | book_body object_id_setting { $$->user_key_ = ly_scm2string ($2); } ; +bookpart_block: + BOOKPART '{' bookpart_body '}' { + $$ = $3; + PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), SCM_BOOL_F); + } + ; + +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; + $2->unprotect (); + } + | bookpart_body score_block { + Score *score = $2; + SCM proc = PARSER->lexer_->lookup_identifier ("bookpart-score-handler"); + scm_call_2 (proc, $$->self_scm (), score->self_scm ()); + score->unprotect (); + } + | bookpart_body composite_music { + Music *music = unsmob_music ($2); + SCM proc = PARSER->lexer_->lookup_identifier ("bookpart-music-handler"); + scm_call_3 (proc, PARSER->self_scm (), $$->self_scm (), music->self_scm ()); + } + | bookpart_body full_markup { + SCM proc = PARSER->lexer_->lookup_identifier ("bookpart-text-handler"); + scm_call_2 (proc, $$->self_scm (), scm_list_1 ($2)); + } + | bookpart_body full_markup_list { + SCM proc = PARSER->lexer_->lookup_identifier ("bookpart-text-handler"); + scm_call_2 (proc, $$->self_scm (), $2); + } + | bookpart_body lilypond_header { + $$->header_ = $2; + } + | bookpart_body error { + $$->paper_ = 0; + $$->scores_ = SCM_EOL; + } + | bookpart_body object_id_setting { + $$->user_key_ = ly_scm2string ($2); + } + ; + score_block: SCORE '{' score_body '}' { $$ = $3;