/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1996--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
N [0-9]
AN {AA}|{N}
ANY_CHAR (.|\n)
-PUNCT [?!:'`]
-ACCENT \\[`'"^]
+PUNCT [][()?!:'`]
SPECIAL_CHAR [&@]
NATIONAL [\001-\006\021-\027\031\036]
-TEX {AA}|-|{PUNCT}|{ACCENT}|{NATIONAL}|{SPECIAL_CHAR}
+TEX {AA}|-|{PUNCT}|{NATIONAL}|{SPECIAL_CHAR}
DASHED_WORD {A}({AN}|-)*
DASHED_KEY_WORD \\{DASHED_WORD}
}
-<sourcefilename>\"[^"]*\" {
+<sourcefilename>\"[^""]*\" {
string s (YYText_utf8 () + 1);
s = s.substr (0, s.rfind ('\"'));
yylval.scm = scm_from_locale_string (s);
return RESTNAME;
}
+<chords,notes,figures>q {
+ return CHORD_REPETITION;
+}
+
<chords,notes,figures>R {
return MULTI_MEASURE_REST;
}
}
char_count_stack_.back () += n;
- sval = eval_scm (sval);
-
+ sval = eval_scm (sval, '$');
+
int token = scan_scm_id (sval);
if (!scm_is_eq (yylval.scm, SCM_UNSPECIFIED))
- return token;
+ return token;
}
<INITIAL,notes,lyrics>{
}
}
+{FRACTION} {
+ yylval.scm = scan_fraction (YYText ());
+ return FRACTION;
+}
+
-{UNSIGNED} | // backup rule
{REAL} {
yylval.scm = scm_c_read_string (YYText ());
return REAL;
}
+{UNSIGNED}/\/ | // backup rule
{UNSIGNED} {
yylval.scm = scm_c_read_string (YYText ());
return UNSIGNED;
void
Lily_lexer::pop_state ()
{
+ bool extra = (YYSTATE == extratoken);
+
+ if (extra)
+ yy_pop_state ();
+
if (YYSTATE == notes || YYSTATE == chords)
pitchname_tab_stack_ = scm_cdr (pitchname_tab_stack_);
yy_pop_state ();
+
+ if (extra) {
+ hidden_state_ = YYSTATE;
+ yy_push_state (extratoken);
+ }
}
int
{
int funtype = SCM_FUNCTION;
- yylval.scm = get_music_function_transform (sid);
+ yylval.scm = sid;
- SCM s = scm_object_property (yylval.scm, ly_symbol2scm ("music-function-signature"));
+ SCM s = get_music_function_signature (sid);
SCM cs = scm_car (s);
if (scm_is_pair (cs))
yylval.scm = scm_cdr (handle);
return CHORD_MODIFIER;
}
- if ((chord_repetition_.repetition_symbol_ != SCM_EOL)
- && to_boolean (scm_equal_p (chord_repetition_.repetition_symbol_, sym)))
- return CHORD_REPETITION;
}
-
yylval.scm = ly_string2scm (str);
return STRING;
}
return get_state () == figures;
}
+// The extra_token parameter specifies how to convert multiple values
+// into additional tokens. For '#', additional values get pushed as
+// SCM_IDENTIFIER. For '$', they get checked for their type and get
+// pushed as a corresponding *_IDENTIFIER token. Since the latter
+// tampers with yylval, it can only be done from the lexer itself, so
+// this function is private.
+
SCM
-Lily_lexer::eval_scm (SCM readerdata)
+Lily_lexer::eval_scm (SCM readerdata, char extra_token)
{
SCM sval = SCM_UNDEFINED;
error_level_ = 1;
return SCM_UNSPECIFIED;
}
+
+ if (extra_token && SCM_VALUESP (sval))
+ {
+ sval = scm_struct_ref (sval, SCM_INUM0);
+
+ if (scm_is_pair (sval)) {
+ for (SCM v = scm_reverse (scm_cdr (sval));
+ scm_is_pair (v);
+ v = scm_cdr (v))
+ {
+ int token;
+ switch (extra_token) {
+ case '$':
+ token = scan_scm_id (scm_car (v));
+ if (!scm_is_eq (yylval.scm, SCM_UNSPECIFIED))
+ push_extra_token (token, yylval.scm);
+ break;
+ case '#':
+ push_extra_token (SCM_IDENTIFIER, scm_car (v));
+ break;
+ }
+ }
+ sval = scm_car (sval);
+ } else
+ sval = SCM_UNSPECIFIED;
+ }
+
return sval;
}