X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=ac0d357f9a307831ddf95970f94ae9cc9dc74817;hb=5cec63df3df4d0e9ccbdeaaf27f520be5e63161c;hp=3268ae1e2573e52168d35d3945742ea0c7175062;hpb=f115fc1bdeb3fdd356db670ef4fe3e6b9aee019c;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index 3268ae1e25..ac0d357f9a 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -84,6 +84,7 @@ using namespace std; #include "book.hh" #include "context-def.hh" +#include "context-mod.hh" #include "dimensions.hh" #include "file-path.hh" #include "input.hh" @@ -198,7 +199,6 @@ void set_music_properties (Music *p, SCM a); %token MIDI "\\midi" %token NAME "\\name" %token NOTEMODE "\\notemode" -%token OBJECTID "\\objectid" %token OCTAVE "\\octave" %token ONCE "\\once" %token OVERRIDE "\\override" @@ -279,6 +279,7 @@ If we give names, Bison complains. %token CHORD_MODIFIER %token CHORD_REPETITION %token CONTEXT_DEF_IDENTIFIER +%token CONTEXT_MOD_IDENTIFIER %token DRUM_PITCH %token DURATION_IDENTIFIER %token EVENT_IDENTIFIER @@ -346,6 +347,7 @@ If we give names, Bison complains. %type chord_body_element %type command_element %type command_event +%type context_modification %type context_change %type direction_less_event %type direction_reqd_event @@ -426,7 +428,6 @@ If we give names, Bison complains. %type number_expression %type number_factor %type number_term -%type object_id_setting %type octave_check %type optional_context_mod %type optional_id @@ -475,10 +476,6 @@ lilypond: /* empty */ ; -object_id_setting: - OBJECTID STRING { $$ = $2; } - ; - toplevel_expression: lilypond_header { PARSER->lexer_->set_identifier (ly_symbol2scm ("$defaultheader"), $1); @@ -631,6 +628,9 @@ identifier_init: | DIGIT { $$ = scm_from_int ($1); } + | context_modification { + $$ = $1; + } ; context_def_spec_block: @@ -663,6 +663,13 @@ context_def_spec_body: | context_def_spec_body context_mod { unsmob_context_def ($$)->add_context_mod ($2); } + | context_def_spec_body context_modification { + Context_def *td = unsmob_context_def ($$); + SCM new_mods = unsmob_context_mod ($2)->get_mods (); + for (SCM m = new_mods; scm_is_pair (m); m = scm_cdr (m)) { + td->add_context_mod (scm_car (m)); + } + } ; @@ -735,9 +742,6 @@ book_body: $$->scores_ = SCM_EOL; $$->bookparts_ = SCM_EOL; } - | book_body object_id_setting { - $$->user_key_ = ly_scm2string ($2); - } ; bookpart_block: @@ -789,9 +793,6 @@ bookpart_body: $$->paper_ = 0; $$->scores_ = SCM_EOL; } - | bookpart_body object_id_setting { - $$->user_key_ = ly_scm2string ($2); - } ; score_block: @@ -816,9 +817,6 @@ score_body: $$->protect (); $$->origin ()->set_spot (@$); } - | score_body object_id_setting { - $$->user_key_ = ly_scm2string ($2); - } | score_body lilypond_header { $$->set_header ($2); } @@ -1023,22 +1021,45 @@ simple_music: | context_change ; +context_modification: + WITH { PARSER->lexer_->push_initial_state (); } '{' context_mod_list '}' + { + PARSER->lexer_->pop_state (); + $$ = $4; + } + | WITH CONTEXT_MOD_IDENTIFIER + { + $$ = $2; + } + | CONTEXT_MOD_IDENTIFIER + { + $$ = $1; + } + ; + optional_context_mod: - /**/ { $$ = SCM_EOL; } - | WITH { PARSER->lexer_->push_initial_state (); } - '{' context_mod_list '}' - { - PARSER->lexer_->pop_state (); - $$ = $4; - } - ; + /**/ { + $$ = SCM_EOL; + } + | context_modification + { + $$ = $1; + } + ; context_mod_list: - /* */ { $$ = SCM_EOL; } - | context_mod_list context_mod { - $$ = scm_cons ($2, $1); - } - ; + /**/ { + $$ = Context_mod ().smobbed_copy (); + } + | context_mod_list context_mod { + unsmob_context_mod ($1)->add_context_mod ($2); + } + | context_mod_list CONTEXT_MOD_IDENTIFIER { + Context_mod *md = unsmob_context_mod ($2); + if (md) + unsmob_context_mod ($1)->add_context_mods (md->get_mods ()); + } + ; composite_music: prefix_composite_music { $$ = $1; } @@ -1056,7 +1077,7 @@ function_scm_argument: ; /* An argument list. If a function \foo expects scm scm music, then the lexer expands \foo into the token sequence: - MUSIC_FUNCTION EXPECT_MUSIC EXPECT_SCM EXPECT_SCM + MUSIC_FUNCTION EXPECT_MUSIC EXPECT_SCM EXPECT_SCM EXPECT_NO_MORE_ARGS and this rule returns the reversed list of arguments. */ function_arglist_music_last: @@ -1120,10 +1141,18 @@ prefix_composite_music: $$ = run_music_function (PARSER, $1); } | CONTEXT simple_string optional_id optional_context_mod music { - $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, $4, SCM_BOOL_F); + Context_mod *ctxmod = unsmob_context_mod ($4); + SCM mods = SCM_EOL; + if (ctxmod) + mods = ctxmod->get_mods (); + $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, mods, SCM_BOOL_F); } | NEWCONTEXT simple_string optional_id optional_context_mod music { - $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, $4, SCM_BOOL_T); + Context_mod *ctxmod = unsmob_context_mod ($4); + SCM mods = SCM_EOL; + if (ctxmod) + mods = ctxmod->get_mods (); + $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, mods, SCM_BOOL_T); } | TIMES fraction music { @@ -1148,7 +1177,11 @@ prefix_composite_music: PARSER->lexer_->pop_state (); } | mode_changing_head_with_context optional_context_mod grouped_music_list { - $$ = MAKE_SYNTAX ("context-specification", @$, $1, SCM_EOL, $3, $2, SCM_BOOL_T); + Context_mod *ctxmod = unsmob_context_mod ($2); + SCM mods = SCM_EOL; + if (ctxmod) + mods = ctxmod->get_mods (); + $$ = MAKE_SYNTAX ("context-specification", @$, $1, SCM_EOL, $3, mods, SCM_BOOL_T); if ($1 == ly_symbol2scm ("ChordNames")) { $$ = MAKE_SYNTAX ("unrelativable-music", @$, $$); @@ -1942,6 +1975,7 @@ steno_duration: | DURATION_IDENTIFIER dots { Duration *d = unsmob_duration ($1); Duration k (d->duration_log (), d->dot_count () + $2); + k = k.compressed (d->factor ()); *d = k; $$ = $1; } @@ -2556,13 +2590,17 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid) } else if (scm_is_number (sid)) { *destination = sid; return NUMBER_IDENTIFIER; - } else if (unsmob_context_def (sid)) { - Context_def *def= unsmob_context_def (sid)->clone (); + } else if (unsmob_context_def (sid)) { + Context_def *def= unsmob_context_def (sid)->clone (); + + *destination = def->self_scm (); + def->unprotect (); - *destination = def->self_scm (); - def->unprotect (); + return CONTEXT_DEF_IDENTIFIER; + } else if (unsmob_context_mod (sid)) { + *destination = unsmob_context_mod (sid)->smobbed_copy (); - return CONTEXT_DEF_IDENTIFIER; + return CONTEXT_MOD_IDENTIFIER; } else if (unsmob_score (sid)) { Score *score = new Score (*unsmob_score (sid)); *destination = score->self_scm (); @@ -2745,8 +2783,8 @@ yylex (YYSTYPE *s, YYLTYPE *loc, void *v) Lily_parser *pars = (Lily_parser*) v; Lily_lexer *lex = pars->lexer_; - lex->lexval = (void*) s; - lex->lexloc = loc; + lex->lexval_ = (void*) s; + lex->lexloc_ = loc; lex->prepare_for_next_token (); return lex->yylex (); }