]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
Merge branch 'master' of ssh+git://hanwen@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / parser.yy
index 63f38ae6b173119e5d46ea8380d9e1911734fc99..d895d41d623e663c9c74ebd13da2190edd0a568e 100644 (file)
@@ -80,7 +80,6 @@ using namespace std;
 #include "lily-guile.hh"
 #include "lily-lexer.hh"
 #include "lily-parser.hh"
-#include "lilypond-input-version.hh"
 #include "main.hh"
 #include "misc.hh"
 #include "music.hh"
@@ -108,7 +107,7 @@ using namespace std;
 
 %{
 
-#define MY_MAKE_MUSIC(x)  make_music_by_name (ly_symbol2scm (x))
+#define MY_MAKE_MUSIC(x, spot)  make_music_with_input (ly_symbol2scm (x), spot)
 
 /* ES TODO:
 - Don't use lily module, create a new module instead.
@@ -132,12 +131,12 @@ SCM get_next_unique_lyrics_context_id ();
 #endif
 
 
-
-SCM make_music_relative (Pitch start, SCM music);
+static Music *make_music_with_input (SCM name, Input where);
+SCM make_music_relative (Pitch start, SCM music, Input loc);
 SCM run_music_function (Lily_parser *, SCM expr);
 SCM get_first_context_id (SCM type, Music *m);
 SCM make_chord_elements (SCM pitch, SCM dur, SCM modification_list);
-SCM make_chord_step (int step, int alter);
+SCM make_chord_step (int step, Rational alter);
 SCM make_simple_markup (SCM a);
 bool is_duration (int t);
 bool is_regular_identifier (SCM id);
@@ -157,7 +156,6 @@ void set_music_properties (Music *p, SCM a);
 /* Keyword tokens with plain escaped name.  */
 %token ACCEPTS "\\accepts"
 %token ADDLYRICS "\\addlyrics"
-%token ADDQUOTE "\\addquote"
 %token ALIAS "\\alias"
 %token ALTERNATIVE "\\alternative"
 %token BOOK "\\book"
@@ -260,6 +258,8 @@ If we give names, Bison complains.
 %token <i> EXPECT_MARKUP;
 %token <i> EXPECT_MUSIC;
 %token <i> EXPECT_SCM;
+/* After the last argument. */
+%token <i> EXPECT_NO_MORE_ARGS;
 
 %token <scm> BOOK_IDENTIFIER
 %token <scm> CHORDMODIFIER_PITCH
@@ -823,7 +823,7 @@ music_list:
 
        }
        | music_list error {
-               Music *m = MY_MAKE_MUSIC("Music");
+               Music *m = MY_MAKE_MUSIC("Music", @$);
                // ugh. code dup 
                m->set_property ("error-found", SCM_BOOL_T);
                SCM s = $$;
@@ -936,7 +936,7 @@ function_arglist_nonmusic_last:
        }
        ;
 
-function_arglist_nonmusic: /*empty*/ {
+function_arglist_nonmusic: EXPECT_NO_MORE_ARGS {
                $$ = SCM_EOL;
        }
        | EXPECT_MARKUP function_arglist_nonmusic full_markup {
@@ -947,7 +947,9 @@ function_arglist_nonmusic: /*empty*/ {
        }
        ;
 
-function_arglist: /*empty*/ {
+function_arglist: EXPECT_NO_MORE_ARGS {
+               /* This is for 0-ary functions, so they don't need to
+                  read a lookahead token */
                $$ = SCM_EOL;
        }
        | function_arglist_music_last
@@ -973,7 +975,7 @@ prefix_composite_music:
        generic_prefix_music_scm {
                $$ = run_music_function (PARSER, $1);
        }
-       | CONTEXT    simple_string optional_id optional_context_mod music {
+       | CONTEXT simple_string optional_id optional_context_mod music {
                $$ = MAKE_SYNTAX ("context-specification", @$, $2, $3, $5, $4, SCM_BOOL_F);
        }
        | NEWCONTEXT simple_string optional_id optional_context_mod music {
@@ -1075,11 +1077,11 @@ mode_changing_head_with_context:
 relative_music:
        RELATIVE absolute_pitch music {
                Pitch start = *unsmob_pitch ($2);
-               $$ = make_music_relative (start, $3);
+               $$ = make_music_relative (start, $3, @$);
        }
        | RELATIVE composite_music {
                Pitch middle_c (0, 0, 0);
-               $$ = make_music_relative (middle_c, $2);
+               $$ = make_music_relative (middle_c, $2, @$);
        }
        ;
 
@@ -1326,9 +1328,8 @@ chord_body_element:
                SCM check = $4;
                SCM post = $5;
 
-               Music *n = MY_MAKE_MUSIC ("NoteEvent");
+               Music *n = MY_MAKE_MUSIC ("NoteEvent", @$);
                n->set_property ("pitch", $1);
-               n->set_spot (@$);
                if (q % 2)
                        n->set_property ("cautionary", SCM_BOOL_T);
                if (ex % 2 || q % 2)
@@ -1347,10 +1348,9 @@ chord_body_element:
                $$ = n->unprotect ();
        }
        | DRUM_PITCH post_events {
-               Music *n = MY_MAKE_MUSIC ("NoteEvent");
+               Music *n = MY_MAKE_MUSIC ("NoteEvent", @$);
                n->set_property ("duration", $2);
                n->set_property ("drum-type", $1);
-               n->set_spot (@$);
 
                if (scm_is_pair ($2)) {
                        SCM arts = scm_reverse_x ($2, SCM_EOL);
@@ -1404,15 +1404,13 @@ command_element:
                $$ = MAKE_SYNTAX ("skip-music", @$, $2);
        }
        | E_BRACKET_OPEN {
-               Music *m = MY_MAKE_MUSIC ("LigatureEvent");
+               Music *m = MY_MAKE_MUSIC ("LigatureEvent", @$);
                m->set_property ("span-direction", scm_from_int (START));
-               m->set_spot (@$);
                $$ = m->unprotect();
        }
        | E_BRACKET_CLOSE {
-               Music *m = MY_MAKE_MUSIC ("LigatureEvent");
+               Music *m = MY_MAKE_MUSIC ("LigatureEvent", @$);
                m->set_property ("span-direction", scm_from_int (STOP));
-               m->set_spot (@$);
                $$ = m->unprotect ();
        }
        | E_BACKSLASH {
@@ -1452,22 +1450,22 @@ command_element:
 
 command_event:
        E_TILDE {
-               $$ = MY_MAKE_MUSIC ("PesOrFlexaEvent")->unprotect ();
+               $$ = MY_MAKE_MUSIC ("PesOrFlexaEvent", @$)->unprotect ();
        }
        | MARK DEFAULT  {
-               Music *m = MY_MAKE_MUSIC ("MarkEvent");
+               Music *m = MY_MAKE_MUSIC ("MarkEvent", @$);
                $$ = m->unprotect ();
        }
        | tempo_event {
                $$ = $1;
        }
        | KEY DEFAULT {
-               Music *key = MY_MAKE_MUSIC ("KeyChangeEvent");
+               Music *key = MY_MAKE_MUSIC ("KeyChangeEvent", @$);
                $$ = key->unprotect ();
        }
        | KEY NOTENAME_PITCH SCM_IDENTIFIER     {
 
-               Music *key = MY_MAKE_MUSIC ("KeyChangeEvent");
+               Music *key = MY_MAKE_MUSIC ("KeyChangeEvent", @$);
                if (scm_ilength ($3) > 0)
                {               
                        key->set_property ("pitch-alist", $3);
@@ -1502,12 +1500,12 @@ post_event:
        | HYPHEN {
                if (!PARSER->lexer_->is_lyric_state ())
                        PARSER->parser_error (@1, _ ("have to be in Lyric mode for lyrics"));
-               $$ = MY_MAKE_MUSIC ("HyphenEvent")->unprotect ();
+               $$ = MY_MAKE_MUSIC ("HyphenEvent", @$)->unprotect ();
        }
        | EXTENDER {
                if (!PARSER->lexer_->is_lyric_state ())
                        PARSER->parser_error (@1, _ ("have to be in Lyric mode for lyrics"));
-               $$ = MY_MAKE_MUSIC ("ExtenderEvent")->unprotect ();
+               $$ = MY_MAKE_MUSIC ("ExtenderEvent", @$)->unprotect ();
        }
        | script_dir direction_reqd_event {
                if ($1)
@@ -1530,9 +1528,8 @@ post_event:
 
 string_number_event:
        E_UNSIGNED {
-               Music *s = MY_MAKE_MUSIC ("StringNumberEvent");
+               Music *s = MY_MAKE_MUSIC ("StringNumberEvent", @$);
                s->set_property ("string-number", scm_from_int ($1));
-               s->set_spot (@$);
                $$ = s->unprotect ();
        }
        ;
@@ -1577,20 +1574,19 @@ direction_less_event:
                if (unsmob_music (predefd))
                {
                        m = unsmob_music (predefd)->clone ();
+                       m->set_spot (@$);
                }
                else
                {
-                       m = MY_MAKE_MUSIC ("Music");
+                       m = MY_MAKE_MUSIC ("Music", @$);
                }
-               m->set_spot (@$);
                $$ = m->unprotect ();
        }
        | EVENT_IDENTIFIER      {
                $$ = $1;
        }
        | tremolo_type  {
-               Music *a = MY_MAKE_MUSIC ("TremoloEvent");
-               a->set_spot (@$);
+               Music *a = MY_MAKE_MUSIC ("TremoloEvent", @$);
                a->set_property ("tremolo-type", scm_from_int ($1));
                $$ = a->unprotect ();
         }
@@ -1602,7 +1598,7 @@ direction_reqd_event:
        }
        | script_abbreviation {
                SCM s = PARSER->lexer_->lookup_identifier ("dash" + ly_scm2string ($1));
-               Music *a = MY_MAKE_MUSIC ("ArticulationEvent");
+               Music *a = MY_MAKE_MUSIC ("ArticulationEvent", @$);
                if (scm_is_string (s))
                        a->set_property ("articulation-type", s);
                else PARSER->parser_error (@1, _ ("expecting string as script definition"));
@@ -1613,7 +1609,7 @@ direction_reqd_event:
 octave_check:
        /**/ { $$ = SCM_EOL; }
        | '='  { $$ = scm_from_int (0); }
-       | '=' sub_quotes { $$ = scm_from_int ($2); }
+       | '=' sub_quotes { $$ = scm_from_int (-$2); }
        | '=' sup_quotes { $$ = scm_from_int ($2); }
        ;
 
@@ -1665,7 +1661,7 @@ steno_tonic_pitch:
                $$ = p.smobbed_copy ();
        }
        | TONICNAME_PITCH sub_quotes     {
-               Pitch p =unsmob_pitch ($1);
+               Pitch p = *unsmob_pitch ($1);
 
                p = p.transposed (Pitch (-$2,0,0));
                $$ = p.smobbed_copy ();
@@ -1685,22 +1681,19 @@ pitch_also_in_chords:
 
 gen_text_def:
        full_markup {
-               Music *t = MY_MAKE_MUSIC ("TextScriptEvent");
+               Music *t = MY_MAKE_MUSIC ("TextScriptEvent", @$);
                t->set_property ("text", $1);
-               t->set_spot (@$);
                $$ = t->unprotect ();
        }
        | string {
-               Music *t = MY_MAKE_MUSIC ("TextScriptEvent");
+               Music *t = MY_MAKE_MUSIC ("TextScriptEvent", @$);
                t->set_property ("text",
                        make_simple_markup ($1));
-               t->set_spot (@$);
                $$ = t->unprotect ();
        }
        | DIGIT {
-               Music *t = MY_MAKE_MUSIC ("FingeringEvent");
+               Music *t = MY_MAKE_MUSIC ("FingeringEvent", @$);
                t->set_property ("digit", scm_from_int ($1));
-               t->set_spot (@$);
                $$ = t->unprotect ();
        }
        ;
@@ -1837,13 +1830,11 @@ figured_bass_alteration:
 
 bass_figure:
        FIGURE_SPACE {
-               Music *bfr = MY_MAKE_MUSIC ("BassFigureEvent");
-               $$ = bfr->self_scm ();
-               bfr->unprotect ();
-               bfr->set_spot (@1);
+               Music *bfr = MY_MAKE_MUSIC ("BassFigureEvent", @$);
+               $$ = bfr->unprotect ();
        }
        | bass_number  {
-               Music *bfr = MY_MAKE_MUSIC ("BassFigureEvent");
+               Music *bfr = MY_MAKE_MUSIC ("BassFigureEvent", @$);
                $$ = bfr->self_scm ();
 
                if (scm_is_number ($1))
@@ -1852,7 +1843,6 @@ bass_figure:
                        bfr->set_property ("text", $1);
 
                bfr->unprotect ();
-               bfr->set_spot (@1);
        }
        | bass_figure ']' {
                $$ = $1;
@@ -1937,9 +1927,9 @@ simple_element:
 
                Music *n = 0;
                if ($6)
-                       n = MY_MAKE_MUSIC ("RestEvent");
+                       n = MY_MAKE_MUSIC ("RestEvent", @$);
                else
-                       n = MY_MAKE_MUSIC ("NoteEvent");
+                       n = MY_MAKE_MUSIC ("NoteEvent", @$);
                
                n->set_property ("pitch", $1);
                n->set_property ("duration", $5);
@@ -1955,11 +1945,10 @@ simple_element:
                if ($2 % 2 || $3 % 2)
                        n->set_property ("force-accidental", SCM_BOOL_T);
 
-               n->set_spot (@$);
                $$ = n->unprotect ();
        }
        | DRUM_PITCH optional_notemode_duration {
-               Music *n = MY_MAKE_MUSIC ("NoteEvent");
+               Music *n = MY_MAKE_MUSIC ("NoteEvent", @$);
                n->set_property ("duration", $2);
                n->set_property ("drum-type", $1);
 
@@ -1969,24 +1958,22 @@ simple_element:
                Music *ev = 0;
                if (ly_scm2string ($1) == "s") {
                        /* Space */
-                       ev = MY_MAKE_MUSIC ("SkipEvent");
+                       ev = MY_MAKE_MUSIC ("SkipEvent", @$);
                  }
                else {
-                       ev = MY_MAKE_MUSIC ("RestEvent");
+                       ev = MY_MAKE_MUSIC ("RestEvent", @$);
                
                    }
                ev->set_property ("duration", $2);
-               ev->set_spot (@$);
                $$ = ev->unprotect ();
        }
        | lyric_element optional_notemode_duration      {
                if (!PARSER->lexer_->is_lyric_state ())
                        PARSER->parser_error (@1, _ ("have to be in Lyric mode for lyrics"));
 
-               Music *levent = MY_MAKE_MUSIC ("LyricEvent");
+               Music *levent = MY_MAKE_MUSIC ("LyricEvent", @$);
                levent->set_property ("text", $1);
                levent->set_property ("duration",$2);
-               levent->set_spot (@$);
                $$= levent->unprotect ();
        }
        ;
@@ -2076,10 +2063,10 @@ step_number:
                $$ = make_chord_step ($1, 0);
         }
        | bare_unsigned '+' {
-               $$ = make_chord_step ($1, SHARP);
+               $$ = make_chord_step ($1, SHARP_ALTERATION);
        }
        | bare_unsigned CHORD_MINUS {
-               $$ = make_chord_step ($1, FLAT);
+               $$ = make_chord_step ($1, FLAT_ALTERATION);
        }
        ;       
 
@@ -2441,6 +2428,13 @@ is_regular_identifier (SCM id)
   return v;
 }
 
+Music *
+make_music_with_input (SCM name, Input where)
+{
+       Music *m = make_music_by_name (name);
+       m->set_spot (where);
+       return m;
+}
 
 SCM
 get_first_context_id (SCM type, Music *m)
@@ -2476,10 +2470,10 @@ set_music_properties (Music *p, SCM a)
 
 
 SCM
-make_chord_step (int step, int alter)
+make_chord_step (int step, Rational alter)
 {
        if (step == 7)
-               alter += FLAT;
+               alter += FLAT_ALTERATION;
 
        while (step < 0)
                step += 7;
@@ -2505,9 +2499,9 @@ ly_input_procedure_p (SCM x)
 }
 
 SCM
-make_music_relative (Pitch start, SCM music)
+make_music_relative (Pitch start, SCM music, Input loc)
 {
-       Music *relative = MY_MAKE_MUSIC ("RelativeOctaveMusic");
+       Music *relative = MY_MAKE_MUSIC ("RelativeOctaveMusic", loc);
        relative->set_property ("element", music);
        
        Music *m = unsmob_music (music);