%x incl
%x lyrics
%x longcomment
+%x maininput
%x markup
%x notes
%x quote
"%{" {
yy_push_state (longcomment);
}
- %[^{\n\r][^\n\r]*[\n\r] {
+ %[^{\n\r][^\n\r]*[\n\r]? {
(void) YYText_utf8 ();
}
- %[^{\n\r] { // backup rule
- (void) YYText_utf8 ();
- }
- %[\n\r] {
- }
- %[^{\n\r][^\n\r]* {
- (void) YYText_utf8 ();
+ %[\n\r]? {
}
{WHITE}+ {
start_main_input ();
main_input_level_ = include_stack_.size ();
is_main_input_ = true;
+ int state = YYSTATE;
+ yy_push_state (maininput);
+ yy_push_state (state);
}
else
- error (_ ("\\maininput not allowed outside init files"));
+ LexerError (_ ("\\maininput not allowed outside init files").c_str ());
}
<INITIAL,chords,lyrics,figures,notes>\\include {
}
<incl,version,sourcefilename>\"[^""]* { // backup rule
- error (_ ("end quote missing"));
- exit (1);
+ LexerError (_ ("end quote missing").c_str ());
+ yy_pop_state ();
}
/* Flex picks the longest matching pattern including trailing
<longcomment><<EOF>> {
LexerError (_ ("EOF found inside a comment").c_str ());
- is_main_input_ = false; // should be safe , can't have \include in --safe.
- yylval = SCM_UNSPECIFIED;
- if (!close_input ())
- yyterminate (); // can't move this, since it actually rets a YY_NULL
+ yy_pop_state ();
}
+<quote><<EOF>> {
+ LexerError (_ ("EOF found inside string").c_str ());
+ yy_pop_state ();
+}
+
<<EOF>> {
yylval = SCM_UNSPECIFIED;
if (is_main_input_)
{
is_main_input_ = include_stack_.size () > main_input_level_;
if (!is_main_input_)
+ {
main_input_level_ = 0;
+ pop_state ();
+ if (YYSTATE != maininput)
+ {
+ LexerError (_ ("Unfinished main input").c_str ());
+ do {
+ pop_state ();
+ } while (YYSTATE != maininput);
+ }
+ pop_state ();
+ }
if (!close_input () || !is_main_input_)
/* Returns YY_NULL */
yyterminate ();
yyterminate ();
}
+<maininput>. {
+ while (include_stack_.size () > main_input_level_
+ && close_input ())
+ ;
+ yyterminate ();
+}
+
<INITIAL>{
{WORD}/[-_] | // backup rule
{WORD} {
return i;
SCM sid = lookup_identifier (str);
+ if (Music *m = unsmob_music (sid))
+ {
+ m->set_spot (override_input (last_input_));
+ }
+
if (sid != SCM_UNDEFINED)
return scan_scm_id (sid);
sval = scm_struct_ref (sval, SCM_INUM0);
if (scm_is_pair (sval)) {
- for (SCM v = scm_reverse (scm_cdr (sval));
- scm_is_pair (v);
- v = scm_cdr (v))
+ for (SCM p = scm_reverse (scm_cdr (sval));
+ scm_is_pair (p);
+ p = scm_cdr (p))
{
+ SCM v = scm_car (p);
+ if (Music *m = unsmob_music (v))
+ {
+ if (!unsmob_input (m->get_property ("origin")))
+ m->set_spot (override_input (last_input_));
+ }
+
int token;
switch (extra_token) {
case '$':
- token = scan_scm_id (scm_car (v));
+ token = scan_scm_id (v);
if (!scm_is_eq (yylval, SCM_UNSPECIFIED))
push_extra_token (token, yylval);
break;
case '#':
- push_extra_token (SCM_IDENTIFIER, scm_car (v));
+ push_extra_token (SCM_IDENTIFIER, v);
break;
}
}
sval = SCM_UNSPECIFIED;
}
+ if (Music *m = unsmob_music (sval))
+ {
+ if (!unsmob_input (m->get_property ("origin")))
+ m->set_spot (override_input (last_input_));
+ }
+
return sval;
}