A "word" (a string recognized even when not quoted) and a "command"
(something starting with \ and followed by letters and other folderol,
indicating a Scheme control sequence or similar) get the same syntax
in all modes:
A "word" is a sequence of alphabetic characters possibly containing
single dashes or underlines inside (not at the beginning or end).
A "command" is a "word" preceded by a backslash.
A [a-zA-Z\200-\377]
AA {A}|_
N [0-9]
A [a-zA-Z\200-\377]
AA {A}|_
N [0-9]
ANY_CHAR (.|\n)
PUNCT [][()?!:'`]
SPECIAL_CHAR [&@]
NATIONAL [\001-\006\021-\027\031\036]
TEX {AA}|-|{PUNCT}|{NATIONAL}|{SPECIAL_CHAR}
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}
UNSIGNED {N}+
E_UNSIGNED \\{N}+
FRACTION {N}+\/{N}+
UNSIGNED {N}+
E_UNSIGNED \\{N}+
FRACTION {N}+\/{N}+
HORIZONTALWHITE [ \t]
BLACK [^ \n\t\f\r]
RESTNAME [rs]
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 __
LYRICS ({AA}|{TEX})[^0-9 \t\n\r\f]*
ESCAPED [nt\\'"]
EXTENDER __
error (_ ("end quote missing"));
exit (1);
}
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>{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>q {
return CHORD_REPETITION;
}
+<chords,notes,figures>R/[-_] | // pseudo backup rule
<chords,notes,figures>R {
return MULTI_MEASURE_REST;
}
<chords,notes,figures>R {
return MULTI_MEASURE_REST;
}
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
return scan_bare_word (YYText_utf8 ());
}
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
yylval.scm = scm_c_read_string (YYText ());
return UNSIGNED;
}
yylval.scm = scm_c_read_string (YYText ());
return UNSIGNED;
}
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{LYRICS} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{LYRICS} {
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
return scan_bare_word (YYText_utf8 ());
}
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
return scan_escaped_word (YYText_utf8 () + 1);
}
{FRACTION} {
return CHORD_CARET;
}
. {
return CHORD_CARET;
}
. {
- return YYText ()[0]; // ALPHAWORD catches all multibyte.
+ return YYText ()[0]; // WORD catches all multibyte.
\\score {
return SCORE;
}
\\score {
return SCORE;
}
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
string str (YYText_utf8 () + 1);
int token_type = MARKUP_FUNCTION;
string str (YYText_utf8 () + 1);
int token_type = MARKUP_FUNCTION;
+ {WORD}/[-_] | // backup rule
+ {WORD} {
return scan_bare_word (YYText_utf8 ());
}
return scan_bare_word (YYText_utf8 ());
}
+ {COMMAND}/[-_] | // backup rule
+ {COMMAND} {
return scan_escaped_word (YYText_utf8 () + 1);
}
}
return scan_escaped_word (YYText_utf8 () + 1);
}
}