#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 TYPE
%token UNSET
%token WITH
+%token MARKUP
/* escaped */
/* FIXME: this sucks. The user will get to see these names:
\
%%
*/
+
%token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE
%token E_LEFTSQUARE E_RIGHTSQUARE E_TILDE
%token E_BACKSLASH
-%token <i> E_UNSIGNED
%token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET CHORD_SLASH
%token FIGURE_SPACE
%token <i> DIGIT
-%token <scm> NOTENAME_PITCH
-%token <scm> TONICNAME_PITCH
-%token <scm> CHORDMODIFIER_PITCH
-%token <scm> DURATION_IDENTIFIER
-%token <scm> FRACTION
+%token <i> UNSIGNED
+%token <i> E_UNSIGNED
%token <id> IDENTIFIER
-%token DRUMS
+%token <scm> CHORDMODIFIER_PITCH
%token <scm> DRUM_PITCH
-%token <scm> CHORD_MODIFIER
-%token <scm> SCORE_IDENTIFIER
-%token <scm> MUSIC_OUTPUT_DEF_IDENTIFIER
-%token <scm> NUMBER_IDENTIFIER
+%token <scm> DURATION_IDENTIFIER
%token <scm> EVENT_IDENTIFIER
%token <scm> MUSIC_IDENTIFIER CONTEXT_DEF_IDENTIFIER
-%token <scm> STRING_IDENTIFIER SCM_IDENTIFIER
+%token <scm> NOTENAME_PITCH
+%token <scm> NUMBER_IDENTIFIER
+%token <scm> OUTPUT_DEF_IDENTIFIER
%token <scm> RESTNAME
-%token <scm> STRING
+%token <scm> LYRICS_STRING
%token <scm> SCM_T
-%token <i> UNSIGNED
+%token <scm> SCORE_IDENTIFIER
+%token <scm> STRING
+%token <scm> STRING_IDENTIFIER SCM_IDENTIFIER
+%token <scm> TONICNAME_PITCH
+%token <scm> CHORD_MODIFIER
+%token <scm> FRACTION
%token <scm> REAL
-
-%token MARKUP
-%token <scm> MARKUP_HEAD_MARKUP0
%token <scm> MARKUP_HEAD_EMPTY
+%token <scm> MARKUP_HEAD_MARKUP0
%token <scm> MARKUP_HEAD_MARKUP0_MARKUP1
%token <scm> MARKUP_HEAD_SCM0
%token <scm> MARKUP_HEAD_SCM0_MARKUP1
%token <scm> MARKUP_HEAD_SCM0_SCM1
-%token <scm> MARKUP_HEAD_SCM0_SCM1_SCM2
%token <scm> MARKUP_HEAD_SCM0_SCM1_MARKUP2
-
+%token <scm> MARKUP_HEAD_SCM0_SCM1_SCM2
+%token <scm> MARKUP_IDENTIFIER MARKUP_HEAD_LIST0
%token <scm> MUSIC_FUNCTION
-%token <scm> MUSIC_FUNCTION_SCM
%token <scm> MUSIC_FUNCTION_MUSIC
-%token <scm> MUSIC_FUNCTION_SCM_MUSIC
%token <scm> MUSIC_FUNCTION_MUSIC_MUSIC
-%token <scm> MUSIC_FUNCTION_SCM_SCM_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
+%token DRUMS
-%token <scm> MARKUP_IDENTIFIER MARKUP_HEAD_LIST0
-%type <scm> markup markup_line markup_list markup_list_body full_markup
-%type <book> book_block book_body
-%type <outputdef> book_paper_head book_paper_block book_paper_body
+%type <book> book_block book_body
+%type <i> bare_int bare_unsigned
%type <i> exclamations questions dots optional_rest
-%type <i> bass_mod
-%type <scm> oct_check
-%type <scm> context_mod_list
-%type <scm> lyric_element
-%type <scm> bass_number br_bass_figure bass_figure figure_list figure_spec
-%type <scm> new_lyrics
-%type <outputdef> output_def
-%type <scm> lilypond_header lilypond_header_body
-%type <music> open_event close_event
+%type <i> script_dir
%type <i> sub_quotes sup_quotes
-%type <music> toplevel_music
-%type <music> simple_element event_chord command_element
+%type <i> tremolo_type
+%type <i> bass_mod
+
%type <music> Composite_music Simple_music Prefix_composite_music Generic_prefix_music
-%type <scm> Generic_prefix_music_scm
%type <music> Grouped_music_list
+%type <music> Music Sequential_music Simultaneous_music
%type <music> Repeated_music
-%type <scm> Alternative_music
-%type <i> tremolo_type
-%type <i> bare_int bare_unsigned
-%type <i> script_dir
-%type <scm> identifier_init
-%type <scm> simple_string
-
-%type <music> note_chord_element chord_body chord_body_element
-%type <scm> chord_body_elements
-%type <scm> steno_duration optional_notemode_duration multiplied_duration
-
-%type <scm> post_events
+%type <music> command_req
%type <music> gen_text_def direction_less_event direction_reqd_event
-%type <scm> steno_pitch pitch absolute_pitch pitch_also_in_chords
-%type <scm> steno_tonic_pitch
-%type <scm> duration_length fraction
-
-%type <scm> chord_item chord_items chord_separator new_chord
-%type <scm> step_number step_numbers
-
-%type <scm> embedded_scm scalar
-%type <music> Music Sequential_music Simultaneous_music
-%type <music> relative_music re_rhythmed_music
%type <music> music_property_def context_change
-%type <scm> context_prop_spec
-%type <scm> Music_list
-%type <scm> property_operation
-%type <scm> context_mod context_def_mod optional_context_mod
-%type <outputdef> music_output_def_body music_output_def_head
+%type <music> note_chord_element chord_body chord_body_element
+%type <music> open_event close_event
%type <music> post_event tagged_post_event
-%type <music> command_req
+%type <music> relative_music re_rhythmed_music
+%type <music> simple_element event_chord command_element
%type <music> string_number_event
-%type <scm> string bare_number number_expression number_term number_factor
-%type <score> score_block score_body
+%type <music> toplevel_music
+%type <music> tempo_event
+
+%type <outputdef> output_def_body output_def_head
+%type <outputdef> output_def book_paper_block
+%type <scm> Music_list
+%type <scm> chord_body_elements
+%type <scm> chord_item chord_items chord_separator new_chord
%type <scm> context_def_spec_block context_def_spec_body
-%type <music> tempo_event
+%type <scm> context_mod context_def_mod optional_context_mod
+%type <scm> context_prop_spec
+%type <scm> duration_length fraction
+%type <scm> embedded_scm scalar
+%type <scm> identifier_init
+%type <scm> lilypond_header lilypond_header_body
+%type <scm> new_lyrics
+%type <scm> post_events
+%type <scm> property_operation
%type <scm> script_abbreviation
+%type <scm> simple_string
+%type <scm> steno_pitch pitch absolute_pitch pitch_also_in_chords
+%type <scm> steno_tonic_pitch
+%type <scm> step_number step_numbers
+%type <scm> string bare_number number_expression number_term number_factor
+%type <scm> bass_number br_bass_figure bass_figure figure_list figure_spec
+%type <scm> context_mod_list
+%type <scm> octave_check
+%type <scm> steno_duration optional_notemode_duration multiplied_duration
+%type <scm> Generic_prefix_music_scm
+%type <scm> lyric_element
+%type <scm> Alternative_music
+%type <scm> markup markup_line markup_list markup_list_body full_markup
+%type <score> score_block score_body
%left '-' '+'
THIS->lexer_->set_identifier (id, od->self_scm ());
scm_gc_unprotect_object (od->self_scm ());
}
- | book_paper_block {
- THIS->lexer_->set_identifier (ly_symbol2scm ("$defaultbookpaper"), $1->self_scm ());
- scm_gc_unprotect_object ($1->self_scm ());
- }
;
toplevel_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:
;
-book_paper_block:
- book_paper_body '}' {
- $$ = $1;
- THIS->lexer_->remove_scope ();
- }
- ;
-book_paper_head:
- BOOKPAPER '{' {
- $$ = get_bookpaper (THIS);
- $$->input_origin_ = THIS->here_input ();
- THIS->lexer_->add_scope ($$->scope_);
- }
- ;
-
-book_paper_body:
- book_paper_head
- | book_paper_body assignment { }
- ;
-
-
book_block:
BOOK {
$$->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;
/*
- MIDI
+ OUTPUT DEF
*/
+
+book_paper_block:
+ output_def {
+ $$ = $1;
+ if ($$->lookup_variable (ly_symbol2scm ("is-bookpaper")) != SCM_BOOL_T)
+ {
+ THIS->parser_error (_("Need \\bookpaper for bookpaper block."));
+ $$ = get_bookpaper (THIS);
+ }
+ }
+ ;
+
+
output_def:
- music_output_def_body '}' {
+ output_def_body '}' {
$$ = $1;
if ($1->parent_)
THIS->lexer_->remove_scope ();
}
;
-music_output_def_head:
- MIDI {
+output_def_head:
+ BOOKPAPER {
+ $$ = get_bookpaper (THIS);
+ $$->input_origin_ = THIS->here_input ();
+ THIS->lexer_->add_scope ($$->scope_);
+ }
+ | MIDI {
Output_def *p = get_midi (THIS);
$$ = p;
THIS->lexer_->add_scope (p->scope_);
;
-music_output_def_body:
- music_output_def_head '{' {
+output_def_body:
+ output_def_head '{' {
$$ = $1;
$$->input_origin_.set_spot (THIS->here_input ());
THIS->lexer_->push_initial_state ();
}
- | music_output_def_head '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
+ | output_def_head '{' OUTPUT_DEF_IDENTIFIER {
scm_gc_unprotect_object ($1->self_scm ());
Output_def *o = unsmob_output_def ($3);
o->input_origin_.set_spot (THIS->here_input ());
THIS->lexer_->add_scope (o->scope_);
THIS->lexer_->push_initial_state ();
}
- | music_output_def_body assignment {
+ | output_def_body assignment {
}
- | music_output_def_body context_def_spec_block {
+ | output_def_body context_def_spec_block {
assign_context_def ($$, $2);
}
- | music_output_def_body tempo_event {
+ | output_def_body tempo_event {
/*
junk this ? there already is tempo stuff in
music.
set_tempo ($$, d->get_length (), m);
scm_gc_unprotect_object ($2->self_scm ());
}
- | music_output_def_body error {
+ | output_def_body error {
}
;
$$ = 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 {
}
;
-oct_check:
+octave_check:
/**/ { $$ = SCM_EOL; }
| '=' { $$ = scm_int2num (0); }
| '=' sub_quotes { $$ = scm_int2num ($2); }
;
simple_element:
- pitch exclamations questions oct_check optional_notemode_duration optional_rest {
+ pitch exclamations questions octave_check optional_notemode_duration optional_rest {
Input i = THIS->pop_spot ();
if (!THIS->lexer_->is_note_state ())
| 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;
p = p->clone ();
*destination = p->self_scm ();
- return MUSIC_OUTPUT_DEF_IDENTIFIER;
+ return OUTPUT_DEF_IDENTIFIER;
} else if (Text_item::markup_p (sid)) {
*destination = sid;
return MARKUP_IDENTIFIER;