#include "warn.hh"
#include "lily-imports.hh"
-using std::string;
-
/*
RH 7 fix (?)
*/
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.
*/
}
<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 ());
}
\\\" {
for (; scm_is_pair(s); s = scm_cdr(s)) {
SCM predicate = scm_car(s);
- if (predicate == Lily::markup_list_p)
+ if (scm_is_eq (predicate, SCM (Lily::markup_list_p)))
push_extra_token (here_input (), EXPECT_MARKUP_LIST);
- else if (predicate == Lily::markup_p)
+ 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);
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 ());
}
\\\" {
yylval = ly_string2scm (str);
- return STRING;
+ return STRING; // SYMBOL would cause additional processing
}
int
cs = SCM_CAR (cs);
}
- if (scm_is_eq (cs, Lily::ly_music_p))
+ if (scm_is_eq (cs, SCM (Lily::ly_music_p)))
funtype = MUSIC_FUNCTION;
- else if (scm_is_eq (cs, Lily::ly_event_p))
+ else if (scm_is_eq (cs, SCM (Lily::ly_event_p)))
funtype = EVENT_FUNCTION;
else if (ly_is_procedure (cs))
funtype = SCM_FUNCTION;
}
int
-Lily_lexer::scan_bare_word (const string &str)
+Lily_lexer::scan_word (SCM & output, SCM sym)
{
- SCM sym = ly_symbol2scm (str.c_str ());
if ((YYSTATE == notes) || (YYSTATE == chords)) {
SCM handle = SCM_BOOL_F;
if (scm_is_pair (pitchname_tab_stack_))
handle = scm_hashq_get_handle (scm_cdar (pitchname_tab_stack_), sym);
if (scm_is_pair (handle)) {
- yylval = scm_cdr (handle);
+ output = scm_cdr (handle);
if (unsmob<Pitch> (yylval))
return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH;
else if (scm_is_symbol (yylval))
else if ((YYSTATE == chords)
&& scm_is_true (handle = scm_hashq_get_handle (chordmodifier_tab_, sym)))
{
- yylval = scm_cdr (handle);
+ output = scm_cdr (handle);
return CHORD_MODIFIER;
}
}
+ output = SCM_UNDEFINED;
+ return -1;
+}
+
+int
+Lily_lexer::scan_bare_word (const string &str)
+{
+ int state = scan_word (yylval, ly_symbol2scm (str.c_str ()));
+ if (state >= 0)
+ {
+ return state;
+ }
yylval = ly_string2scm (str);
- return STRING;
+ return SYMBOL;
}
int