/*
- 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 <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
BOOK '{' book_body '}' {
$$ = $3;
pop_paper (PARSER);
+ PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-book"), SCM_BOOL_F);
}
;
$$->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;
bookpart_block:
BOOKPART '{' bookpart_body '}' {
$$ = $3;
+ PARSER->lexer_->set_identifier (ly_symbol2scm ("$current-bookpart"), SCM_BOOL_F);
}
;
{
$$ = 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;
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_ = $$;
+ }
;