X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fparser.yy;h=09ace3518a03531a56b3676f92471569665ea256;hb=de19d3787ab5ba1d4bd951176eaa03b2b4ceee95;hp=3483bbc3f67845178f1445780cdc856bb651bca5;hpb=59983948f63c1faeee3615d6a277a3d97bf618b8;p=lilypond.git diff --git a/lily/parser.yy b/lily/parser.yy index 3483bbc3f6..09ace3518a 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -5,26 +5,18 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2002 Han-Wen Nienhuys + (c) 1997--2003 Han-Wen Nienhuys Jan Nieuwenhuizen */ /* Two shift/reduce problems: - - empty music-list - - empty pre-events - - - -(bullshit. - -s/r: 1. foo = bar. - "bar" -> String -> Lyric -> Music + "bar" -> String -> Lyric -> Music -> music-assignment - "bar" -> String + "bar" -> String -> string-assignment 2. \repeat @@ -50,12 +42,12 @@ TODO: * The rules for who is protecting what are very shady. Uniformise this. -* There are too many lexical modes. - +* There are too many lexical modes? */ #include +#include #include "translator-def.hh" #include "lily-guile.hh" @@ -74,13 +66,32 @@ TODO: #include "lilypond-input-version.hh" #include "scm-hash.hh" #include "auto-change-iterator.hh" -#include "chord.hh" #include "ly-modules.hh" #include "music-sequence.hh" #include "input-smob.hh" #include "event.hh" #include "text-item.hh" + + +#define MY_MAKE_MUSIC(x) make_music_by_name (ly_symbol2scm (x)) + + + +#define YYERROR_VERBOSE 1 + +My_lily_parser* my_lily_parser; +#define YYPARSE_PARAM my_lily_parser +#define YYLEX_PARAM my_lily_parser +#define THIS\ + ((My_lily_parser *) my_lily_parser) + +#define yyerror THIS->parser_error + + + + + bool regular_identifier_b (SCM id) { @@ -123,8 +134,30 @@ set_music_properties (Music *p, SCM a) } +SCM +make_chord_step (int step, int alter) +{ + if (step == 7) + alter--; + + /* ugh: fucks up above 13 */ + Pitch m(step > 7 ? 1 : 0,(step - 1) % 7, alter); + return m.smobbed_copy (); +} + + +SCM +make_chord (SCM pitch, SCM dur, SCM modification_list) +{ + static SCM chord_ctor; + if (!chord_ctor) + chord_ctor= scm_c_eval_string ("construct-chord"); + SCM ch= scm_call_3 (chord_ctor, pitch, dur, modification_list); + scm_gc_protect_object (ch); + return ch; +} + -#define MY_MAKE_MUSIC(x) make_music_by_name (ly_symbol2scm (x)) Music* set_property_music (SCM sym, SCM value) @@ -135,24 +168,6 @@ set_property_music (SCM sym, SCM value) return p; } - -// needed for bison.simple's malloc () and free () - -// #include -#include - - - -#define YYERROR_VERBOSE 1 - -My_lily_parser* my_lily_parser; -#define YYPARSE_PARAM my_lily_parser -#define YYLEX_PARAM my_lily_parser -#define THIS\ - ((My_lily_parser *) my_lily_parser) - -#define yyerror THIS->parser_error - %} /* We use SCMs to do strings, because it saves us the trouble of @@ -189,13 +204,14 @@ yylex (YYSTYPE *s, void * v) /* tokens which are not keywords */ %token AUTOCHANGE %token ALIAS -%token APPLYCONTEXT +%token APPLYCONTEXT +%token APPLYOUTPUT %token APPLY %token ACCEPTS %token ALTERNATIVE %token BAR %token BREATHE -%token CHORDMODIFIERS +%token CHORDMODIFIERS %token CHORDS %token CLEF %token CONSISTS @@ -270,7 +286,9 @@ yylex (YYSTYPE *s, void * v) %token DURATION_IDENTIFIER %token FRACTION %token IDENTIFIER +%token CHORDNAMES CHORDNAMES_IDENTIFIER +%token CHORD_MODIFIER %token SCORE_IDENTIFIER %token MUSIC_OUTPUT_DEF_IDENTIFIER @@ -290,6 +308,7 @@ yylex (YYSTYPE *s, void * v) %token MARKUP_HEAD_SCM0 %token MARKUP_HEAD_SCM0_MARKUP1 %token MARKUP_HEAD_SCM0_SCM1 +%token MARKUP_HEAD_SCM0_SCM1_SCM2 %token MARKUP_HEAD_SCM0_SCM1_MARKUP2 %token MARKUP_IDENTIFIER MARKUP_HEAD_LIST0 @@ -318,11 +337,13 @@ yylex (YYSTYPE *s, void * v) %type steno_pitch pitch absolute_pitch pitch_also_in_chords %type explicit_pitch steno_tonic_pitch -%type chord_additions chord_subtractions chord_notes chord_step -%type chord -%type chord_note chord_inversion chord_bass +/* %type chord_additions chord_subtractions chord_notes chord_step */ +/* %type chord */ +/* %type chord_note chord_inversion chord_bass */ %type duration_length fraction +%type new_chord step_number chord_items chord_item chord_separator step_numbers + %type embedded_scm scalar %type Music Sequential_music Simultaneous_music %type relative_music re_rhythmed_music part_combined_music @@ -407,12 +428,8 @@ notenames_body: SCM tab = scm_make_vector (gh_int2scm (i), SCM_EOL); 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, ly_caar (s), pt); + scm_hashq_set_x (tab, ly_caar (s), pt); } - $$ = tab; } ; @@ -691,7 +708,7 @@ music_output_def_body: tempo_event: TEMPO steno_duration '=' bare_unsigned { - $$ = MY_MAKE_MUSIC("TempoEvent"); + $$ = MY_MAKE_MUSIC("MetronomeChangeEvent"); $$->set_mus_property ("tempo-unit", $2); $$->set_mus_property ("metronome-count", gh_int2scm ( $4)); } @@ -813,6 +830,13 @@ Simultaneous_music: Simple_music: event_chord { $$ = $1; } + | APPLYOUTPUT embedded_scm { + if (!gh_procedure_p ($2)) + THIS->parser_error (_ ("\applycontext takes function argument")); + $$ = MY_MAKE_MUSIC ("ApplyOutputEvent"); + $$->set_mus_property ("procedure", $2); + $$->set_spot (THIS->here_input()); + } | APPLYCONTEXT embedded_scm { if (!gh_procedure_p ($2)) THIS->parser_error (_ ("\applycontext takes function argument")); @@ -1012,6 +1036,7 @@ relative_music: $$->set_mus_property ("element", p->self_scm ()); scm_gc_unprotect_object (p->self_scm ()); + $$->set_mus_property ("last-pitch", p->to_relative_octave (pit).smobbed_copy ()); } @@ -1167,6 +1192,8 @@ scalar: string { $$ = $1; } | bare_int { $$ = gh_int2scm ($1); } | embedded_scm { $$ = $1; } + | full_markup { $$ = $1; } + | DIGIT { $$ = gh_int2scm ($1); } ; @@ -1349,7 +1376,7 @@ shorthand_command_req: $$ = MY_MAKE_MUSIC("BreathingSignEvent"); } | E_TILDE { - $$ = MY_MAKE_MUSIC("PorrectusEvent"); + $$ = MY_MAKE_MUSIC("PesOrFlexaEvent"); } ; @@ -1380,8 +1407,10 @@ verbose_command_req: Music *key= MY_MAKE_MUSIC("KeyChangeEvent"); key->set_mus_property ("pitch-alist", $3); + key->set_mus_property ("tonic", Pitch (0,0,0).smobbed_copy()); ((Music*)key)->transpose (* unsmob_pitch ($2)); - $$ = key; + + $$ = key; } ; @@ -1488,15 +1517,13 @@ steno_pitch: } | NOTENAME_PITCH sup_quotes { Pitch p = *unsmob_pitch ($1); - p.octave_ += $2; + p = p.transposed (Pitch ($2,0,0)); $$ = p.smobbed_copy (); } | NOTENAME_PITCH sub_quotes { Pitch p =* unsmob_pitch ($1); - - p.octave_ += -$2; + p = p.transposed (Pitch (-$2,0,0)); $$ = p.smobbed_copy (); - } ; @@ -1510,15 +1537,14 @@ steno_tonic_pitch: } | TONICNAME_PITCH sup_quotes { Pitch p = *unsmob_pitch ($1); - p.octave_ += $2; + p = p.transposed (Pitch ($2,0,0)); $$ = p.smobbed_copy (); } | TONICNAME_PITCH sub_quotes { Pitch p =* unsmob_pitch ($1); - p.octave_ += -$2; + p = p.transposed (Pitch (-$2,0,0)); $$ = p.smobbed_copy (); - } ; @@ -1965,108 +1991,79 @@ simple_element: $$= velt; } - | chord { + | new_chord { THIS->pop_spot (); - if (!THIS->lexer_->chord_state_b ()) - THIS->parser_error (_ ("Have to be in Chord mode for chords")); - $$ = $1; + if (!THIS->lexer_->chord_state_b ()) + THIS->parser_error (_ ("Have to be in Chord mode for chords")); + $$ = unsmob_music ($1); } ; - -chord: - steno_tonic_pitch optional_notemode_duration chord_additions chord_subtractions chord_inversion chord_bass { - $$ = Chord::get_chord ($1, $3, $4, $5, $6, $2); - $$->set_spot (THIS->here_input ()); - }; - -chord_additions: - { - $$ = SCM_EOL; - } - | CHORD_COLON chord_notes { - $$ = $2; +new_chord: + steno_tonic_pitch optional_notemode_duration { + $$ = make_chord ($1, $2, SCM_EOL); + } + | steno_tonic_pitch optional_notemode_duration chord_separator chord_items { + SCM its = scm_reverse_x ($4, SCM_EOL); + $$ = make_chord ($1, $2, gh_cons ($3, its)); } ; -chord_notes: - chord_step { - $$ = $1; +chord_items: + /**/ { + $$ = SCM_EOL; } - | chord_notes '.' chord_step { - $$ = gh_append2 ($$, $3); + | chord_items chord_item { + $$ = gh_cons ($2, $$); } ; -chord_subtractions: - { - $$ = SCM_EOL; - } - | CHORD_CARET chord_notes { - $$ = $2; +chord_separator: + CHORD_COLON { + $$ = ly_symbol2scm ("chord-colon"); } - ; - - -chord_inversion: - { - $$ = SCM_EOL; + | CHORD_CARET { + $$ = ly_symbol2scm ("chord-caret"); } | CHORD_SLASH steno_tonic_pitch { - $$ = $2; - } - ; - -chord_bass: - { - $$ = SCM_EOL; + $$ = scm_list_n (ly_symbol2scm ("chord-slash"), $2, SCM_UNDEFINED); } | CHORD_BASS steno_tonic_pitch { - $$ = $2; + $$ = scm_list_n (ly_symbol2scm ("chord-bass"), $2, SCM_UNDEFINED); } ; -chord_step: - chord_note { - $$ = scm_cons ($1, SCM_EOL); +chord_item: + chord_separator { + $$ = $1; } - | CHORDMODIFIER_PITCH { - $$ = scm_cons (unsmob_pitch ($1)->smobbed_copy (), SCM_EOL); + | step_numbers { + $$ = scm_reverse_x ($1, SCM_EOL); } - | CHORDMODIFIER_PITCH chord_note { /* Ugh. */ - $$ = scm_list_n (unsmob_pitch ($1)->smobbed_copy (), - $2, SCM_UNDEFINED); + | CHORD_MODIFIER { + $$ = $1; } ; -chord_note: - bare_unsigned { - Pitch m; - m.notename_ = ($1 - 1) % 7; - m.octave_ = $1 > 7 ? 1 : 0; - m.alteration_ = 0; +step_numbers: + step_number { $$ = gh_cons ($1, SCM_EOL); } + | step_numbers '.' step_number { + $$ = gh_cons ($3, $$); + } + ; - $$ = m.smobbed_copy (); +step_number: + bare_unsigned { + $$ = make_chord_step ($1, 0); } | bare_unsigned '+' { - Pitch m; - m.notename_ = ($1 - 1) % 7; - m.octave_ = $1 > 7 ? 1 : 0; - m.alteration_ = 1; - - - $$ = m.smobbed_copy (); + $$ = make_chord_step ($1, 1); } | bare_unsigned CHORD_MINUS { - Pitch m; - m.notename_ = ($1 - 1) % 7; - m.octave_ = $1 > 7 ? 1 : 0; - m.alteration_ = -1; - - $$ = m.smobbed_copy (); + $$ = make_chord_step ($1,-1); } - ; + ; /* UTILITIES @@ -2183,7 +2180,11 @@ full_markup: THIS->lexer_->pop_state (); } ; - + + +/* +This should be done more dynamically if possible. +*/ markup: STRING { $$ = make_simple_markup ($1); @@ -2209,6 +2210,9 @@ markup: | MARKUP_HEAD_SCM0_SCM1_MARKUP2 embedded_scm embedded_scm markup { $$ = scm_list_n ($1, $2, $3, $4, SCM_UNDEFINED); } + | MARKUP_HEAD_SCM0_SCM1_SCM2 embedded_scm embedded_scm embedded_scm { + $$ = scm_list_n ($1, $2, $3, $4, SCM_UNDEFINED); + } | MARKUP_IDENTIFIER { $$ = $1; } @@ -2216,7 +2220,7 @@ markup: ; markup_list: - '<' markup_list_body '>' { $$ = scm_reverse_x ($2, SCM_EOL); } + CHORD_OPEN markup_list_body CHORD_CLOSE { $$ = scm_reverse_x ($2, SCM_EOL); } ; markup_line: