A [a-zA-Z\200-\377]
AA {A}|_
N [0-9]
-AN {AA}|{N}
ANY_CHAR (.|\n)
PUNCT [][()?!:'`]
SPECIAL_CHAR [&@]
NATIONAL [\001-\006\021-\027\031\036]
TEX {AA}|-|{PUNCT}|{NATIONAL}|{SPECIAL_CHAR}
-DASHED_WORD {A}({AN}|-)*
-DASHED_KEY_WORD \\{DASHED_WORD}
+WORD {A}([-_]{A}|{A})*
+COMMAND \\{WORD}
-
-
-ALPHAWORD {A}+
UNSIGNED {N}+
E_UNSIGNED \\{N}+
FRACTION {N}+\/{N}+
HORIZONTALWHITE [ \t]
BLACK [^ \n\t\f\r]
RESTNAME [rs]
-NOTECOMMAND \\{A}+
-MARKUPCOMMAND \\({A}|[-_])+
LYRICS ({AA}|{TEX})[^0-9 \t\n\r\f]*
ESCAPED [nt\\'"]
EXTENDER __
error (_ ("end quote missing"));
exit (1);
}
+
+ /* Flex picks the longest matching pattern including trailing
+ * contexts. Without the backup pattern, r-. does not trigger the
+ * {RESTNAME} rule but rather the {WORD}/[-_] rule coming later,
+ * needed for avoiding backup states.
+ */
+
+<chords,notes,figures>{RESTNAME}/[-_] | // pseudo backup rule
<chords,notes,figures>{RESTNAME} {
char const *s = YYText ();
yylval.scm = scm_from_locale_string (s);
return RESTNAME;
}
+<chords,notes,figures>q/[-_] | // pseudo backup rule
<chords,notes,figures>q {
return CHORD_REPETITION;
}
+<chords,notes,figures>R/[-_] | // pseudo backup rule
<chords,notes,figures>R {
return MULTI_MEASURE_REST;
}
}
<notes,figures>{
- {ALPHAWORD} {
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
- {NOTECOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
yylval.scm = scan_fraction (YYText ());
return FRACTION;
}
- {UNSIGNED}/\/[^0-9] { // backup rule
- yylval.scm = scm_c_read_string (YYText ());
- return UNSIGNED;
- }
{UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.scm = scm_c_read_string (YYText ());
return UNSIGNED;
}
- {NOTECOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{LYRICS} {
}
}
<chords>{
- {ALPHAWORD} {
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
- {NOTECOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
yylval.scm = scan_fraction (YYText ());
return FRACTION;
}
- {UNSIGNED}/\/[^0-9] { // backup rule
- yylval.scm = scm_c_read_string (YYText ());
- return UNSIGNED;
- }
{UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.scm = scm_c_read_string (YYText ());
return CHORD_CARET;
}
. {
- return YYText ()[0]; // ALPHAWORD catches all multibyte.
+ return YYText ()[0]; // WORD catches all multibyte.
}
}
\\score {
return SCORE;
}
- {MARKUPCOMMAND} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
string str (YYText_utf8 () + 1);
int token_type = MARKUP_FUNCTION;
reflect after.
*/
is_main_input_ = include_stack_.size () > 2;
- if (!close_input ())
+ if (!close_input () || !is_main_input_)
/* Returns YY_NULL */
yyterminate ();
}
}
<INITIAL>{
- {DASHED_WORD} {
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
- {DASHED_KEY_WORD} {
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
}
yylval.scm = scm_c_read_string (YYText ());
return REAL;
}
--\. { // backup rule
- yylval.scm = scm_from_double (0.0);
- return REAL;
-}
{UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
return YYText ()[0];
}
+
+-/\. | // backup rule
[*:=] {
char c = YYText ()[0];
void
Lily_lexer::push_note_state (SCM alist)
{
+ bool extra = (YYSTATE == extratoken);
+
SCM p = scm_assq (alist, pitchname_tab_stack_);
+ if (extra)
+ yy_pop_state ();
+
if (scm_is_false (p))
p = scm_cons (alist, alist_to_hashq (alist));
pitchname_tab_stack_ = scm_cons (p, pitchname_tab_stack_);
yy_push_state (notes);
+
+ if (extra) {
+ hidden_state_ = YYSTATE;
+ yy_push_state (extratoken);
+ }
}
void