X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=19cd1d3216dff81b12bd74d94d1c2b5acc699084;hb=5287c2ed78ed3d434d67651896902f23a9b52eb1;hp=c0a6061ddf33b6cd82a446d0d12373b9de9de0c2;hpb=19125bf158fe23501e40eef6da3bbf876c664f2a;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index c0a6061ddf..19cd1d3216 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -24,7 +24,8 @@ this. */ #include -#include + +//#include #include "translator-def.hh" #include "lily-guile.hh" @@ -35,7 +36,7 @@ this. #include "midi-def.hh" #include "main.hh" #include "file-path.hh" -#include "debug.hh" +#include "warn.hh" #include "dimensions.hh" #include "command-request.hh" #include "musical-request.hh" @@ -47,7 +48,6 @@ this. #include "property-iterator.hh" #include "file-results.hh" #include "input.hh" -#include "scope.hh" #include "relative-music.hh" #include "lyric-combine-music.hh" #include "transposed-music.hh" @@ -66,7 +66,7 @@ bool regular_identifier_b (SCM id) { String str = ly_scm2string (id); - char const *s = str.ch_C() ; + char const *s = str.to_str0 () ; bool v = true; while (*s && v) @@ -99,9 +99,9 @@ is_duration_b (int t) void set_music_properties (Music *p, SCM a) { - for (SCM k = a; gh_pair_p (k); k = gh_cdr (k)) + for (SCM k = a; gh_pair_p (k); k = ly_cdr (k)) { - p->set_mus_property (gh_caar (k), gh_cdar (k)); + p->internal_set_mus_property (ly_caar (k), ly_cdar (k)); } } @@ -112,24 +112,28 @@ set_music_properties (Music *p, SCM a) // needed for bison.simple's malloc () and free () + #include +#include + -#ifndef NDEBUG -#define YYDEBUG 1 -#endif #define YYERROR_VERBOSE 1 -#define YYPARSE_PARAM my_lily_parser_l -#define YYLEX_PARAM my_lily_parser_l +#define YYPARSE_PARAM my_lily_parser +#define YYLEX_PARAM my_lily_parser #define THIS\ - ((My_lily_parser *) my_lily_parser_l) + ((My_lily_parser *) my_lily_parser) #define yyerror THIS->parser_error #define ARRAY_SIZE(a,s) if (a.size () != s) THIS->parser_error (_f ("Expecting %d arguments", s)) %} +/* We use SCMs to do strings, because it saves us the trouble of +deleting them. Let's hope that a stack overflow doesnt trigger a move +of the parse stack onto the heap. */ + %union { @@ -138,16 +142,11 @@ set_music_properties (Music *p, SCM a) String *string; // needed by the lexer as temporary scratch area. Music *music; Score *score; - Scope *scope; Scheme_hash_table *scmhash; Music_output_def * outputdef; Request * request; - /* We use SCMs to do strings, because it saves us the trouble of -deleting them. Let's hope that a stack overflow doesnt trigger a move -of the parse stack onto the heap. */ - SCM scm; Tempo_req *tempo; @@ -156,13 +155,13 @@ of the parse stack onto the heap. */ %{ int -yylex (YYSTYPE *s, void * v_l) +yylex (YYSTYPE *s, void * v) { - My_lily_parser *pars_l = (My_lily_parser*) v_l; - My_lily_lexer * lex_l = pars_l->lexer_p_; + My_lily_parser *pars = (My_lily_parser*) v; + My_lily_lexer * lex = pars->lexer_; - lex_l->lexval_l = (void*) s; - return lex_l->yylex (); + lex->lexval = (void*) s; + return lex->yylex (); } @@ -188,13 +187,14 @@ yylex (YYSTYPE *s, void * v_l) %token CONSISTS %token DURATION %token SEQUENTIAL -%token ELEMENTDESCRIPTIONS +%token GROBDESCRIPTIONS %token SIMULTANEOUS %token CONSISTSEND %token DENIES %token DURATION %token EXTENDER %token FIGURES FIGURE_OPEN FIGURE_CLOSE +%token FIGURE_BRACKET_CLOSE FIGURE_BRACKET_OPEN %token GLISSANDO %token GRACE %token HEADER @@ -215,7 +215,6 @@ yylex (YYSTYPE *s, void * v_l) %token PAPER %token PARTIAL %token PENALTY -%token PORRECTUS %token PROPERTY %token OVERRIDE SET REVERT %token PT_T @@ -240,14 +239,19 @@ yylex (YYSTYPE *s, void * v_l) %token TYPE %token UNSET %token CONTEXT +%token REST /* escaped */ %token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE -%token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET +%token E_LEFTSQUARE E_RIGHTSQUARE E_TILDE +%token E_BACKSLASH +%token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET +%token FIGURE_SPACE -%type exclamations questions dots + +%type exclamations questions dots optional_rest %type bass_number bass_mod -%type bass_figure figure_list figure_spec +%type br_bass_figure bass_figure figure_list figure_spec %token DIGIT %token NOTENAME_PITCH %token TONICNAME_PITCH @@ -276,7 +280,8 @@ yylex (YYSTYPE *s, void * v_l) %type request_with_dir request_that_take_dir verbose_request %type sub_quotes sup_quotes %type simple_element request_chord command_element Simple_music Composite_music -%type Alternative_music Repeated_music +%type Repeated_music +%type Alternative_music %type tremolo_type %type bare_int bare_unsigned %type script_dir @@ -284,7 +289,7 @@ yylex (YYSTYPE *s, void * v_l) %type identifier_init %type steno_duration optional_notemode_duration multiplied_duration -%type explicit_duration +%type verbose_duration %type pre_requests post_requests %type gen_text_def @@ -297,7 +302,7 @@ yylex (YYSTYPE *s, void * v_l) %type duration_length fraction %type embedded_scm scalar -%type Music Sequential_music Simultaneous_music Music_sequence +%type Music Sequential_music Simultaneous_music %type relative_music re_rhythmed_music part_combined_music %type property_def translator_change %type Music_list @@ -331,33 +336,33 @@ lilypond: /* empty */ | lilypond toplevel_expression {} | lilypond assignment { } | lilypond error { - THIS->error_level_i_ = 1; + THIS->error_level_ = 1; } | lilypond INVALID { - THIS->error_level_i_ = 1; + THIS->error_level_ = 1; } ; toplevel_expression: notenames_block { - THIS->lexer_p_->pitchname_tab_ = $1; + THIS->lexer_->pitchname_tab_ = $1; } | chordmodifiers_block { - THIS->lexer_p_->chordmodifier_tab_ = $1; + THIS->lexer_->chordmodifier_tab_ = $1; } | lilypond_header { - if (global_header_p) - scm_gc_unprotect_object (global_header_p->self_scm ()); - global_header_p = $1; + if (global_header) + scm_gc_unprotect_object (global_header->self_scm ()); + global_header = $1; } | score_block { - score_global_array.push ($1); + score_globals.push ($1); } | output_def { if (dynamic_cast ($1)) - THIS->lexer_p_->set_identifier ("$defaultpaper", $1->self_scm ()); + THIS->lexer_->set_identifier (gh_str02scm ("$defaultpaper"), $1->self_scm ()); else if (dynamic_cast ($1)) - THIS->lexer_p_->set_identifier ("$defaultmidi", $1->self_scm ()); + THIS->lexer_->set_identifier (gh_str02scm ("$defaultmidi"), $1->self_scm ()); } | embedded_scm { // junk value @@ -383,12 +388,12 @@ notenames_body: int i = scm_ilength ($1); SCM tab = scm_make_vector (gh_int2scm (i), SCM_EOL); - for (SCM s = $1; gh_pair_p (s); s = gh_cdr (s)) { - SCM pt = gh_cdar (s); + for (SCM s = $1; gh_pair_p (s); s = ly_cdr (s)) { + SCM pt = ly_cdar (s); if (!unsmob_pitch (pt)) THIS->parser_error ("Need pitch object."); else - scm_hashq_set_x (tab, gh_caar (s), pt); + scm_hashq_set_x (tab, ly_caar (s), pt); } $$ = tab; @@ -398,9 +403,7 @@ notenames_body: lilypond_header_body: { $$ = new Scheme_hash_table; - - Scope *sc = new Scope ($$); - THIS->lexer_p_-> scope_l_arr_.push (sc); + THIS->lexer_-> scopes_.push ($$); } | lilypond_header_body assignment { @@ -410,7 +413,7 @@ lilypond_header_body: lilypond_header: HEADER '{' lilypond_header_body '}' { $$ = $3; - delete THIS->lexer_p_-> scope_l_arr_.pop (); + THIS->lexer_->scopes_.pop (); } ; @@ -434,7 +437,7 @@ assignment: ip.warning (_ ("Identifier should have alphabetic characters only")); } - THIS->lexer_p_->set_identifier (ly_scm2string ($1), $4); + THIS->lexer_->set_identifier ($1, $4); /* TODO: devise standard for protection in parser. @@ -468,7 +471,7 @@ identifier_init: $$ = $1->self_scm (); scm_gc_unprotect_object ($$); } - | explicit_duration { + | verbose_duration { $$ = $1; } | number_expression { @@ -507,6 +510,10 @@ translator_spec_body: unsmob_translator_def ($$) ->add_push_property (scm_string_to_symbol ($2), $4, $6); } + | translator_spec_body STRING SET embedded_scm '=' embedded_scm { + unsmob_translator_def ($$) + ->add_push_property (scm_string_to_symbol ($2), $4, $6); + } | translator_spec_body STRING REVERT embedded_scm { unsmob_translator_def ($$)->add_pop_property ( scm_string_to_symbol ($2), $4); @@ -521,11 +528,11 @@ translator_spec_body: Translator_def*td = unsmob_translator_def ($$); td->type_aliases_ = gh_cons ($3, td->type_aliases_); } - | translator_spec_body ELEMENTDESCRIPTIONS embedded_scm { - for (SCM p = $3; gh_pair_p (p); p = gh_cdr (p)) - unsmob_translator_def ($$) - ->add_property_assign (scm_symbol_to_string (gh_caar (p)), gh_cdar (p)); - + | translator_spec_body GROBDESCRIPTIONS embedded_scm { + Translator_def*td = unsmob_translator_def($$); + // td->add_property_assign (ly_symbol2scm ("allGrobDescriptions"), $3); + for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p)) + td->add_property_assign (scm_symbol_to_string (ly_caar (p)), ly_cdar (p)); } | translator_spec_body CONSISTSEND STRING { unsmob_translator_def ($$)->add_last_element ( $3); @@ -551,10 +558,10 @@ score_block: /*cont*/ '{' score_body '}' { THIS->pop_spot (); $$ = $4; - if (!$$->def_p_arr_.size ()) + if (!$$->defs_.size ()) { Music_output_def *id = - unsmob_music_output_def (THIS->lexer_p_->lookup_identifier ("$defaultpaper")); + unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper")); $$->add_output (id ? id->clone () : new Paper_def ); } } @@ -567,7 +574,15 @@ score_body: $$->set_spot (THIS->here_input ()); SCM m = $1->self_scm (); scm_gc_unprotect_object (m); + + /* + guh. + */ + SCM check_funcs = scm_c_eval_string ("toplevel-music-functions"); + for (; gh_pair_p (check_funcs); check_funcs = gh_cdr (check_funcs)) + m = gh_call1 (gh_car (check_funcs), m); $$->music_ = m; + } | SCORE_IDENTIFIER { $$ = new Score (*unsmob_score ($1)); @@ -575,7 +590,7 @@ score_body: } | score_body lilypond_header { scm_gc_unprotect_object ($2->self_scm ()); - $$->header_p_ = $2; + $$->header_ = $2; } | score_body output_def { $$->add_output ($2); @@ -592,13 +607,13 @@ score_body: output_def: music_output_def_body '}' { $$ = $1; - THIS-> lexer_p_-> scope_l_arr_.pop (); + THIS-> lexer_-> scopes_.pop (); } ; music_output_def_body: MIDI '{' { - Music_output_def *id = unsmob_music_output_def (THIS->lexer_p_->lookup_identifier ("$defaultmidi")); + Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultmidi")); Midi_def* p =0; @@ -608,29 +623,29 @@ music_output_def_body: p = new Midi_def; $$ = p; - THIS->lexer_p_->scope_l_arr_.push (p->scope_p_); + THIS->lexer_->scopes_.push (p->variable_tab_); } | PAPER '{' { - Music_output_def *id = unsmob_music_output_def (THIS->lexer_p_->lookup_identifier ("$defaultpaper")); + Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper")); Paper_def *p = 0; if (id) p = dynamic_cast (id->clone ()); else p = new Paper_def; - THIS-> lexer_p_-> scope_l_arr_.push (p->scope_p_); + THIS-> lexer_-> scopes_.push (p->variable_tab_); $$ = p; } | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER { Music_output_def *p = unsmob_music_output_def ($3); p = p->clone (); - THIS->lexer_p_->scope_l_arr_.push (p->scope_p_); + THIS->lexer_->scopes_.push (p->variable_tab_); $$ = p; } | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER { Music_output_def *p = unsmob_music_output_def ($3); p = p->clone (); - THIS->lexer_p_->scope_l_arr_.push (p->scope_p_); + THIS->lexer_->scopes_.push (p->variable_tab_); $$ = p; } | music_output_def_body assignment { @@ -649,7 +664,9 @@ music_output_def_body: */ int m = gh_scm2int ( $2->get_mus_property ("metronome-count")); Duration *d = unsmob_duration ($2->get_mus_property ("duration")); - dynamic_cast ($$)->set_tempo (d->length_mom (), m); + Midi_def * md = dynamic_cast ($$); + if (md) + md->set_tempo (d->length_mom (), m); } | music_output_def_body error { @@ -664,6 +681,13 @@ tempo_request: } ; +/* +The representation of a list is the + + (LIST . LAST-CONS) + + to have efficient append. +*/ Music_list: /* empty */ { $$ = gh_cons (SCM_EOL, SCM_EOL); } @@ -671,8 +695,8 @@ Music_list: /* empty */ { SCM s = $$; SCM c = gh_cons ($2->self_scm (), SCM_EOL); scm_gc_unprotect_object ($2->self_scm ()); /* UGH */ - if (gh_pair_p (gh_cdr (s))) - gh_set_cdr_x (gh_cdr (s), c); /* append */ + if (gh_pair_p (ly_cdr (s))) + gh_set_cdr_x (ly_cdr (s), c); /* append */ else gh_set_car_x (s, c); /* set first cons */ gh_set_cdr_x (s, c) ; /* remember last cell */ @@ -689,77 +713,82 @@ Music: Alternative_music: /* empty */ { - $$ = 0; + $$ = SCM_EOL; } - | ALTERNATIVE Music_sequence { - $$ = $2; - $2->set_spot (THIS->here_input ()); + | ALTERNATIVE '{' Music_list '}' { + $$ = $3; } ; - - - Repeated_music: REPEAT string bare_unsigned Music Alternative_music { - Music_sequence* alts = dynamic_cast ($5); - if (alts && $3 < alts->length_i ()) - $5->origin ()->warning (_ ("More alternatives than repeats. Junking excess alternatives.")); Music *beg = $4; int times = $3; + SCM alts = gh_pair_p ($5) ? gh_car ($5) : SCM_EOL; + if (times < scm_ilength (alts)) { + unsmob_music (gh_car (alts)) + ->origin ()->warning ( + _("More alternatives than repeats. Junking excess alternatives.")); + alts = ly_truncate_list (times, alts); + } Repeated_music * r = new Repeated_music (SCM_EOL); - if (beg) { - r-> set_mus_property ("body", beg->self_scm ()); + r-> set_mus_property ("element", beg->self_scm ()); scm_gc_unprotect_object (beg->self_scm ()); } r->set_mus_property ("repeat-count", gh_int2scm (times >? 1)); - if (alts) - { - alts->truncate (times); - r-> set_mus_property ("alternatives", alts->self_scm ()); - scm_gc_unprotect_object (alts->self_scm ()); - } + r-> set_mus_property ("elements",alts); SCM func = scm_primitive_eval (ly_symbol2scm ("repeat-name-to-ctor")); SCM result = gh_call1 (func, $2); + if (gh_equal_p ($2, ly_str02scm ("tremolo"))) + { + /* + we can not get durations and other stuff correct down the line, so we have to + add to the duration log here. + + TODO: do dots. + */ + SCM func = scm_primitive_eval (ly_symbol2scm ("shift-duration-log")); + gh_call2 (func, r->self_scm (), gh_int2scm(-intlog2 ($3))); + } + set_music_properties (r, result); r->set_spot (*$4->origin ()); - $$ = r; - } - ; -Music_sequence: '{' Music_list '}' { - $$ = new Music_sequence (SCM_EOL); - $$->set_mus_property ("elements", gh_car ($2)); + $$ = r; } ; Sequential_music: SEQUENTIAL '{' Music_list '}' { $$ = new Sequential_music (SCM_EOL); - $$->set_mus_property ("elements", gh_car ($3)); + $$->set_mus_property ("elements", ly_car ($3)); + $$->set_spot(THIS->here_input()); } | '{' Music_list '}' { $$ = new Sequential_music (SCM_EOL); - $$->set_mus_property ("elements", gh_car ($2)); + $$->set_mus_property ("elements", ly_car ($2)); + $$->set_spot(THIS->here_input()); } ; Simultaneous_music: SIMULTANEOUS '{' Music_list '}'{ $$ = new Simultaneous_music (SCM_EOL); - $$->set_mus_property ("elements", gh_car ($3)); + $$->set_mus_property ("elements", ly_car ($3)); + $$->set_spot(THIS->here_input()); } | '<' Music_list '>' { $$ = new Simultaneous_music (SCM_EOL); - $$->set_mus_property ("elements", gh_car ($2)); + $$->set_mus_property ("elements", ly_car ($2)); + $$->set_spot(THIS->here_input()); } ; @@ -788,6 +817,8 @@ Simple_music: } | MUSIC_IDENTIFIER { $$ = unsmob_music ($1)->clone (); + + $$->set_spot (THIS->here_input()); } | property_def | translator_change @@ -823,8 +854,8 @@ Composite_music: Sequential_music_iterator in combination with grace notes. */ - SCM start = THIS->lexer_p_->lookup_identifier ("startGraceMusic"); - SCM stop = THIS->lexer_p_->lookup_identifier ("stopGraceMusic"); + SCM start = THIS->lexer_->lookup_identifier ("startGraceMusic"); + SCM stop = THIS->lexer_->lookup_identifier ("stopGraceMusic"); Music *startm = unsmob_music (start); Music *stopm = unsmob_music (stop); @@ -853,8 +884,6 @@ Composite_music: $$->set_mus_property ("element", $2->self_scm ()); scm_gc_unprotect_object ($2->self_scm ()); #endif - - } | CONTEXT string '=' string Music { Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -873,7 +902,7 @@ Composite_music: fraction Music { - int n = gh_scm2int (gh_car ($3)); int d = gh_scm2int (gh_cdr ($3)); + int n = gh_scm2int (ly_car ($3)); int d = gh_scm2int (ly_cdr ($3)); Music *mp = $4; $$ = new Time_scaled_music (SCM_EOL); $$->set_spot (THIS->pop_spot ()); @@ -918,37 +947,39 @@ Composite_music: $$ = m; } | NOTES - { THIS->lexer_p_->push_note_state (); } + { THIS->lexer_->push_note_state (); } Music { $$ = $3; - THIS->lexer_p_->pop_state (); + THIS->lexer_->pop_state (); } | FIGURES - { THIS->lexer_p_->push_figuredbass_state (); } + { THIS->lexer_->push_figuredbass_state (); } Music { Music * chm = new Untransposable_music () ; chm->set_mus_property ("element", $3->self_scm ()); $$ = chm; + scm_gc_unprotect_object ($3->self_scm()); - THIS->lexer_p_->pop_state (); + THIS->lexer_->pop_state (); } | CHORDS - { THIS->lexer_p_->push_chord_state (); } + { THIS->lexer_->push_chord_state (); } Music { Music * chm = new Un_relativable_music ; chm->set_mus_property ("element", $3->self_scm ()); + scm_gc_unprotect_object ($3->self_scm()); $$ = chm; - THIS->lexer_p_->pop_state (); + THIS->lexer_->pop_state (); } | LYRICS - { THIS->lexer_p_->push_lyric_state (); } + { THIS->lexer_->push_lyric_state (); } Music { $$ = $3; - THIS->lexer_p_->pop_state (); + THIS->lexer_->pop_state (); } | relative_music { $$ = $1; } | re_rhythmed_music { $$ = $1; } @@ -972,8 +1003,7 @@ relative_music: re_rhythmed_music: ADDLYRICS Music Music { Lyric_combine_music * l = new Lyric_combine_music (SCM_EOL); - l->set_mus_property ("music", $2->self_scm ()); - l->set_mus_property ("lyrics", $3->self_scm ()); + l->set_mus_property ("elements", gh_list ($2->self_scm (), $3->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); scm_gc_unprotect_object ($2->self_scm ()); $$ = l; @@ -985,13 +1015,11 @@ part_combined_music: Part_combine_music * p = new Part_combine_music (SCM_EOL); p->set_mus_property ("what", $2); - p->set_mus_property ("one", $3->self_scm ()); - p->set_mus_property ("two", $4->self_scm ()); + p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED)); scm_gc_unprotect_object ($3->self_scm ()); scm_gc_unprotect_object ($4->self_scm ()); - $$ = p; } ; @@ -1043,7 +1071,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", Push_property_iterator::constructor_cxx_function); - t->set_mus_property ("symbols", scm_string_to_symbol ($4)); + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("pop-first", SCM_BOOL_T); t->set_mus_property ("grob-property", $6); t->set_mus_property ("grob-value", $8); @@ -1059,7 +1087,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", Push_property_iterator::constructor_cxx_function); - t->set_mus_property ("symbols", scm_string_to_symbol ($4)); + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("grob-property", $6); t->set_mus_property ("grob-value", $8); Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -1075,7 +1103,7 @@ property_def: Music *t = new Music (SCM_EOL); t->set_mus_property ("iterator-ctor", Pop_property_iterator::constructor_cxx_function); - t->set_mus_property ("symbols", scm_string_to_symbol ($4)); + t->set_mus_property ("symbol", scm_string_to_symbol ($4)); t->set_mus_property ("grob-property", $6); Context_specced_music *csm = new Context_specced_music (SCM_EOL); @@ -1089,11 +1117,12 @@ property_def: } ; + scalar: - string { $$ = $1; } - | bare_int { $$ = gh_int2scm ($1); } - | embedded_scm { $$ = $1; } - ; + string { $$ = $1; } + | bare_int { $$ = gh_int2scm ($1); } + | embedded_scm { $$ = $1; } + ; request_chord: @@ -1101,15 +1130,16 @@ request_chord: THIS->push_spot (); } /*cont */ simple_element post_requests { Music_sequence *l = dynamic_cast ($3); - if (l) { - for (int i=0; i < $1->size (); i++) - l->append_music ($1->elem (i)); - for (int i=0; i < $4->size (); i++) - l->append_music ($4->elem (i)); - } - else - programming_error ("Need Sequence to add music to"); + + $1->concat (*$4); + for (int i=0; i < $1->size (); i++) { + Music * m = $1->elem (i); + l->append_music (m); + } $$ = $3; + + delete $1; + delete $4; } | command_element ; @@ -1118,9 +1148,44 @@ command_element: command_req { $$ = new Request_chord (SCM_EOL); $$->set_mus_property ("elements", gh_cons ($1->self_scm (), SCM_EOL)); + scm_gc_unprotect_object ($1->self_scm()); + $$-> set_spot (THIS->here_input ()); $1-> set_spot (THIS->here_input ()); } + | E_LEFTSQUARE { + Span_req *l = new Span_req; + l->set_span_dir (START); + l->set_mus_property ("span-type", ly_str02scm ("ligature")); + l->set_spot (THIS->here_input ()); + + $$ = new Request_chord (SCM_EOL); + $$->set_mus_property ("elements", gh_cons (l->self_scm (), SCM_EOL)); + scm_gc_unprotect_object (l->self_scm()); + $$->set_spot (THIS->here_input ()); + } + | E_RIGHTSQUARE { + Span_req *l = new Span_req; + l->set_span_dir (STOP); + l->set_mus_property ("span-type", ly_str02scm ("ligature")); + l->set_spot (THIS->here_input ()); + + $$ = new Request_chord (SCM_EOL); + $$->set_mus_property ("elements", gh_cons (l->self_scm (), SCM_EOL)); + $$->set_spot (THIS->here_input ()); + scm_gc_unprotect_object (l->self_scm()); + + } + | E_BACKSLASH { + $$ = new Music (gh_list (gh_cons (ly_symbol2scm ("name"), ly_symbol2scm ("separator")), SCM_UNDEFINED)); + $$->set_spot (THIS->here_input ()); + } + | '|' { + + extern Music * get_barcheck(); + $$ = get_barcheck (); + $$->set_spot (THIS->here_input ()); + } | BAR STRING { Music *t = set_property_music (ly_symbol2scm ("whichBar"), $2); @@ -1149,9 +1214,9 @@ command_element: SCM result = gh_call1 (func, $2); SCM l = SCM_EOL; - for (SCM s = result ; gh_pair_p (s); s = gh_cdr (s)) { + for (SCM s = result ; gh_pair_p (s); s = ly_cdr (s)) { Music * p = new Music (SCM_EOL); - set_music_properties (p, gh_car (s)); + set_music_properties (p, ly_car (s)); l = gh_cons (p->self_scm (), l); scm_gc_unprotect_object (p->self_scm ()); } @@ -1168,17 +1233,17 @@ command_element: | TIME_T fraction { Music * p1 = set_property_music (ly_symbol2scm ( "timeSignatureFraction"), $2); - int l = gh_scm2int (gh_car ($2)); - int o = gh_scm2int (gh_cdr ($2)); - - Moment one_beat = Moment (1)/Moment (o); - Moment len = Moment (l) * one_beat; + int l = gh_scm2int (ly_car ($2)); + int o = gh_scm2int (ly_cdr ($2)); + + Moment one_beat = Moment (1)/Moment (o); + Moment len = Moment (l) * one_beat; Music *p2 = set_property_music (ly_symbol2scm ("measureLength"), len.smobbed_copy ()); Music *p3 = set_property_music (ly_symbol2scm ("beatLength"), one_beat.smobbed_copy ()); - SCM list = gh_list (p1->self_scm (), p2->self_scm (), p3->self_scm(), SCM_UNDEFINED); + SCM list = scm_list_n (p1->self_scm (), p2->self_scm (), p3->self_scm(), SCM_UNDEFINED); Sequential_music *seq = new Sequential_music (SCM_EOL); seq->set_mus_property ("elements", list); @@ -1215,9 +1280,6 @@ shorthand_command_req: | hyphen_req { $$ = $1; } - | '|' { - $$ = new Barcheck_req; - } | '~' { $$ = new Tie_req; } @@ -1226,6 +1288,9 @@ shorthand_command_req: b->set_span_dir (START); b->set_mus_property ("span-type", ly_str02scm ("beam")); $$ =b; + + + THIS->last_beam_start_ = b->self_scm (); } | ']' { Span_req*b= new Span_req; @@ -1236,19 +1301,18 @@ shorthand_command_req: | BREATHE { $$ = new Breathing_sign_req; } - | PORRECTUS { + | E_TILDE { $$ = new Porrectus_req; } ; - verbose_command_req: COMMANDSPANREQUEST bare_int STRING { /*TODO: junkme */ - Span_req * sp_p = new Span_req; - sp_p-> set_span_dir ( Direction ($2)); - sp_p->set_mus_property ("span-type",$3); - sp_p->set_spot (THIS->here_input ()); - $$ = sp_p; + Span_req * sp = new Span_req; + sp-> set_span_dir ( Direction ($2)); + sp->set_mus_property ("span-type",$3); + sp->set_spot (THIS->here_input ()); + $$ = sp; } | MARK DEFAULT { Mark_req * m = new Mark_req; @@ -1258,11 +1322,8 @@ verbose_command_req: Mark_req *m = new Mark_req; m->set_mus_property ("label", $2); $$ = m; - } | PENALTY SCM_T { - - Break_req * b = new Break_req; SCM s = $2; if (!gh_number_p (s)) @@ -1273,24 +1334,24 @@ verbose_command_req: $$ = b; } | SKIP duration_length { - Skip_req * skip_p = new Skip_req; - skip_p->set_mus_property ("duration", $2); + Skip_req * skip = new Skip_req; + skip->set_mus_property ("duration", $2); - $$ = skip_p; + $$ = skip; } | tempo_request { $$ = $1; } | KEY DEFAULT { - Key_change_req *key_p= new Key_change_req; - $$ = key_p; + Key_change_req *key= new Key_change_req; + $$ = key; } | KEY NOTENAME_PITCH SCM_IDENTIFIER { - Key_change_req *key_p= new Key_change_req; + Key_change_req *key= new Key_change_req; - key_p->set_mus_property ("pitch-alist", $3); - ((Music* )key_p)->transpose (* unsmob_pitch ($2)); - $$ = key_p; + key->set_mus_property ("pitch-alist", $3); + ((Music*)key)->transpose (* unsmob_pitch ($2)); + $$ = key; } ; @@ -1315,7 +1376,7 @@ request_that_take_dir: gen_text_def | verbose_request | script_abbreviation { - SCM s = THIS->lexer_p_->lookup_identifier ("dash" + ly_scm2string ($1)); + SCM s = THIS->lexer_->lookup_identifier ("dash" + ly_scm2string ($1)); Articulation_req *a = new Articulation_req; if (gh_string_p (s)) a->set_mus_property ("articulation-type", s); @@ -1344,17 +1405,18 @@ verbose_request: TODO: junkme, use text-type == dynamic */ Text_script_req *d = new Text_script_req; - d->set_mus_property ("text-type" , ly_symbol2scm ("dynamic")); + SCM dyn = ly_symbol2scm ("dynamic"); + d->set_mus_property ("text-type" , dyn); d->set_mus_property ("text", $2); d->set_spot (THIS->here_input ()); $$ = d; } | SPANREQUEST bare_int STRING { - Span_req * sp_p = new Span_req; - sp_p->set_span_dir ( Direction ($2)); - sp_p->set_mus_property ("span-type", $3); - sp_p->set_spot (THIS->here_input ()); - $$ = sp_p; + Span_req * sp = new Span_req; + sp->set_span_dir ( Direction ($2)); + sp->set_mus_property ("span-type", $3); + sp->set_spot (THIS->here_input ()); + $$ = sp; } | tremolo_type { Tremolo_req* a = new Tremolo_req; @@ -1407,13 +1469,13 @@ steno_pitch: } | NOTENAME_PITCH sup_quotes { Pitch p = *unsmob_pitch ($1); - p.octave_i_ += $2; + p.octave_ += $2; $$ = p.smobbed_copy (); } | NOTENAME_PITCH sub_quotes { Pitch p =* unsmob_pitch ($1); - p.octave_i_ += -$2; + p.octave_ += -$2; $$ = p.smobbed_copy (); } @@ -1429,13 +1491,13 @@ steno_tonic_pitch: } | TONICNAME_PITCH sup_quotes { Pitch p = *unsmob_pitch ($1); - p.octave_i_ += $2; + p.octave_ += $2; $$ = p.smobbed_copy (); } | TONICNAME_PITCH sub_quotes { Pitch p =* unsmob_pitch ($1); - p.octave_i_ += -$2; + p.octave_ += -$2; $$ = p.smobbed_copy (); } @@ -1460,7 +1522,7 @@ explicit_pitch: } ; -explicit_duration: +verbose_duration: DURATION embedded_scm { $$ = $2; if (!unsmob_duration ($2)) @@ -1473,7 +1535,7 @@ explicit_duration: extender_req: EXTENDER { - if (!THIS->lexer_p_->lyric_state_b ()) + if (!THIS->lexer_->lyric_state_b ()) THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); $$ = new Extender_req; } @@ -1481,7 +1543,7 @@ extender_req: hyphen_req: HYPHEN { - if (!THIS->lexer_p_->lyric_state_b ()) + if (!THIS->lexer_->lyric_state_b ()) THIS->parser_error (_ ("Have to be in Lyric mode for lyrics")); $$ = new Hyphen_req; } @@ -1492,27 +1554,32 @@ close_request: $$ = $1; dynamic_cast ($$)->set_span_dir ( START); } - + ; + close_request_parens: '(' { Span_req* s= new Span_req; $$ = s; s->set_mus_property ("span-type", ly_str02scm ( "slur")); + s->set_spot (THIS->here_input()); } | E_OPEN { Span_req* s= new Span_req; $$ = s; s->set_mus_property ("span-type", ly_str02scm ( "phrasing-slur")); + s->set_spot (THIS->here_input()); } | E_SMALLER { Span_req*s =new Span_req; $$ = s; s->set_mus_property ("span-type", ly_str02scm ( "crescendo")); + s->set_spot (THIS->here_input()); } | E_BIGGER { Span_req*s =new Span_req; $$ = s; s->set_mus_property ("span-type", ly_str02scm ("decrescendo")); + s->set_spot (THIS->here_input()); } ; @@ -1528,6 +1595,7 @@ open_request_parens: E_EXCLAMATION { Span_req *s = new Span_req; s->set_mus_property ("span-type", ly_str02scm ( "crescendo")); + s->set_spot (THIS->here_input()); $$ = s; } @@ -1535,11 +1603,14 @@ open_request_parens: Span_req* s= new Span_req; $$ = s; s->set_mus_property ("span-type", ly_str02scm ( "slur")); + s->set_spot (THIS->here_input()); + } | E_CLOSE { Span_req* s= new Span_req; $$ = s; s->set_mus_property ("span-type", ly_str02scm ( "phrasing-slur")); + s->set_spot (THIS->here_input()); } ; @@ -1557,11 +1628,11 @@ gen_text_def: $$ = t; } | DIGIT { - String ds = to_str ($1); + String ds = to_string ($1); Text_script_req* t = new Text_script_req; - - t->set_mus_property ("text", ly_str02scm (ds.ch_C ())); - t->set_mus_property ("text-type" , ly_symbol2scm ("finger")); + SCM finger = ly_symbol2scm ("finger"); + t->set_mus_property ("text", ly_str02scm (ds.to_str0 ())); + t->set_mus_property ("text-type" , finger); t->set_spot (THIS->here_input ()); $$ = t; } @@ -1588,7 +1659,6 @@ script_abbreviation: } ; - script_dir: '_' { $$ = DOWN; } | '^' { $$ = UP; } @@ -1614,20 +1684,27 @@ duration_length: multiplied_duration { $$ = $1; } - | explicit_duration { + | verbose_duration { $$ = $1; } ; optional_notemode_duration: { - $$ = THIS->default_duration_.smobbed_copy (); + Duration dd = THIS->default_duration_; + $$ = dd.smobbed_copy (); + + THIS->beam_check ($$); } | multiplied_duration { $$ = $1; + THIS->default_duration_ = *unsmob_duration ($$); + + THIS->beam_check ($$); } - | explicit_duration { + | verbose_duration { $$ = $1; + THIS->default_duration_ = *unsmob_duration ($$); } ; @@ -1640,15 +1717,11 @@ steno_duration: l = intlog2 ($1); $$ = Duration (l, $2).smobbed_copy (); - - THIS->set_last_duration (unsmob_duration ($$)); } | DURATION_IDENTIFIER dots { Duration *d =unsmob_duration ($1); Duration k (d->duration_log (),d->dot_count () + $2); $$ = k.smobbed_copy (); - - THIS->set_last_duration (unsmob_duration ($$)); } ; @@ -1663,7 +1736,7 @@ multiplied_duration: $$ = unsmob_duration ($$)->compressed ( $3) .smobbed_copy (); } | multiplied_duration '*' FRACTION { - Rational m (gh_scm2int (gh_car ($3)), gh_scm2int (gh_cdr ($3))); + Rational m (gh_scm2int (ly_car ($3)), gh_scm2int (ly_cdr ($3))); $$ = unsmob_duration ($$)->compressed (m).smobbed_copy (); } @@ -1710,31 +1783,51 @@ bass_mod: ; bass_figure: - bass_number { - Pitch p ; - p .notename_i_ = $1 - 1; - p.normalise(); - - Note_req * nr = new Note_req; - $$ = nr->self_scm (); - nr->set_mus_property ("pitch", p.smobbed_copy ()); - scm_unprotect_object ($$); + FIGURE_SPACE { + Bass_figure_req *bfr = new Bass_figure_req; + $$ = bfr->self_scm(); + scm_gc_unprotect_object ($$); + } + | bass_number { + Bass_figure_req *bfr = new Bass_figure_req; + $$ = bfr->self_scm(); + + bfr->set_mus_property ("figure", gh_int2scm ($1)); + + scm_gc_unprotect_object ($$); } | bass_figure bass_mod { - if ($2) { - SCM sp = unsmob_music ($1)->get_mus_property ("pitch"); - unsmob_pitch (sp)->alteration_i_ += $2; + Music *m = unsmob_music ($1); + if ($2) { + SCM salter =m->get_mus_property ("alteration"); + int alter = gh_number_p ( salter) ? gh_scm2int (salter) : 0; + m->set_mus_property ("alteration", + gh_int2scm (alter + $2)); } else { - unsmob_music ($1)->set_mus_property ("force-accidental", SCM_BOOL_T); + m->set_mus_property ("alteration", gh_int2scm (0)); } } ; +br_bass_figure: + '[' bass_figure { + $$ = $2; + unsmob_music ($$)->set_mus_property ("bracket-start", SCM_BOOL_T); + } + | bass_figure { + $$ = $1; + } + | br_bass_figure ']' { + $$ = $1; + unsmob_music ($1)->set_mus_property ("bracket-stop", SCM_BOOL_T); + } + ; + figure_list: /**/ { $$ = SCM_EOL; } - | figure_list bass_figure { + | figure_list br_bass_figure { $$ = gh_cons ($2, $1); } ; @@ -1748,26 +1841,38 @@ figure_spec: } ; + +optional_rest: + /**/ { $$ = 0; } + | REST { $$ = 1; } + ; + simple_element: - pitch exclamations questions optional_notemode_duration { + pitch exclamations questions optional_notemode_duration optional_rest { Input i = THIS->pop_spot (); - if (!THIS->lexer_p_->note_state_b ()) + if (!THIS->lexer_->note_state_b ()) THIS->parser_error (_ ("Have to be in Note mode for notes")); - Note_req *n = new Note_req; + Music *n = 0; + if ($5) + n = new Rest_req ; + else + n = new Note_req; n->set_mus_property ("pitch", $1); n->set_mus_property ("duration", $4); + if ($3 % 2) n->set_mus_property ("cautionary", SCM_BOOL_T); if ($2 % 2 || $3 % 2) n->set_mus_property ("force-accidental", SCM_BOOL_T); Simultaneous_music*v = new Request_chord (SCM_EOL); - v->set_mus_property ("elements", gh_list (n->self_scm (), SCM_UNDEFINED)); - + v->set_mus_property ("elements", scm_list_n (n->self_scm (), SCM_UNDEFINED)); + scm_gc_unprotect_object (n->self_scm()); + v->set_spot (i); n->set_spot (i); $$ = v; @@ -1776,9 +1881,9 @@ simple_element: Music * m = unsmob_music ($1); Input i = THIS->pop_spot (); m->set_spot (i); - for (SCM s = m->get_mus_property ("elements"); gh_pair_p (s); s = gh_cdr (s)) + for (SCM s = m->get_mus_property ("elements"); gh_pair_p (s); s = ly_cdr (s)) { - unsmob_music (gh_car (s))->set_mus_property ("duration", $2); + unsmob_music (ly_car (s))->set_mus_property ("duration", $2); } $$ = m; } @@ -1788,22 +1893,22 @@ simple_element: SCM e = SCM_UNDEFINED; if (ly_scm2string ($1) =="s") { /* Space */ - Skip_req * skip_p = new Skip_req; - skip_p->set_mus_property ("duration" ,$2); - skip_p->set_spot (i); - e = skip_p->self_scm (); + Skip_req * skip = new Skip_req; + skip->set_mus_property ("duration" ,$2); + skip->set_spot (i); + e = skip->self_scm (); } else { - Rest_req * rest_req_p = new Rest_req; - rest_req_p->set_mus_property ("duration", $2); - rest_req_p->set_spot (i); - e = rest_req_p->self_scm (); + Rest_req * rest_req = new Rest_req; + rest_req->set_mus_property ("duration", $2); + rest_req->set_spot (i); + e = rest_req->self_scm (); } - Simultaneous_music* velt_p = new Request_chord (SCM_EOL); - velt_p-> set_mus_property ("elements", gh_list (e,SCM_UNDEFINED)); - velt_p->set_spot (i); + Simultaneous_music* velt = new Request_chord (SCM_EOL); + velt-> set_mus_property ("elements", scm_list_n (e,SCM_UNDEFINED)); + velt->set_spot (i); - $$ = velt_p; + $$ = velt; } | MULTI_MEASURE_REST optional_notemode_duration { Input i = THIS->pop_spot (); @@ -1819,13 +1924,13 @@ simple_element: sp2->set_mus_property ("span-type", r); Request_chord * rqc1 = new Request_chord (SCM_EOL); - rqc1->set_mus_property ("elements", gh_list (sp1->self_scm (), SCM_UNDEFINED)); + rqc1->set_mus_property ("elements", scm_list_n (sp1->self_scm (), SCM_UNDEFINED)); Request_chord * rqc2 = new Request_chord (SCM_EOL); - rqc2->set_mus_property ("elements", gh_list (sk->self_scm (), SCM_UNDEFINED));; + rqc2->set_mus_property ("elements", scm_list_n (sk->self_scm (), SCM_UNDEFINED));; Request_chord * rqc3 = new Request_chord (SCM_EOL); - rqc3->set_mus_property ("elements", gh_list (sp2->self_scm (), SCM_UNDEFINED));; + rqc3->set_mus_property ("elements", scm_list_n (sp2->self_scm (), SCM_UNDEFINED));; - SCM ms = gh_list (rqc1->self_scm (), rqc2->self_scm (), rqc3->self_scm (), SCM_UNDEFINED); + SCM ms = scm_list_n (rqc1->self_scm (), rqc2->self_scm (), rqc3->self_scm (), SCM_UNDEFINED); $$ = new Sequential_music (SCM_EOL); $$->set_mus_property ("elements", ms); @@ -1833,19 +1938,19 @@ simple_element: | STRING optional_notemode_duration { Input i = THIS->pop_spot (); - Lyric_req* lreq_p = new Lyric_req; - lreq_p->set_mus_property ("text", $1); - lreq_p->set_mus_property ("duration",$2); - lreq_p->set_spot (i); - Simultaneous_music* velt_p = new Request_chord (SCM_EOL); - velt_p->set_mus_property ("elements", gh_list (lreq_p->self_scm (), SCM_UNDEFINED)); + Lyric_req* lreq = new Lyric_req; + lreq->set_mus_property ("text", $1); + lreq->set_mus_property ("duration",$2); + lreq->set_spot (i); + Simultaneous_music* velt = new Request_chord (SCM_EOL); + velt->set_mus_property ("elements", scm_list_n (lreq->self_scm (), SCM_UNDEFINED)); - $$= velt_p; + $$= velt; } | chord { Input i = THIS->pop_spot (); - if (!THIS->lexer_p_->chord_state_b ()) + if (!THIS->lexer_->chord_state_b ()) THIS->parser_error (_ ("Have to be in Chord mode for chords")); $$ = $1; } @@ -1912,7 +2017,7 @@ chord_step: $$ = gh_cons (unsmob_pitch ($1)->smobbed_copy (), SCM_EOL); } | CHORDMODIFIER_PITCH chord_note { /* Ugh. */ - $$ = gh_list (unsmob_pitch ($1)->smobbed_copy (), + $$ = scm_list_n (unsmob_pitch ($1)->smobbed_copy (), $2, SCM_UNDEFINED); } ; @@ -1920,26 +2025,26 @@ chord_step: chord_note: bare_unsigned { Pitch m; - m.notename_i_ = ($1 - 1) % 7; - m.octave_i_ = $1 > 7 ? 1 : 0; - m.alteration_i_ = 0; + m.notename_ = ($1 - 1) % 7; + m.octave_ = $1 > 7 ? 1 : 0; + m.alteration_ = 0; $$ = m.smobbed_copy (); } | bare_unsigned '+' { Pitch m; - m.notename_i_ = ($1 - 1) % 7; - m.octave_i_ = $1 > 7 ? 1 : 0; - m.alteration_i_ = 1; + m.notename_ = ($1 - 1) % 7; + m.octave_ = $1 > 7 ? 1 : 0; + m.alteration_ = 1; $$ = m.smobbed_copy (); } | bare_unsigned CHORD_MINUS { Pitch m; - m.notename_i_ = ($1 - 1) % 7; - m.octave_i_ = $1 > 7 ? 1 : 0; - m.alteration_i_ = -1; + m.notename_ = ($1 - 1) % 7; + m.octave_ = $1 > 7 ? 1 : 0; + m.alteration_ = -1; $$ = m.smobbed_copy (); } @@ -2063,9 +2168,9 @@ questions: %% void -My_lily_parser::set_yydebug (bool b) +My_lily_parser::set_yydebug (bool ) { -#ifdef YYDEBUG +#if 0 yydebug = b; #endif } @@ -2081,3 +2186,24 @@ My_lily_parser::do_yyparse () } +/* +Should make this optional? It will also complain when you do + + [s4] + +which is entirely legitimate. + +Or we can scrap it. Barchecks should detect wrong durations, and +skipTypesetting speeds it up a lot. +*/ +void +My_lily_parser::beam_check (SCM dur) +{ + Duration *d = unsmob_duration (dur); + if (unsmob_music (last_beam_start_) && d->duration_log () <= 2) + { + Music * m = unsmob_music (last_beam_start_); + m->origin ()->warning (_("Suspect duration found following this beam")); + } + last_beam_start_ = SCM_EOL; +}