#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"
%{
-#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.
#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);
/* Keyword tokens with plain escaped name. */
%token ACCEPTS "\\accepts"
%token ADDLYRICS "\\addlyrics"
-%token ADDQUOTE "\\addquote"
%token ALIAS "\\alias"
%token ALTERNATIVE "\\alternative"
%token BOOK "\\book"
%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
}
| 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 = $$;
}
;
-function_arglist_nonmusic: /*empty*/ {
+function_arglist_nonmusic: EXPECT_NO_MORE_ARGS {
$$ = SCM_EOL;
}
| EXPECT_MARKUP function_arglist_nonmusic full_markup {
}
;
-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
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, @$);
}
;
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)
$$ = 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);
$$ = 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 {
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);
| 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)
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 ();
}
;
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 ();
}
}
| 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"));
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 ();
}
;
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))
bfr->set_property ("text", $1);
bfr->unprotect ();
- bfr->set_spot (@1);
}
| bass_figure ']' {
$$ = $1;
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);
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);
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 ();
}
;
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)
}
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);