%x incl
%x lyrics
%x longcomment
+%x maininput
%x markup
%x notes
%x quote
HORIZONTALWHITE [ \t]
BLACK [^ \n\t\f\r]
RESTNAME [rs]
-ESCAPED [nt\\'"]
+ESCAPED [nt\\''""]
EXTENDER __
HYPHEN --
BOM_UTF8 \357\273\277
<INITIAL,chords,lyrics,notes,figures>\\sourcefileline{WHITE}* {
yy_push_state (sourcefileline);
}
-<version>\"[^"]*\" { /* got the version number */
+<version>\"[^""]*\" { /* got the version number */
string s (YYText_utf8 () + 1);
s = s.substr (0, s.rfind ('\"'));
<INITIAL,chords,lyrics,notes,figures>\\maininput {
- if (!is_main_input_ && include_stack_.size () == 1)
+ if (!is_main_input_)
{
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"));
SCM_UNDEFINED,
SCM_UNDEFINED);
- return is_lyric_state () ? LYRICS_STRING : STRING;
+ return STRING;
}
\\ {
yylval = scm_cons (scm_from_locale_string (YYText ()),
s = lyric_fudge (s);
yylval = ly_string2scm (s);
- return LYRICS_STRING;
+ return STRING;
}
/* This should really just cover {} */
. {
<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_)
{
- /* 2 = init.ly + current file.
- > because we're before closing, but is_main_input_ should
- reflect after.
- */
- is_main_input_ = include_stack_.size () > 2;
+ 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} {
yylval = SCM_UNSPECIFIED;
int i = lookup_keyword (str);
- if (i == MARKUP && is_lyric_state ())
- return LYRIC_MARKUP;
+
if (i != -1)
return i;