#define YYPARSE_PARAM my_lily_parser
#define YYLEX_PARAM my_lily_parser
#define THIS\
- ((My_lily_parser *) my_lily_parser)
+ ((Lily_parser *) my_lily_parser)
#define yyerror THIS->parser_error
int
yylex (YYSTYPE *s, void *v)
{
- My_lily_parser *pars = (My_lily_parser*) v;
- My_lily_lexer *lex = pars->lexer_;
+ Lily_parser *pars = (Lily_parser*) v;
+ Lily_lexer *lex = pars->lexer_;
lex->lexval = (void*) s;
lex->prepare_for_next_token ();
2. \markup identifier.
+ (what? --hwn)
+
3. \markup { }
+ (what? --hwn)
+
+
4. \repeat
\repeat .. \alternative
%token CLEF
%token COMMANDSPANREQUEST
%token CONSISTS
-%token CONSISTSEND
%token CONTEXT
%token DEFAULT
%token DENIES
%token INVALID
%token KEY
%token LYRICS
-%token LYRICS_STRING
%token MARK
%token MIDI
%token MULTI_MEASURE_REST
%token <scm> NUMBER_IDENTIFIER
%token <scm> OUTPUT_DEF_IDENTIFIER
%token <scm> RESTNAME
+%token <scm> LYRICS_STRING
%token <scm> SCM_T
%token <scm> SCORE_IDENTIFIER
%token <scm> STRING
%token <scm> MUSIC_FUNCTION_MUSIC
%token <scm> MUSIC_FUNCTION_MUSIC_MUSIC
%token <scm> MUSIC_FUNCTION_SCM
+%token <scm> MUSIC_FUNCTION_SCM_SCM
%token <scm> MUSIC_FUNCTION_SCM_MUSIC
%token <scm> MUSIC_FUNCTION_SCM_MUSIC_MUSIC
%token <scm> MUSIC_FUNCTION_SCM_SCM_MUSIC
$$ = $1->self_scm ();
scm_gc_unprotect_object ($$);
}
- | full_markup {
- $$ = $1;
- }
| output_def {
$$ = $1->self_scm ();
scm_gc_unprotect_object ($$);
scm_gc_unprotect_object ($$);
}
| number_expression {
- $$ = $1;
+ $$ = $1;
}
| string {
$$ = $1;
}
- | embedded_scm {
+ | embedded_scm {
+ $$ = $1;
+ }
+ | full_markup {
$$ = $1;
}
+ | DIGIT {
+ $$ = scm_int2num ($1);
+ }
;
context_def_spec_block:
$$->scores_.push (score);
scm_gc_unprotect_object (music->self_scm ());
}
- | lilypond_header {
- $$->header_ = $1;
+ | book_body lilypond_header {
+ $$->header_ = $2;
}
| book_body error {
;
score_body:
- Music {
+ /**/ {
$$ = new Score;
$$->set_spot (THIS->here_input ());
- SCM m = $1->self_scm ();
+ }
+ | SCORE_IDENTIFIER {
+ $$ = new Score ( *unsmob_score ($1));
+ $$->set_spot (THIS->here_input ());
+ }
+ | score_body Music {
+ SCM m = $2->self_scm ();
scm_gc_unprotect_object (m);
-
+
/*
guh.
*/
SCM check_funcs = ly_scheme_function ("toplevel-music-functions");
for (; ly_c_pair_p (check_funcs); check_funcs = ly_cdr (check_funcs))
m = scm_call_1 (ly_car (check_funcs), m);
+ if (unsmob_music ($$->music_))
+ {
+ THIS->parser_error (_("Already have music in score"));
+ unsmob_music ($$->music_)->origin ()->error (_("This is the previous music"));
+ }
$$->music_ = m;
-
- }
- | SCORE_IDENTIFIER {
- $$ = new Score ( *unsmob_score ($1));
- $$->set_spot (THIS->here_input ());
}
| score_body lilypond_header {
$$->header_ = $2;
$$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, $4->self_scm ());
scm_gc_unprotect_object ($4->self_scm ());
}
+ | MUSIC_FUNCTION_SCM_SCM {
+ THIS->push_spot ();
+ } embedded_scm embedded_scm {
+ $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, $4);
+ }
| MUSIC_FUNCTION_MUSIC_MUSIC {
THIS->push_spot ();
} Music Music {
SCM nn = THIS->lexer_->lookup_identifier ("pitchnames");
THIS->lexer_->push_note_state (alist_to_hashq (nn));
}
- Music
+ Grouped_music_list
{ $$ = $3;
THIS->lexer_->pop_state ();
}
SCM nn = THIS->lexer_->lookup_identifier ("drumPitchNames");
THIS->lexer_->push_note_state (alist_to_hashq (nn));
}
- /* FIXME: This used to be: */
- Music
-/* Grouped_music_list */
+ Grouped_music_list
{ $$ = $3;
THIS->lexer_->pop_state ();
}
| FIGURES
{ THIS->lexer_->push_figuredbass_state (); }
- /* FIXME: This used to be:
- Music
- but that breaks web build
- */
Grouped_music_list
{
Music *chm = MY_MAKE_MUSIC ("UntransposableMusic");
THIS->lexer_->push_chord_state (alist_to_hashq (nn));
}
- /* FIXME:
- Music
-*/
Grouped_music_list
{
Music *chm = MY_MAKE_MUSIC ("UnrelativableMusic");
}
| LYRICS
{ THIS->lexer_->push_lyric_state (); }
- /* FIXME:
- Music
-*/
Grouped_music_list
{
$$ = $3;
}
| RELATIVE Composite_music {
Music *m = $2;
- /* FIXME: why is octave==0 and default not middleC? */
- Pitch middle_c (-1, 0, 0);
+
+ Pitch middle_c (0, 0, 0);
$$ = make_music_relative (middle_c, m);
scm_gc_unprotect_object (m->self_scm ());
}
$$ = all;
scm_gc_unprotect_object ($1->self_scm ());
}
- | LYRICSTO string Music {
- Music *music = $3;
- SCM name = $2;
+ | LYRICSTO {
+ THIS->lexer_->push_lyric_state ();
+ } simple_string Music {
+ THIS->lexer_->pop_state ();
+ Music *music = $4;
+ SCM name = $3;
$$ = make_lyric_combine_music (name, music);
scm_gc_unprotect_object (music->self_scm ());
}
;
context_def_mod:
- CONSISTSEND { $$ = ly_symbol2scm ("consists-end"); }
- | CONSISTS { $$ = ly_symbol2scm ("consists"); }
+ CONSISTS { $$ = ly_symbol2scm ("consists"); }
| REMOVE { $$ = ly_symbol2scm ("remove"); }
| ACCEPTS { $$ = ly_symbol2scm ("accepts"); }
context_prop_spec:
simple_string {
+ if (!is_regular_identifier ($1))
+ {
+ THIS->here_input ().error (_("Grob name should be alphanumeric"));
+ }
+
$$ = scm_list_2 (ly_symbol2scm ("Bottom"),
scm_string_to_symbol ($1));
}
;
simple_string: STRING {
+ $$ = $1;
}
| LYRICS_STRING {
+ $$ = $1;
}
;
scalar: string {
+ $$ = $1;
}
| LYRICS_STRING {
+ $$ = $1;
}
| bare_int {
$$ = scm_int2num ($1);
}
| embedded_scm {
+ $$ = $1;
}
| full_markup {
+ $$ = $1;
}
| DIGIT {
$$ = scm_int2num ($1);
;
/*
-FIXME: remove or fix this comment. What is `This'?
-This is a trick:
+pre_events doesn't contain anything. It is a trick:
Adding pre_events to the simple_element
makes the choice between
;
chord_body_element:
- pitch exclamations questions post_events
+ pitch exclamations questions octave_check post_events
{
+ int q = $3;
+ int ex = $2;
+ SCM check = $4;
+ SCM post = $5;
+
Music *n = MY_MAKE_MUSIC ("NoteEvent");
n->set_property ("pitch", $1);
- if ($3 % 2)
+ if (q % 2)
n->set_property ("cautionary", SCM_BOOL_T);
- if ($2 % 2 || $3 % 2)
+ if (ex % 2 || q % 2)
n->set_property ("force-accidental", SCM_BOOL_T);
- if (ly_c_pair_p ($4)) {
- SCM arts = scm_reverse_x ($4, SCM_EOL);
+ if (ly_c_pair_p (post)) {
+ SCM arts = scm_reverse_x (post, SCM_EOL);
n->set_property ("articulations", arts);
}
+ if (ly_c_number_p (check))
+ {
+ int q = ly_scm2int (check);
+ n->set_property ("absolute-octave", scm_int2num (q-1));
+ }
+
+
$$ = n;
}
| DRUM_PITCH post_events {
| STRING_IDENTIFIER {
$$ = $1;
}
- | {
+ | SCORE {
SCM nn = THIS->lexer_->lookup_identifier ("pitchnames");
THIS->lexer_->push_note_state (alist_to_hashq (nn));
- }
- /* cont */ score_block {
- /* WIP this is a bit arbitrary,
- we should also allow \book or Composite_music.
- However, you'd typically want to change paper
- settings, and need a \score block anyway. */
-
+ } '{' score_body '}' {
+ Score * sc = $4;
+ $$ = scm_list_2 (ly_scheme_function ("score-markup"), sc->self_scm ());
+ scm_gc_unprotect_object (sc->self_scm ());
THIS->lexer_->pop_state ();
- Score *score = $2;
- Book *book = new Book;
- book->header_ = THIS->lexer_->lookup_identifier ("$globalheader");
- book->scores_.push (score);
-
- Output_def *paper = get_paper (THIS);
- book->bookpaper_ = get_bookpaper (THIS);
-
- SCM s = book->to_stencil (paper);
- scm_gc_unprotect_object (score->self_scm ());
- scm_gc_unprotect_object (book->self_scm ());
- $$ = scm_list_2 (ly_scheme_function ("stencil-markup"), s);
}
;
%%
void
-My_lily_parser::set_yydebug (bool )
+Lily_parser::set_yydebug (bool )
{
#if 0
yydebug = 1;
}
void
-My_lily_parser::do_yyparse ()
+Lily_parser::do_yyparse ()
{
yyparse ((void*)this);
}
*/
void
-My_lily_parser::beam_check (SCM dur)
+Lily_parser::beam_check (SCM dur)
{
Duration *d = unsmob_duration (dur);
if (unsmob_music (last_beam_start_) && d->duration_log () <= 2)
*/
int
-My_lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
+Lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
{
if (ly_c_string_p (sid)) {
*destination = sid;