1 %{ // -*-Fundamental-*-
4 parser.yy -- Bison/C++ parser for lilypond
6 source file of the GNU LilyPond music typesetter
8 (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 Jan Nieuwenhuizen <janneke@gnu.org>
13 Two shift/reduce problems:
17 "bar" -> String -> Lyric -> Music -> music-assignment
19 "bar" -> String -> string-assignment
23 \repeat .. \alternative
26 \repeat { \repeat .. \alternative }
30 \repeat { \repeat } \alternative
42 * The rules for who is protecting what are very shady. Uniformise
45 * There are too many lexical modes?
52 #include "translator-def.hh"
53 #include "lily-guile.hh"
55 #include "my-lily-lexer.hh"
56 #include "paper-def.hh"
57 #include "midi-def.hh"
59 #include "file-path.hh"
61 #include "dimensions.hh"
62 #include "my-lily-parser.hh"
64 #include "input-file-results.hh"
66 #include "lilypond-input-version.hh"
67 #include "scm-hash.hh"
68 #include "auto-change-iterator.hh"
69 #include "ly-modules.hh"
70 #include "music-sequence.hh"
71 #include "input-smob.hh"
73 #include "text-item.hh"
77 #define MY_MAKE_MUSIC(x) make_music_by_name (ly_symbol2scm (x))
81 #define YYERROR_VERBOSE 1
83 My_lily_parser* my_lily_parser;
84 #define YYPARSE_PARAM my_lily_parser
85 #define YYLEX_PARAM my_lily_parser
87 ((My_lily_parser *) my_lily_parser)
89 #define yyerror THIS->parser_error
96 regular_identifier_b (SCM id)
98 String str = ly_scm2string (id);
99 char const *s = str.to_str0 () ;
104 v = v && isalpha (*s);
111 make_simple_markup (SCM a)
115 simple = scm_c_eval_string ("simple-markup");
117 return scm_list_n (simple, a, SCM_UNDEFINED);
122 is_duration_b (int t)
124 return t && t == 1 << intlog2 (t);
128 set_music_properties (Music *p, SCM a)
130 for (SCM k = a; gh_pair_p (k); k = ly_cdr (k))
132 p->internal_set_mus_property (ly_caar (k), ly_cdar (k));
138 make_chord_step (int step, int alter)
143 /* ugh: fucks up above 13 */
144 Pitch m(step > 7 ? 1 : 0,(step - 1) % 7, alter);
145 return m.smobbed_copy ();
150 make_chord (SCM pitch, SCM dur, SCM modification_list)
152 static SCM chord_ctor;
154 chord_ctor= scm_c_eval_string ("construct-chord");
155 SCM ch= scm_call_3 (chord_ctor, pitch, dur, modification_list);
156 scm_gc_protect_object (ch);
163 set_property_music (SCM sym, SCM value)
165 Music * p = MY_MAKE_MUSIC("PropertySet");
166 p->set_mus_property ("symbol", sym);
167 p->set_mus_property ("value", value);
173 /* We use SCMs to do strings, because it saves us the trouble of
174 deleting them. Let's hope that a stack overflow doesnt trigger a move
175 of the parse stack onto the heap. */
182 Music_output_def * outputdef;
189 yylex (YYSTYPE *s, void * v)
191 My_lily_parser *pars = (My_lily_parser*) v;
192 My_lily_lexer * lex = pars->lexer_;
194 lex->lexval = (void*) s;
195 lex->prepare_for_next_token();
196 return lex->yylex ();
204 /* tokens which are not keywords */
213 %token CHORDMODIFIERS
219 %token GROBDESCRIPTIONS
224 %token FIGURES FIGURE_OPEN FIGURE_CLOSE
225 %token FIGURE_BRACKET_CLOSE FIGURE_BRACKET_OPEN
233 %token MULTI_MEASURE_REST
244 %token OVERRIDE SET REVERT
254 %token COMMANDSPANREQUEST
256 %token OUTPUTPROPERTY
271 %token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE
272 %token E_LEFTSQUARE E_RIGHTSQUARE E_TILDE
274 %token <i> E_UNSIGNED
275 %token CHORD_BASS CHORD_COLON CHORD_MINUS CHORD_CARET CHORD_SLASH
278 %type <i> exclamations questions dots optional_rest
279 %type <i> bass_number bass_mod
280 %type <scm> br_bass_figure bass_figure figure_list figure_spec
282 %token <scm> NOTENAME_PITCH
283 %token <scm> TONICNAME_PITCH
284 %token <scm> CHORDMODIFIER_PITCH
285 %token <scm> DURATION_IDENTIFIER
286 %token <scm> FRACTION
287 %token <id> IDENTIFIER
288 %token <scm> CHORDNAMES CHORDNAMES_IDENTIFIER
290 %token <scm> CHORD_MODIFIER
292 %token <scm> SCORE_IDENTIFIER
293 %token <scm> MUSIC_OUTPUT_DEF_IDENTIFIER
294 %token <scm> NUMBER_IDENTIFIER
295 %token <scm> EVENT_IDENTIFIER
296 %token <scm> MUSIC_IDENTIFIER TRANSLATOR_IDENTIFIER
297 %token <scm> STRING_IDENTIFIER SCM_IDENTIFIER
298 %token <scm> RESTNAME
305 %token <scm> MARKUP_HEAD_MARKUP0
306 %token <scm> MARKUP_HEAD_MARKUP0_MARKUP1
307 %token <scm> MARKUP_HEAD_SCM0
308 %token <scm> MARKUP_HEAD_SCM0_MARKUP1
309 %token <scm> MARKUP_HEAD_SCM0_SCM1
310 %token <scm> MARKUP_HEAD_SCM0_SCM1_MARKUP2
312 %token <scm> MARKUP_IDENTIFIER MARKUP_HEAD_LIST0
313 %type <scm> markup markup_line markup_list markup_list_body full_markup
315 %type <outputdef> output_def
316 %type <scm> lilypond_header lilypond_header_body
317 %type <music> open_event_parens close_event_parens open_event close_event
318 %type <music> event_with_dir event_that_take_dir verbose_event
319 %type <i> sub_quotes sup_quotes
320 %type <music> simple_element event_chord command_element Simple_music Composite_music
321 %type <music> Repeated_music
322 %type <scm> Alternative_music
323 %type <i> tremolo_type
324 %type <i> bare_int bare_unsigned
326 %type <scm> identifier_init
328 %type <music> note_chord_element chord_body chord_body_element
329 %type <scm> chord_body_elements
330 %type <scm> steno_duration optional_notemode_duration multiplied_duration
331 %type <scm> verbose_duration
333 %type <scm> pre_events post_events
334 %type <music> gen_text_def
335 %type <scm> steno_pitch pitch absolute_pitch pitch_also_in_chords
336 %type <scm> explicit_pitch steno_tonic_pitch
338 /* %type <scm> chord_additions chord_subtractions chord_notes chord_step */
339 /* %type <music> chord */
340 /* %type <scm> chord_note chord_inversion chord_bass */
341 %type <scm> duration_length fraction
343 %type <scm> new_chord step_number chord_items chord_item chord_separator step_numbers
345 %type <scm> embedded_scm scalar
346 %type <music> Music Sequential_music Simultaneous_music
347 %type <music> relative_music re_rhythmed_music part_combined_music
348 %type <music> property_def translator_change simple_property_def
349 %type <scm> Music_list
350 %type <outputdef> music_output_def_body
351 %type <music> shorthand_command_req
352 %type <music> post_event
353 %type <music> command_req verbose_command_req
354 %type <music> extender_req
355 %type <music> hyphen_req
356 %type <music> string_event
357 %type <scm> string bare_number number_expression number_term number_factor
358 %type <score> score_block score_body
360 %type <scm> translator_spec_block translator_spec_body
361 %type <music> tempo_event
362 %type <scm> notenames_body notenames_block chordmodifiers_block
363 %type <scm> script_abbreviation
369 /* We don't assign precedence to / and *, because we might need varied
370 prec levels in different prods */
376 lilypond: /* empty */
377 | lilypond toplevel_expression {}
378 | lilypond assignment { }
380 THIS->error_level_ = 1;
383 THIS->error_level_ = 1;
389 THIS->lexer_->pitchname_tab_ = $1;
391 | chordmodifiers_block {
392 THIS->lexer_->chordmodifier_tab_ = $1;
395 THIS->input_file_->header_ = $1;
398 THIS->input_file_->scores_.push ($1);
401 if (dynamic_cast<Paper_def*> ($1))
402 THIS->lexer_->set_identifier (scm_makfrom0str ("$defaultpaper"), $1->self_scm ());
403 else if (dynamic_cast<Midi_def*> ($1))
404 THIS->lexer_->set_identifier (scm_makfrom0str ("$defaultmidi"), $1->self_scm ());
414 chordmodifiers_block:
415 CHORDMODIFIERS notenames_body { $$ = $2; }
419 PITCHNAMES notenames_body { $$ = $2; }
424 int i = scm_ilength ($1);
426 SCM tab = scm_make_vector (gh_int2scm (i), SCM_EOL);
427 for (SCM s = $1; gh_pair_p (s); s = ly_cdr (s)) {
428 SCM pt = ly_cdar (s);
429 scm_hashq_set_x (tab, ly_caar (s), pt);
435 lilypond_header_body:
437 $$ = ly_make_anonymous_module ();
438 THIS->lexer_->add_scope ($$);
440 | lilypond_header_body assignment {
446 HEADER '{' lilypond_header_body '}' {
447 $$ = THIS->lexer_-> remove_scope();
459 /* cont */ '=' identifier_init {
462 Should find generic way of associating input with objects.
464 Input ip = THIS->pop_spot ();
466 if (! regular_identifier_b ($1))
468 ip.warning (_ ("Identifier should have alphabetic characters only"));
471 THIS->lexer_->set_identifier ($1, $4);
474 TODO: devise standard for protection in parser.
476 The parser stack lives on the C-stack, which means that
477 all objects can be unprotected as soon as they're here.
488 $$ = $1->self_scm ();
489 scm_gc_unprotect_object ($$);
495 $$ = $1->self_scm ();
496 scm_gc_unprotect_object ($$);
498 | translator_spec_block {
502 $$ = $1->self_scm ();
503 scm_gc_unprotect_object ($$);
506 $$ = $1->self_scm ();
507 scm_gc_unprotect_object ($$);
512 | number_expression {
523 translator_spec_block:
524 TRANSLATOR '{' translator_spec_body '}'
530 translator_spec_body:
531 TRANSLATOR_IDENTIFIER {
533 unsmob_translator_def ($$)-> set_spot (THIS->here_input ());
536 $$ = Translator_def::make_scm ();
537 Translator_def*td = unsmob_translator_def ($$);
538 td->translator_group_type_ = $2;
539 td->set_spot (THIS->here_input ());
541 | translator_spec_body STRING '=' embedded_scm {
542 unsmob_translator_def ($$)->add_property_assign ($2, $4);
544 | translator_spec_body STRING OVERRIDE embedded_scm '=' embedded_scm {
545 unsmob_translator_def ($$)
546 ->add_push_property (scm_string_to_symbol ($2), $4, $6);
548 | translator_spec_body STRING SET embedded_scm '=' embedded_scm {
549 unsmob_translator_def ($$)
550 ->add_push_property (scm_string_to_symbol ($2), $4, $6);
552 | translator_spec_body STRING REVERT embedded_scm {
553 unsmob_translator_def ($$)->add_pop_property (
554 scm_string_to_symbol ($2), $4);
556 | translator_spec_body NAME STRING {
557 unsmob_translator_def ($$)->type_name_ = $3;
559 | translator_spec_body CONSISTS STRING {
560 unsmob_translator_def ($$)->add_element ($3);
562 | translator_spec_body ALIAS STRING {
563 Translator_def*td = unsmob_translator_def ($$);
564 td->type_aliases_ = scm_cons ($3, td->type_aliases_);
566 | translator_spec_body GROBDESCRIPTIONS embedded_scm {
567 Translator_def*td = unsmob_translator_def($$);
568 // td->add_property_assign (ly_symbol2scm ("allGrobDescriptions"), $3);
569 for (SCM p = $3; gh_pair_p (p); p = ly_cdr (p))
570 td->add_property_assign (scm_symbol_to_string (ly_caar (p)), ly_cdar (p));
572 | translator_spec_body CONSISTSEND STRING {
573 unsmob_translator_def ($$)->add_last_element ( $3);
575 | translator_spec_body ACCEPTS STRING {
576 unsmob_translator_def ($$)->set_acceptor ($3,true);
578 | translator_spec_body DENIES STRING {
579 unsmob_translator_def ($$)->set_acceptor ($3,false);
581 | translator_spec_body REMOVE STRING {
582 unsmob_translator_def ($$)->remove_element ($3);
593 /*cont*/ '{' score_body '}' {
596 if (!$$->defs_.size ())
598 Music_output_def *id =
599 unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper"));
600 $$->add_output (id ? id->clone () : new Paper_def );
609 $$->set_spot (THIS->here_input ());
610 SCM m = $1->self_scm ();
611 scm_gc_unprotect_object (m);
616 SCM check_funcs = scm_c_eval_string ("toplevel-music-functions");
617 for (; gh_pair_p (check_funcs); check_funcs = gh_cdr (check_funcs))
618 m = gh_call1 (gh_car (check_funcs), m);
623 $$ = unsmob_score ($1);
624 $$->set_spot (THIS->here_input ());
626 | score_body lilypond_header {
629 | score_body output_def {
642 music_output_def_body '}' {
644 THIS-> lexer_-> remove_scope ();
648 music_output_def_body:
650 Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultmidi"));
655 p = dynamic_cast<Midi_def*> (id->clone ());
660 THIS->lexer_->add_scope (p->scope_);
663 Music_output_def *id = unsmob_music_output_def (THIS->lexer_->lookup_identifier ("$defaultpaper"));
666 p = dynamic_cast<Paper_def*> (id->clone ());
670 THIS->lexer_->add_scope (p->scope_);
673 | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
674 Music_output_def * o = unsmob_music_output_def ($3);
677 THIS->lexer_->add_scope (o->scope_);
679 | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
680 Music_output_def * o = unsmob_music_output_def ($3);
683 THIS->lexer_->add_scope (o->scope_);
685 | music_output_def_body assignment {
688 | music_output_def_body translator_spec_block {
689 $$->assign_translator ($2);
691 | music_output_def_body tempo_event {
693 junk this ? there already is tempo stuff in
696 int m = gh_scm2int ( $2->get_mus_property ("metronome-count"));
697 Duration *d = unsmob_duration ($2->get_mus_property ("tempo-unit"));
698 Midi_def * md = dynamic_cast<Midi_def*> ($$);
700 md->set_tempo (d->get_length (), m);
702 | music_output_def_body error {
708 TEMPO steno_duration '=' bare_unsigned {
709 $$ = MY_MAKE_MUSIC("TempoEvent");
710 $$->set_mus_property ("tempo-unit", $2);
711 $$->set_mus_property ("metronome-count", gh_int2scm ( $4));
716 The representation of a list is the
720 to have efficient append.
724 $$ = scm_cons (SCM_EOL, SCM_EOL);
728 SCM c = scm_cons ($2->self_scm (), SCM_EOL);
729 scm_gc_unprotect_object ($2->self_scm ()); /* UGH */
730 if (gh_pair_p (ly_cdr (s)))
731 gh_set_cdr_x (ly_cdr (s), c); /* append */
733 gh_set_car_x (s, c); /* set first cons */
734 gh_set_cdr_x (s, c) ; /* remember last cell */
750 | ALTERNATIVE '{' Music_list '}' {
756 REPEAT string bare_unsigned Music Alternative_music
760 SCM alts = gh_pair_p ($5) ? gh_car ($5) : SCM_EOL;
761 if (times < scm_ilength (alts)) {
762 unsmob_music (gh_car (alts))
763 ->origin ()->warning (
764 _("More alternatives than repeats. Junking excess alternatives."));
765 alts = ly_truncate_list (times, alts);
771 proc = scm_c_eval_string ("make-repeated-music");
773 SCM mus = scm_call_1 (proc, $2);
774 scm_gc_protect_object (mus); // UGH.
775 Music *r =unsmob_music (mus);
778 r-> set_mus_property ("element", beg->self_scm ());
779 scm_gc_unprotect_object (beg->self_scm ());
781 r->set_mus_property ("repeat-count", gh_int2scm (times >? 1));
783 r-> set_mus_property ("elements",alts);
784 if (gh_equal_p ($2, scm_makfrom0str ("tremolo")))
787 we can not get durations and other stuff correct down the line, so we have to
788 add to the duration log here.
790 SCM func = scm_primitive_eval (ly_symbol2scm ("shift-duration-log"));
792 gh_call3 (func, r->self_scm (), gh_int2scm(-intlog2 ($3*2/3)),gh_int2scm(1));
794 gh_call3 (func, r->self_scm (), gh_int2scm(-intlog2 ($3)), gh_int2scm(0));
796 r->set_spot (*$4->origin ());
803 SEQUENTIAL '{' Music_list '}' {
804 $$ = MY_MAKE_MUSIC("SequentialMusic");
805 $$->set_mus_property ("elements", ly_car ($3));
806 $$->set_spot(THIS->here_input());
808 | '{' Music_list '}' {
809 $$ = MY_MAKE_MUSIC("SequentialMusic");
810 $$->set_mus_property ("elements", ly_car ($2));
811 $$->set_spot(THIS->here_input());
816 SIMULTANEOUS '{' Music_list '}'{
817 $$ = MY_MAKE_MUSIC("SimultaneousMusic");
818 $$->set_mus_property ("elements", ly_car ($3));
819 $$->set_spot(THIS->here_input());
822 | '<' Music_list '>' {
823 $$ = MY_MAKE_MUSIC("SimultaneousMusic");
824 $$->set_mus_property ("elements", ly_car ($2));
825 $$->set_spot(THIS->here_input());
830 event_chord { $$ = $1; }
831 | APPLYCONTEXT embedded_scm {
832 if (!gh_procedure_p ($2))
833 THIS->parser_error (_ ("\applycontext takes function argument"));
834 $$ = MY_MAKE_MUSIC ("ApplyContext");
835 $$->set_mus_property ("procedure", $2);
836 $$->set_spot (THIS->here_input());
838 | OUTPUTPROPERTY embedded_scm embedded_scm '=' embedded_scm {
840 if (!gh_symbol_p ($3))
842 THIS->parser_error (_ ("Second argument must be a symbol"));
844 /* Should check # args */
845 if (!gh_procedure_p (pred))
847 THIS->parser_error (_ ("First argument must be a procedure taking one argument"));
850 Music*m = MY_MAKE_MUSIC("OutputPropertySetMusic");
851 m->set_mus_property ("predicate", pred);
852 m->set_mus_property ("grob-property", $3);
853 m->set_mus_property ("grob-value", $5);
858 $$ = unsmob_music ($1);
866 CONTEXT STRING Music {
867 Music*csm =MY_MAKE_MUSIC("ContextSpeccedMusic");
869 csm->set_mus_property ("element", $3->self_scm ());
870 scm_gc_unprotect_object ($3->self_scm ());
872 csm->set_mus_property ("context-type",$2);
873 csm->set_mus_property ("context-id", scm_makfrom0str (""));
877 | AUTOCHANGE STRING Music {
878 Music*chm = MY_MAKE_MUSIC("AutoChangeMusic");
879 chm->set_mus_property ("element", $3->self_scm ());
880 chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_proc);
882 scm_gc_unprotect_object ($3->self_scm ());
883 chm->set_mus_property ("what", $2);
886 chm->set_spot (*$3->origin ());
891 The other version is for easier debugging of
892 Sequential_music_iterator in combination with grace notes.
895 SCM start = THIS->lexer_->lookup_identifier ("startGraceMusic");
896 SCM stop = THIS->lexer_->lookup_identifier ("stopGraceMusic");
897 Music *startm = unsmob_music (start);
898 Music *stopm = unsmob_music (stop);
902 stopm = stopm->clone ();
903 ms = scm_cons (stopm->self_scm (), ms);
904 scm_gc_unprotect_object (stopm->self_scm ());
906 ms = scm_cons ($2->self_scm (), ms);
907 scm_gc_unprotect_object ($2->self_scm());
909 startm = startm->clone ();
910 ms = scm_cons (startm->self_scm () , ms);
911 scm_gc_unprotect_object (startm->self_scm ());
915 Music* seq = MY_MAKE_MUSIC("SequentialMusic");
916 seq->set_mus_property ("elements", ms);
919 $$ = MY_MAKE_MUSIC("GraceMusic");
920 $$->set_mus_property ("element", seq->self_scm ());
921 scm_gc_unprotect_object (seq->self_scm ());
923 $$ = MY_MAKE_MUSIC("GraceMusic");
924 $$->set_mus_property ("element", $2->self_scm ());
925 scm_gc_unprotect_object ($2->self_scm ());
928 | CONTEXT string '=' string Music {
929 Music * csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
931 csm->set_mus_property ("element", $5->self_scm ());
932 scm_gc_unprotect_object ($5->self_scm ());
934 csm->set_mus_property ("context-type", $2);
935 csm->set_mus_property ("context-id", $4);
946 int n = gh_scm2int (ly_car ($3)); int d = gh_scm2int (ly_cdr ($3));
948 $$= MY_MAKE_MUSIC("TimeScaledMusic");
949 $$->set_spot (THIS->pop_spot ());
952 $$->set_mus_property ("element", mp->self_scm ());
953 scm_gc_unprotect_object (mp->self_scm ());
954 $$->set_mus_property ("numerator", gh_int2scm (n));
955 $$->set_mus_property ("denominator", gh_int2scm (d));
956 $$->compress (Moment (Rational (n,d)));
959 | Repeated_music { $$ = $1; }
960 | Simultaneous_music { $$ = $1; }
961 | Sequential_music { $$ = $1; }
962 | TRANSPOSE pitch_also_in_chords pitch_also_in_chords Music {
963 $$ = MY_MAKE_MUSIC("TransposedMusic");
965 Pitch from = *unsmob_pitch ($2);
966 Pitch to = *unsmob_pitch ($3);
968 p->transpose (interval (from, to));
969 $$->set_mus_property ("element", p->self_scm ());
970 scm_gc_unprotect_object (p->self_scm ());
972 | APPLY embedded_scm Music {
973 SCM ret = gh_call1 ($2, $3->self_scm ());
974 Music *m = unsmob_music (ret);
976 THIS->parser_error ("\\apply must return a Music");
977 m = MY_MAKE_MUSIC("Music");
982 { THIS->lexer_->push_note_state (); }
985 THIS->lexer_->pop_state ();
988 { THIS->lexer_->push_figuredbass_state (); }
991 Music * chm = MY_MAKE_MUSIC("UntransposableMusic");
992 chm->set_mus_property ("element", $3->self_scm ());
994 scm_gc_unprotect_object ($3->self_scm());
996 THIS->lexer_->pop_state ();
999 { THIS->lexer_->push_chord_state (); }
1002 Music * chm = MY_MAKE_MUSIC("UnrelativableMusic");
1003 chm->set_mus_property ("element", $3->self_scm ());
1004 scm_gc_unprotect_object ($3->self_scm());
1007 THIS->lexer_->pop_state ();
1010 { THIS->lexer_->push_lyric_state (); }
1014 THIS->lexer_->pop_state ();
1016 | relative_music { $$ = $1; }
1017 | re_rhythmed_music { $$ = $1; }
1018 | part_combined_music { $$ = $1; }
1022 RELATIVE absolute_pitch Music {
1024 Pitch pit = *unsmob_pitch ($2);
1025 $$ = MY_MAKE_MUSIC("RelativeOctaveMusic");
1027 $$->set_mus_property ("element", p->self_scm ());
1028 scm_gc_unprotect_object (p->self_scm ());
1030 $$->set_mus_property ("last-pitch", p->to_relative_octave (pit).smobbed_copy ());
1036 ADDLYRICS Music Music {
1037 Music*l =MY_MAKE_MUSIC("LyricCombineMusic");
1038 l->set_mus_property ("elements", gh_list ($2->self_scm (), $3->self_scm (), SCM_UNDEFINED));
1039 scm_gc_unprotect_object ($3->self_scm ());
1040 scm_gc_unprotect_object ($2->self_scm ());
1045 part_combined_music:
1046 PARTCOMBINE STRING Music Music {
1047 Music * p= MY_MAKE_MUSIC("PartCombineMusic");
1048 p->set_mus_property ("what", $2);
1049 p->set_mus_property ("elements", gh_list ($3->self_scm (),$4->self_scm (), SCM_UNDEFINED));
1051 scm_gc_unprotect_object ($3->self_scm ());
1052 scm_gc_unprotect_object ($4->self_scm ());
1059 TRANSLATOR STRING '=' STRING {
1060 Music*t= MY_MAKE_MUSIC("TranslatorChange");
1061 t-> set_mus_property ("change-to-type", $2);
1062 t-> set_mus_property ("change-to-id", $4);
1065 $$->set_spot (THIS->here_input ());
1071 | ONCE simple_property_def {
1073 SCM e = $2->get_mus_property ("element");
1074 unsmob_music (e)->set_mus_property ("once", SCM_BOOL_T);
1078 simple_property_def:
1079 PROPERTY STRING '.' STRING '=' scalar {
1080 Music *t = set_property_music (scm_string_to_symbol ($4), $6);
1081 Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
1083 csm->set_mus_property ("element", t->self_scm ());
1084 scm_gc_unprotect_object (t->self_scm ());
1087 $$->set_spot (THIS->here_input ());
1089 csm-> set_mus_property ("context-type", $2);
1091 | PROPERTY STRING '.' STRING UNSET {
1093 Music *t = MY_MAKE_MUSIC("PropertyUnset");
1094 t->set_mus_property ("symbol", scm_string_to_symbol ($4));
1096 Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
1097 csm->set_mus_property ("element", t->self_scm ());
1098 scm_gc_unprotect_object (t->self_scm ());
1101 $$->set_spot (THIS->here_input ());
1103 csm-> set_mus_property ("context-type", $2);
1105 | PROPERTY STRING '.' STRING SET embedded_scm '=' embedded_scm {
1107 = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings"));
1108 bool itc = internal_type_checking_global_b;
1109 Music *t = MY_MAKE_MUSIC("OverrideProperty");
1110 t->set_mus_property ("symbol", scm_string_to_symbol ($4));
1111 t->set_mus_property ("pop-first", SCM_BOOL_T);
1113 internal_type_checking_global_b = false;
1114 t->set_mus_property ("grob-property", $6);
1116 internal_type_checking_global_b = itc;
1117 t->set_mus_property ("grob-value", $8);
1119 Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
1120 csm->set_mus_property ("element", t->self_scm ());
1121 scm_gc_unprotect_object (t->self_scm ());
1123 $$->set_spot (THIS->here_input ());
1125 csm-> set_mus_property ("context-type", $2);
1127 | PROPERTY STRING '.' STRING OVERRIDE
1128 embedded_scm '=' embedded_scm
1134 = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings"));
1135 bool itc = internal_type_checking_global_b;
1137 Music *t = MY_MAKE_MUSIC("OverrideProperty");
1138 t->set_mus_property ("symbol", scm_string_to_symbol ($4));
1140 internal_type_checking_global_b = false;
1141 t->set_mus_property ("grob-property", $6);
1142 t->set_mus_property ("grob-value", $8);
1144 internal_type_checking_global_b = itc;
1146 Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
1147 csm->set_mus_property ("element", t->self_scm ());
1148 scm_gc_unprotect_object (t->self_scm ());
1151 $$->set_spot (THIS->here_input ());
1153 csm-> set_mus_property ("context-type", $2);
1156 | PROPERTY STRING '.' STRING REVERT embedded_scm {
1157 Music *t = MY_MAKE_MUSIC("RevertProperty");
1159 = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings"));
1160 bool itc = internal_type_checking_global_b;
1162 t->set_mus_property ("symbol", scm_string_to_symbol ($4));
1164 internal_type_checking_global_b = false;
1165 t->set_mus_property ("grob-property", $6);
1167 internal_type_checking_global_b = itc;
1169 Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
1170 csm->set_mus_property ("element", t->self_scm ());
1171 scm_gc_unprotect_object (t->self_scm ());
1174 $$->set_spot (THIS->here_input ());
1176 csm-> set_mus_property ("context-type", $2);
1183 | bare_int { $$ = gh_int2scm ($1); }
1184 | embedded_scm { $$ = $1; }
1185 | full_markup { $$ = $1; }
1186 | DIGIT { $$ = gh_int2scm ($1); }
1193 } /*cont */ simple_element post_events {
1194 SCM elts = $3-> get_mus_property ("elements");
1196 elts = gh_append3 (elts, scm_reverse_x ($1, SCM_EOL),
1197 scm_reverse_x ($4, SCM_EOL));
1199 $3-> set_mus_property ("elements", elts);
1203 | note_chord_element
1208 chord_body optional_notemode_duration post_events
1210 SCM dur = unsmob_duration ($2)->smobbed_copy();
1211 SCM es = $1->get_mus_property ("elements");
1212 SCM postevs = scm_reverse_x ($3, SCM_EOL);
1214 for (SCM s = es; gh_pair_p (s); s = gh_cdr (s))
1215 unsmob_music (gh_car(s))->set_mus_property ("duration", dur);
1216 es = gh_append2 (es, postevs);
1218 $1-> set_mus_property ("elements", es);
1224 CHORD_OPEN chord_body_elements CHORD_CLOSE
1226 $$ = MY_MAKE_MUSIC("EventChord");
1227 $$->set_mus_property ("elements",
1228 scm_reverse_x ($2, SCM_EOL));
1232 chord_body_elements:
1233 /* empty */ { $$ = SCM_EOL; }
1234 | chord_body_elements chord_body_element {
1235 $$ = gh_cons ($2->self_scm(), $1);
1236 scm_gc_unprotect_object ($2->self_scm());
1241 pitch exclamations questions post_events
1243 Music * n = MY_MAKE_MUSIC("NoteEvent");
1244 n->set_mus_property ("pitch", $1);
1246 n->set_mus_property ("cautionary", SCM_BOOL_T);
1247 if ($2 % 2 || $3 % 2)
1248 n->set_mus_property ("force-accidental", SCM_BOOL_T);
1250 SCM arts = scm_reverse_x ($4, SCM_EOL);
1251 n->set_mus_property ("articulations", arts);
1259 $$ = MY_MAKE_MUSIC("EventChord");
1260 $$->set_mus_property ("elements", scm_cons ($1->self_scm (), SCM_EOL));
1261 scm_gc_unprotect_object ($1->self_scm());
1263 $$-> set_spot (THIS->here_input ());
1264 $1-> set_spot (THIS->here_input ());
1267 Music *l = MY_MAKE_MUSIC("LigatureEvent");
1268 l->set_mus_property ("span-direction", gh_int2scm (START));
1269 l->set_spot (THIS->here_input ());
1271 $$ = MY_MAKE_MUSIC("EventChord");
1272 $$->set_mus_property ("elements", scm_cons (l->self_scm (), SCM_EOL));
1273 scm_gc_unprotect_object (l->self_scm());
1274 $$->set_spot (THIS->here_input ());
1277 Music *l = MY_MAKE_MUSIC("LigatureEvent");
1278 l->set_mus_property ("span-direction", gh_int2scm (STOP));
1279 l->set_spot (THIS->here_input ());
1281 $$ = MY_MAKE_MUSIC("EventChord");
1282 $$->set_mus_property ("elements", scm_cons (l->self_scm (), SCM_EOL));
1283 $$->set_spot (THIS->here_input ());
1284 scm_gc_unprotect_object (l->self_scm());
1287 $$ = MY_MAKE_MUSIC("VoiceSeparator");
1288 $$->set_spot (THIS->here_input ());
1292 $$ = MY_MAKE_MUSIC("BarCheck");
1293 $$->set_spot (THIS->here_input ());
1296 Music *t = set_property_music (ly_symbol2scm ("whichBar"), $2);
1298 Music *csm = MY_MAKE_MUSIC("ContextSpeccedMusic");
1299 csm->set_mus_property ("element", t->self_scm ());
1300 scm_gc_unprotect_object (t->self_scm ());
1303 $$->set_spot (THIS->here_input ());
1305 csm->set_mus_property ("context-type", scm_makfrom0str ("Timing"));
1307 | PARTIAL duration_length {
1308 Moment m = - unsmob_duration ($2)->get_length ();
1309 Music * p = set_property_music (ly_symbol2scm ( "measurePosition"),m.smobbed_copy ());
1311 Music * sp = MY_MAKE_MUSIC("ContextSpeccedMusic");
1312 sp->set_mus_property ("element", p->self_scm ());
1313 scm_gc_unprotect_object (p->self_scm ());
1316 sp-> set_mus_property ("context-type", scm_makfrom0str ("Timing"));
1321 proc = scm_c_eval_string ("make-clef-set");
1323 SCM result = scm_call_1 (proc, $2);
1324 scm_gc_protect_object (result);
1325 $$ = unsmob_music (result);
1330 proc = scm_c_eval_string ("make-time-signature-set");
1332 SCM result = scm_apply_2 (proc, gh_car ($2), gh_cdr ($2), SCM_EOL);
1333 scm_gc_protect_object (result);
1334 $$ = unsmob_music (result);
1339 shorthand_command_req { $$ = $1; }
1340 | verbose_command_req { $$ = $1; }
1343 shorthand_command_req:
1351 $$ = MY_MAKE_MUSIC("TieEvent");
1354 Music *b= MY_MAKE_MUSIC("BeamEvent");
1355 b->set_mus_property ("span-direction", gh_int2scm (START));
1358 THIS->last_beam_start_ = b->self_scm ();
1361 Music *b= MY_MAKE_MUSIC("BeamEvent");
1362 b->set_mus_property ("span-direction", gh_int2scm (STOP));
1366 $$ = MY_MAKE_MUSIC("BreathingSignEvent");
1369 $$ = MY_MAKE_MUSIC("PorrectusEvent");
1373 verbose_command_req:
1375 Music * m = MY_MAKE_MUSIC("MarkEvent");
1379 Music *m = MY_MAKE_MUSIC("MarkEvent");
1380 m->set_mus_property ("label", $2);
1383 | SKIP duration_length {
1384 Music * skip = MY_MAKE_MUSIC("SkipEvent");
1385 skip->set_mus_property ("duration", $2);
1393 Music *key= MY_MAKE_MUSIC("KeyChangeEvent");
1396 | KEY NOTENAME_PITCH SCM_IDENTIFIER {
1397 Music *key= MY_MAKE_MUSIC("KeyChangeEvent");
1399 key->set_mus_property ("pitch-alist", $3);
1400 key->set_mus_property ("tonic", Pitch (0,0,0).smobbed_copy());
1401 ((Music*)key)->transpose (* unsmob_pitch ($2));
1411 | post_events post_event {
1412 $2->set_spot (THIS->here_input ());
1413 $$ = gh_cons ($2->self_scm(), $$);
1414 scm_gc_unprotect_object ($2->self_scm());
1427 Music * s = MY_MAKE_MUSIC("StringNumberEvent");
1428 s->set_mus_property ("string-number", gh_int2scm($1));
1429 s->set_spot (THIS->here_input ());
1435 event_that_take_dir:
1441 Music * m = MY_MAKE_MUSIC ("NewBeamEvent");
1442 m->set_spot (THIS->here_input());
1443 m->set_mus_property ("span-direction" , gh_int2scm (START));
1447 Music * m = MY_MAKE_MUSIC ("NewBeamEvent");
1448 m->set_spot (THIS->here_input());
1449 m->set_mus_property ("span-direction" , gh_int2scm (STOP));
1453 Music * m = MY_MAKE_MUSIC ("NewTieEvent");
1454 m->set_spot (THIS->here_input());
1457 | script_abbreviation {
1458 SCM s = THIS->lexer_->lookup_identifier ("dash" + ly_scm2string ($1));
1459 Music *a = MY_MAKE_MUSIC("ArticulationEvent");
1460 if (gh_string_p (s))
1461 a->set_mus_property ("articulation-type", s);
1462 else THIS->parser_error (_ ("Expecting string as script definition"));
1468 script_dir event_that_take_dir {
1469 $2->set_mus_property ("direction", gh_int2scm ($1));
1476 $$ = unsmob_music ($1);
1479 Music * a = MY_MAKE_MUSIC("TremoloEvent");
1480 a->set_spot (THIS->here_input ());
1481 a->set_mus_property ("tremolo-type", gh_int2scm ($1));
1508 | NOTENAME_PITCH sup_quotes {
1509 Pitch p = *unsmob_pitch ($1);
1510 p = p.transposed (Pitch ($2,0,0));
1511 $$ = p.smobbed_copy ();
1513 | NOTENAME_PITCH sub_quotes {
1514 Pitch p =* unsmob_pitch ($1);
1515 p = p.transposed (Pitch (-$2,0,0));
1516 $$ = p.smobbed_copy ();
1528 | TONICNAME_PITCH sup_quotes {
1529 Pitch p = *unsmob_pitch ($1);
1530 p = p.transposed (Pitch ($2,0,0));
1531 $$ = p.smobbed_copy ();
1533 | TONICNAME_PITCH sub_quotes {
1534 Pitch p =* unsmob_pitch ($1);
1536 p = p.transposed (Pitch (-$2,0,0));
1537 $$ = p.smobbed_copy ();
1550 pitch_also_in_chords:
1556 PITCH embedded_scm {
1558 if (!unsmob_pitch ($2)) {
1559 THIS->parser_error (_f ("Expecting musical-pitch value", 3));
1560 $$ = Pitch ().smobbed_copy ();
1566 DURATION embedded_scm {
1568 if (!unsmob_duration ($2))
1570 THIS->parser_error (_ ("Must have duration object"));
1571 $$ = Duration ().smobbed_copy ();
1578 if (!THIS->lexer_->lyric_state_b ())
1579 THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
1580 $$ = MY_MAKE_MUSIC("ExtenderEvent");
1586 if (!THIS->lexer_->lyric_state_b ())
1587 THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
1588 $$ = MY_MAKE_MUSIC("HyphenEvent");
1593 close_event_parens {
1595 dynamic_cast<Music *> ($$)->set_mus_property ("span-direction", gh_int2scm (START))
1602 Music * s= MY_MAKE_MUSIC("SlurEvent");
1604 s->set_spot (THIS->here_input());
1607 Music * s= MY_MAKE_MUSIC("PhrasingSlurEvent");
1609 s->set_spot (THIS->here_input());
1612 Music *s =MY_MAKE_MUSIC("CrescendoEvent");
1614 s->set_spot (THIS->here_input());
1617 Music *s =MY_MAKE_MUSIC("DecrescendoEvent");
1619 s->set_spot (THIS->here_input());
1627 dynamic_cast<Music *> ($$)->set_mus_property ("span-direction", gh_int2scm (STOP))
1634 Music *s = MY_MAKE_MUSIC("CrescendoEvent");
1635 s->set_spot (THIS->here_input());
1640 Music * s= MY_MAKE_MUSIC("SlurEvent");
1642 s->set_spot (THIS->here_input());
1646 Music * s= MY_MAKE_MUSIC("PhrasingSlurEvent");
1648 s->set_mus_property ("span-type", scm_makfrom0str ( "phrasing-slur"));
1649 s->set_spot (THIS->here_input());
1655 Music *t = MY_MAKE_MUSIC("TextScriptEvent");
1656 t->set_mus_property ("text", $1);
1657 t->set_spot (THIS->here_input ());
1661 Music *t = MY_MAKE_MUSIC("TextScriptEvent");
1662 t->set_mus_property ("text", $1);
1663 t->set_spot (THIS->here_input ());
1667 Music *t = MY_MAKE_MUSIC("TextScriptEvent");
1668 t->set_mus_property ("text", make_simple_markup ($1));
1669 t->set_spot (THIS->here_input ());
1674 Music * t = MY_MAKE_MUSIC("FingerEvent");
1675 t->set_mus_property ("digit", gh_int2scm ($1));
1676 t->set_spot (THIS->here_input ());
1681 script_abbreviation:
1683 $$ = scm_makfrom0str ("Hat");
1686 $$ = scm_makfrom0str ("Plus");
1689 $$ = scm_makfrom0str ("Dash");
1692 $$ = scm_makfrom0str ("Bar");
1695 $$ = scm_makfrom0str ("Larger");
1698 $$ = scm_makfrom0str ("Dot");
1701 $$ = scm_makfrom0str ("Underscore");
1708 | '-' { $$ = CENTER; }
1715 | pre_events open_event {
1716 $$ = gh_cons ($2->self_scm(), $$);
1717 scm_gc_unprotect_object ($2->self_scm());
1728 multiplied_duration {
1731 | verbose_duration {
1736 optional_notemode_duration:
1738 Duration dd = THIS->default_duration_;
1739 $$ = dd.smobbed_copy ();
1741 THIS->beam_check ($$);
1743 | multiplied_duration {
1745 THIS->default_duration_ = *unsmob_duration ($$);
1747 THIS->beam_check ($$);
1749 | verbose_duration {
1751 THIS->default_duration_ = *unsmob_duration ($$);
1756 bare_unsigned dots {
1758 if (!is_duration_b ($1))
1759 THIS->parser_error (_f ("not a duration: %d", $1));
1763 $$ = Duration (l, $2).smobbed_copy ();
1765 | DURATION_IDENTIFIER dots {
1766 Duration *d =unsmob_duration ($1);
1767 Duration k (d->duration_log (),d->dot_count () + $2);
1777 multiplied_duration:
1781 | multiplied_duration '*' bare_unsigned {
1782 $$ = unsmob_duration ($$)->compressed ( $3) .smobbed_copy ();
1784 | multiplied_duration '*' FRACTION {
1785 Rational m (gh_scm2int (ly_car ($3)), gh_scm2int (ly_cdr ($3)));
1787 $$ = unsmob_duration ($$)->compressed (m).smobbed_copy ();
1792 FRACTION { $$ = $1; }
1793 | UNSIGNED '/' UNSIGNED {
1794 $$ = scm_cons (gh_int2scm ($1), gh_int2scm ($3));
1812 | ':' bare_unsigned {
1813 if (!is_duration_b ($2))
1814 THIS->parser_error (_f ("not a duration: %d", $2));
1821 /*****************************************************************
1823 *****************************************************************/
1837 Music *bfr = MY_MAKE_MUSIC("BassFigureEvent");
1838 $$ = bfr->self_scm();
1839 scm_gc_unprotect_object ($$);
1842 Music *bfr = MY_MAKE_MUSIC("BassFigureEvent");
1843 $$ = bfr->self_scm();
1845 bfr->set_mus_property ("figure", gh_int2scm ($1));
1847 scm_gc_unprotect_object ($$);
1849 | bass_figure bass_mod {
1850 Music *m = unsmob_music ($1);
1852 SCM salter =m->get_mus_property ("alteration");
1853 int alter = gh_number_p ( salter) ? gh_scm2int (salter) : 0;
1854 m->set_mus_property ("alteration",
1855 gh_int2scm (alter + $2));
1857 m->set_mus_property ("alteration", gh_int2scm (0));
1865 unsmob_music ($$)->set_mus_property ("bracket-start", SCM_BOOL_T);
1870 | br_bass_figure ']' {
1872 unsmob_music ($1)->set_mus_property ("bracket-stop", SCM_BOOL_T);
1880 | figure_list br_bass_figure {
1881 $$ = scm_cons ($2, $1);
1886 FIGURE_OPEN figure_list FIGURE_CLOSE {
1887 Music * m = MY_MAKE_MUSIC("EventChord");
1888 $2 = scm_reverse_x ($2, SCM_EOL);
1889 m->set_mus_property ("elements", $2);
1890 $$ = m->self_scm ();
1901 pitch exclamations questions optional_notemode_duration optional_rest {
1903 Input i = THIS->pop_spot ();
1904 if (!THIS->lexer_->note_state_b ())
1905 THIS->parser_error (_ ("Have to be in Note mode for notes"));
1909 n = MY_MAKE_MUSIC("RestEvent");
1911 n = MY_MAKE_MUSIC("NoteEvent");
1913 n->set_mus_property ("pitch", $1);
1914 n->set_mus_property ("duration", $4);
1918 n->set_mus_property ("cautionary", SCM_BOOL_T);
1919 if ($2 % 2 || $3 % 2)
1920 n->set_mus_property ("force-accidental", SCM_BOOL_T);
1922 Music *v = MY_MAKE_MUSIC("EventChord");
1923 v->set_mus_property ("elements", scm_list_n (n->self_scm (), SCM_UNDEFINED));
1924 scm_gc_unprotect_object (n->self_scm());
1930 | figure_spec optional_notemode_duration {
1931 Music * m = unsmob_music ($1);
1932 Input i = THIS->pop_spot ();
1934 for (SCM s = m->get_mus_property ("elements"); gh_pair_p (s); s = ly_cdr (s))
1936 unsmob_music (ly_car (s))->set_mus_property ("duration", $2);
1940 | RESTNAME optional_notemode_duration {
1942 Input i = THIS->pop_spot ();
1944 if (ly_scm2string ($1) =="s") {
1946 ev = MY_MAKE_MUSIC("SkipEvent");
1949 ev = MY_MAKE_MUSIC("RestEvent");
1952 ev->set_mus_property ("duration" ,$2);
1954 Music * velt = MY_MAKE_MUSIC("EventChord");
1955 velt->set_mus_property ("elements", scm_list_n (ev->self_scm (),SCM_UNDEFINED));
1960 | MULTI_MEASURE_REST optional_notemode_duration {
1965 proc = scm_c_eval_string ("make-multi-measure-rest");
1967 SCM mus = scm_call_2 (proc, $2,
1968 make_input (THIS->here_input()));
1969 scm_gc_protect_object (mus);
1970 $$ = unsmob_music (mus);
1972 | STRING optional_notemode_duration {
1973 Input i = THIS->pop_spot ();
1975 Music * lreq = MY_MAKE_MUSIC("LyricEvent");
1976 lreq->set_mus_property ("text", $1);
1977 lreq->set_mus_property ("duration",$2);
1979 Music * velt = MY_MAKE_MUSIC("EventChord");
1980 velt->set_mus_property ("elements", scm_list_n (lreq->self_scm (), SCM_UNDEFINED));
1987 if (!THIS->lexer_->chord_state_b ())
1988 THIS->parser_error (_ ("Have to be in Chord mode for chords"));
1989 $$ = unsmob_music ($1);
1994 steno_tonic_pitch optional_notemode_duration {
1995 $$ = make_chord ($1, $2, SCM_EOL);
1997 | steno_tonic_pitch optional_notemode_duration chord_separator chord_items {
1998 SCM its = scm_reverse_x ($4, SCM_EOL);
1999 $$ = make_chord ($1, $2, gh_cons ($3, its));
2007 | chord_items chord_item {
2008 $$ = gh_cons ($2, $$);
2014 $$ = ly_symbol2scm ("chord-colon");
2017 $$ = ly_symbol2scm ("chord-caret");
2019 | CHORD_SLASH steno_tonic_pitch {
2020 $$ = scm_list_n (ly_symbol2scm ("chord-slash"), $2, SCM_UNDEFINED);
2022 | CHORD_BASS steno_tonic_pitch {
2023 $$ = scm_list_n (ly_symbol2scm ("chord-bass"), $2, SCM_UNDEFINED);
2032 $$ = scm_reverse_x ($1, SCM_EOL);
2040 step_number { $$ = gh_cons ($1, SCM_EOL); }
2041 | step_numbers '.' step_number {
2042 $$ = gh_cons ($3, $$);
2048 $$ = make_chord_step ($1, 0);
2050 | bare_unsigned '+' {
2051 $$ = make_chord_step ($1, 1);
2053 | bare_unsigned CHORD_MINUS {
2054 $$ = make_chord_step ($1,-1);
2062 number_expression '+' number_term {
2063 $$ = scm_sum ($1, $3);
2065 | number_expression '-' number_term {
2066 $$ = scm_difference ($1, $3);
2075 | number_factor '*' number_factor {
2076 $$ = scm_product ($1, $3);
2078 | number_factor '/' number_factor {
2079 $$ = scm_divide ($1, $3);
2084 '-' number_factor { /* %prec UNARY_MINUS */
2085 $$ = scm_difference ($2, SCM_UNDEFINED);
2093 $$ = gh_int2scm ($1);
2098 | NUMBER_IDENTIFIER {
2101 | REAL NUMBER_IDENTIFIER {
2102 $$ = gh_double2scm (gh_scm2double ($1) * gh_scm2double ($2));
2104 | UNSIGNED NUMBER_IDENTIFIER {
2105 $$ = gh_double2scm ($1 * gh_scm2double ($2));
2121 if (scm_integer_p ($1) == SCM_BOOL_T)
2123 int k = gh_scm2int ($1);
2127 THIS->parser_error (_ ("need integer number arg"));
2141 | STRING_IDENTIFIER {
2144 | string '+' string {
2145 $$ = scm_string_append (scm_list_n ($1, $3, SCM_UNDEFINED));
2152 | exclamations '!' { $$ ++; }
2157 | questions '?' { $$ ++; }
2167 { THIS->lexer_->push_markup_state (); }
2170 THIS->lexer_->pop_state ();
2176 $$ = make_simple_markup ($1);
2178 | MARKUP_HEAD_MARKUP0 markup {
2179 $$ = scm_list_n ($1, $2, SCM_UNDEFINED);
2181 | MARKUP_HEAD_MARKUP0_MARKUP1 markup markup {
2182 $$ = scm_list_n ($1, $2, $3, SCM_UNDEFINED);
2184 | MARKUP_HEAD_SCM0_MARKUP1 SCM_T markup {
2185 $$ = scm_list_n ($1, $2, $3, SCM_UNDEFINED);
2190 | MARKUP_HEAD_LIST0 markup_list {
2191 $$ = scm_list_n ($1,$2, SCM_UNDEFINED);
2193 | MARKUP_HEAD_SCM0 embedded_scm {
2194 $$ = scm_list_n ($1, $2, SCM_UNDEFINED);
2196 | MARKUP_HEAD_SCM0_SCM1_MARKUP2 embedded_scm embedded_scm markup {
2197 $$ = scm_list_n ($1, $2, $3, $4, SCM_UNDEFINED);
2199 | MARKUP_IDENTIFIER {
2206 CHORD_OPEN markup_list_body CHORD_CLOSE { $$ = scm_reverse_x ($2, SCM_EOL); }
2210 '{' markup_list_body '}' {
2213 line = scm_c_eval_string ("line-markup");
2215 $$ = scm_list_n (line, scm_reverse_x ($2, SCM_EOL), SCM_UNDEFINED);
2220 /**/ { $$ = SCM_EOL; }
2221 | markup_list_body markup {
2222 $$ = gh_cons ($2, $1) ;
2230 My_lily_parser::set_yydebug (bool )
2237 extern My_lily_parser * current_parser;
2240 My_lily_parser::do_yyparse ()
2242 current_parser = this;;
2243 yyparse ((void*)this);
2248 Should make this optional? It will also complain when you do
2252 which is entirely legitimate.
2254 Or we can scrap it. Barchecks should detect wrong durations, and
2255 skipTypesetting speeds it up a lot.
2259 My_lily_parser::beam_check (SCM dur)
2261 Duration *d = unsmob_duration (dur);
2262 if (unsmob_music (last_beam_start_) && d->duration_log () <= 2)
2264 Music * m = unsmob_music (last_beam_start_);
2265 m->origin ()->warning (_("Suspect duration found following this beam"));
2267 last_beam_start_ = SCM_EOL;
2275 return gh_pair_p (x)
2276 && SCM_BOOL_F != scm_object_property (gh_car (x), ly_symbol2scm ("markup-signature"));
2279 It is a little strange, to have this function in this file, but
2280 otherwise, we have to import music classes into the lexer.
2284 My_lily_lexer::try_special_identifiers (SCM * destination, SCM sid)
2286 if (gh_string_p (sid)) {
2288 return STRING_IDENTIFIER;
2289 } else if (gh_number_p (sid)) {
2291 return NUMBER_IDENTIFIER;
2292 } else if (unsmob_translator_def (sid)) {
2293 *destination = unsmob_translator_def (sid)->clone_scm();
2294 return TRANSLATOR_IDENTIFIER;
2295 } else if (unsmob_score (sid)) {
2296 Score *sc = new Score (*unsmob_score (sid));
2297 *destination =sc->self_scm ();
2298 return SCORE_IDENTIFIER;
2299 } else if (Music * mus =unsmob_music (sid)) {
2300 *destination = unsmob_music (sid)->clone ()->self_scm();
2301 unsmob_music (*destination)->
2302 set_mus_property ("origin", make_input (last_input_));
2303 return dynamic_cast<Event*> (mus)
2304 ? EVENT_IDENTIFIER : MUSIC_IDENTIFIER;
2305 } else if (unsmob_duration (sid)) {
2306 *destination = unsmob_duration (sid)->smobbed_copy();
2307 return DURATION_IDENTIFIER;
2308 } else if (unsmob_music_output_def (sid)) {
2309 Music_output_def *p = unsmob_music_output_def (sid);
2312 *destination = p->self_scm();
2313 return MUSIC_OUTPUT_DEF_IDENTIFIER;
2314 } else if (new_markup_p (sid)) {
2316 return MARKUP_IDENTIFIER;