AA {A}|_
N [0-9]
ANY_CHAR (.|\n)
-WORD {A}([-_]{A}|{A})*
-COMMAND \\{WORD}
+SYMBOL {A}([-_]{A}|{A})*
+COMMAND \\{SYMBOL}
/* SPECIAL category is for every letter that needs to get passed to
* the parser rather than being redefinable by the user */
SPECIAL [-+*/=<>{}!?_^'',.:]
/* 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,
+ * {RESTNAME} rule but rather the {SYMBOL}/[-_] rule coming later,
* needed for avoiding backup states.
*/
sval = eval_scm (sval, hi, '$');
+ if (YYSTATE == markup && ly_is_procedure (sval))
+ {
+ SCM sig = Lily::markup_command_signature (sval);
+ if (scm_is_true (sig))
+ {
+ yylval = sval;
+ int token = MARKUP_FUNCTION;
+ if (scm_is_true (scm_object_property
+ (sval, ly_symbol2scm ("markup-list-command"))))
+ token = MARKUP_LIST_FUNCTION;
+ push_markup_predicates (sig);
+ return token;
+ }
+ }
int token = scan_scm_id (sval);
if (!scm_is_eq (yylval, SCM_UNSPECIFIED))
return token;
}
<notes,figures>{
- {WORD}/[-_] | // backup rule
- {WORD} {
+ {SYMBOL}/[-_] | // backup rule
+ {SYMBOL} {
return scan_bare_word (YYText_utf8 ());
}
\\\" {
s = lyric_fudge (s);
yylval = ly_string2scm (s);
- return STRING;
+ return SYMBOL;
}
/* This should really just cover {} */
[{}] {
}
}
<chords>{
- {WORD}/[-_] | // backup rule
- {WORD} {
+ {SYMBOL}/[-_] | // backup rule
+ {SYMBOL} {
return scan_bare_word (YYText_utf8 ());
}
\\\" {
// value (for token type MARKUP_FUNCTION or
// MARKUP_LIST_FUNCTION).
- push_extra_token (here_input (), EXPECT_NO_MORE_ARGS);
- s = scm_cdr(s);
- for (; scm_is_pair(s); s = scm_cdr(s)) {
- SCM predicate = scm_car(s);
-
- if (scm_is_eq (predicate, SCM (Lily::markup_list_p)))
- push_extra_token (here_input (), EXPECT_MARKUP_LIST);
- else if (scm_is_eq (predicate, SCM (Lily::markup_p)))
- push_extra_token (here_input (), EXPECT_MARKUP);
- else
- push_extra_token (here_input (), EXPECT_SCM, predicate);
- }
+ push_markup_predicates (scm_cdr (s));
+
return token_type;
}
[^$#{}\"\\ \t\n\r\f]+ {
string s (YYText_utf8 ());
yylval = ly_string2scm (s);
- return STRING;
+ return SYMBOL;
}
[{}] {
yylval = SCM_UNSPECIFIED;
}
<INITIAL>{
- {WORD}/[-_] | // backup rule
- {WORD} {
+ {SYMBOL}/[-_] | // backup rule
+ {SYMBOL} {
return scan_bare_word (YYText_utf8 ());
}
\\\" {
}
+void
+Lily_lexer::push_markup_predicates (SCM sig)
+{
+ push_extra_token (here_input (), EXPECT_NO_MORE_ARGS);
+ for (SCM s = sig; scm_is_pair(s); s = scm_cdr(s)) {
+ SCM predicate = scm_car(s);
+
+ if (scm_is_eq (predicate, SCM (Lily::markup_list_p)))
+ push_extra_token (here_input (), EXPECT_MARKUP_LIST);
+ else if (scm_is_eq (predicate, SCM (Lily::markup_p)))
+ push_extra_token (here_input (), EXPECT_MARKUP);
+ else
+ push_extra_token (here_input (), EXPECT_SCM, predicate);
+ }
+}
+
+
int
Lily_lexer::identifier_type (SCM sid)
{
yylval = ly_string2scm (str);
- return STRING;
+ return STRING; // SYMBOL would cause additional processing
}
int
return state;
}
yylval = ly_string2scm (str);
- return STRING;
+ return SYMBOL;
}
int