/*
- 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 <hanwen@xs4all.nl>
+ Copyright (C) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
+
+ 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 <http://www.gnu.org/licenses/>.
*/
%{
or
- \repeat { \repeat } \alternative
+ \repeat { \repeat } \alternative
*/
FIXME: Bison needs to translate some of these, eg, STRING.
-*/
-
+*/
+
/* Keyword tokens with plain escaped name. */
%token ACCEPTS "\\accepts"
%token ADDLYRICS "\\addlyrics"
%token ALIAS "\\alias"
%token ALTERNATIVE "\\alternative"
%token BOOK "\\book"
+%token BOOKPART "\\bookpart"
%token CHANGE "\\change"
%token CHORDMODE "\\chordmode"
%token CHORDS "\\chords"
%token <scm> BOOK_IDENTIFIER
%token <scm> CHORDMODIFIER_PITCH
%token <scm> CHORD_MODIFIER
+%token <scm> CHORD_REPETITION
%token <scm> CONTEXT_DEF_IDENTIFIER
%token <scm> DRUM_PITCH
%token <scm> DURATION_IDENTIFIER
%token <scm> MARKUP_HEAD_SCM0_MARKUP1
%token <scm> MARKUP_HEAD_SCM0_SCM1
%token <scm> MARKUP_HEAD_SCM0_SCM1_MARKUP2
+%token <scm> MARKUP_HEAD_SCM0_SCM1_MARKUP2_MARKUP3
%token <scm> MARKUP_HEAD_SCM0_MARKUP1_MARKUP2
%token <scm> MARKUP_HEAD_SCM0_SCM1_SCM2
%token <scm> MARKUP_LIST_HEAD_EMPTY
%type <book> book_block
%type <book> book_body
+%type <book> bookpart_block
+%type <book> bookpart_body
%type <i> bare_unsigned
%type <scm> figured_bass_alteration
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;
$$ = $1->self_scm ();
$1->unprotect ();
}
+ | bookpart_block {
+ $$ = $1->self_scm ();
+ $1->unprotect ();
+ }
| output_def {
$$ = $1->self_scm ();
$1->unprotect ();
book_block:
BOOK '{' book_body '}' {
$$ = $3;
+ pop_paper (PARSER);
+ PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), SCM_BOOL_F);
}
;
book_body:
{
$$ = new Book;
+ init_papers (PARSER);
$$->origin ()->set_spot (@$);
$$->paper_ = dynamic_cast<Output_def*> (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 ());
+ 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;
$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;
| 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;
tempo_event:
TEMPO steno_duration '=' bare_unsigned {
- $$ = MAKE_SYNTAX ("tempo", @$, $2, scm_int2num ($4));
- }
+ $$ = MAKE_SYNTAX ("tempo", @$, SCM_BOOL_F, $2, scm_int2num ($4));
+ }
+ | TEMPO string steno_duration '=' bare_unsigned {
+ $$ = MAKE_SYNTAX ("tempo", @$, make_simple_markup($2), $3, scm_int2num ($5));
+ }
+ | TEMPO full_markup steno_duration '=' bare_unsigned {
+ $$ = MAKE_SYNTAX ("tempo", @$, $2, $3, scm_int2num ($5));
+ }
+ | TEMPO string {
+ $$ = MAKE_SYNTAX ("tempoText", @$, make_simple_markup($2) );
+ }
+ | TEMPO full_markup {
+ $$ = MAKE_SYNTAX ("tempoText", @$, $2 );
+ }
;
/*
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);
}
| 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);
}
$$ = 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));
| 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:
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_ = $$;
+ }
;
{
m->set_property ("no-continuation", SCM_BOOL_T);
}
+ else if ($2 == ly_symbol2scm ("backslash"))
+ {
+ m->set_property ("augmented-slash", SCM_BOOL_T);
+ }
}
;
| '/' {
$$ = ly_symbol2scm ("slash");
}
+ | E_BACKSLASH {
+ $$ = ly_symbol2scm ("backslash");
+ }
;
br_bass_figure:
| MARKUP_HEAD_SCM0_MARKUP1_MARKUP2 embedded_scm markup markup {
$$ = scm_list_4 ($1, $2, $3, $4);
}
+ | MARKUP_HEAD_SCM0_SCM1_MARKUP2_MARKUP3 embedded_scm embedded_scm markup markup {
+ $$ = scm_list_5 ($1, $2, $3, $4, $5);
+ }
| MARKUP_HEAD_EMPTY {
$$ = scm_list_1 ($1);
}