%option never-interactive
%option warn
+%x chords
%x incl
%x lyrics
%x notes
NOTECOMMAND \\{A}+
LYRICS ({AA}|{TEX})[^0-9 \t\n\f]*
ESCAPED [nt\\'"]
-PLET \\\[
-TELP \\\]
-EXTENDER [_][_]
+EXTENDER __
%%
// windows-suck-suck-suck
}
-<notes,incl,INITIAL,lyrics>{
+<INITIAL,chords,incl,lyrics,notes>{
"%{" {
yy_push_state (longcomment);
}
}
-<notes,INITIAL,lyrics>\\maininput {
- start_main_input ();
+<INITIAL,chords,lyrics,notes>\\maininput {
+ if (!main_input_b_)
+ {
+ start_main_input ();
+ main_input_b_ = true;
+ }
+ else
+ error ("\\maininput disallowed outside init files.");
}
-<notes,INITIAL,lyrics>\\include {
+<INITIAL,chords,lyrics,notes>\\include {
yy_push_state (incl);
}
<incl>\"[^"]*\";? { /* got the include file name */
<notes>R {
return MEASURES;
}
-<INITIAL,lyrics,notes>\\\${BLACK}*{WHITE} {
+<INITIAL,chords,lyrics,notes>\\\${BLACK}*{WHITE} {
String s=YYText () + 2;
s=s.left_str (s.length_i () - 1);
return scan_escaped_word (s);
}
-<INITIAL,lyrics,notes>\${BLACK}*{WHITE} {
+<INITIAL,chords,lyrics,notes>\${BLACK}*{WHITE} {
String s=YYText () + 1;
s=s.left_str (s.length_i () - 1);
return scan_bare_word (s);
}
-<INITIAL,lyrics,notes>\\\${BLACK}* { // backup rule
+<INITIAL,chords,lyrics,notes>\\\${BLACK}* { // backup rule
cerr << _ ("white expected") << endl;
exit (1);
}
-<INITIAL,lyrics,notes>\${BLACK}* { // backup rule
+<INITIAL,chords,lyrics,notes>\${BLACK}* { // backup rule
cerr << _ ("white expected") << endl;
exit (1);
}
<notes>{
-
{ALPHAWORD} {
return scan_bare_word (YYText ());
-
}
{NOTECOMMAND} {
}
<lyrics>{
-
\" {
start_quote ();
}
return yylval.c = YYText ()[0];
}
}
+<chords>{
+ {ALPHAWORD} {
+ return scan_bare_word (YYText ());
+ }
+ {NOTECOMMAND} {
+ return scan_escaped_word (YYText () + 1);
+ }
+ {UNSIGNED} {
+ yylval.i = String_convert::dec2_i (String (YYText ()));
+ return UNSIGNED;
+ }
+ . {
+ return yylval.c = YYText ()[0];
+ }
+}
<<EOF>> {
DOUT << "<<eof>>";
return c;
}
-<lyrics,notes>{PLET} {
- return yylval.i = PLET;
-}
-
-<lyrics,notes>{TELP} {
- return yylval.i = TELP;
-}
-
<INITIAL,notes>. {
return yylval.c = YYText ()[0];
}
yy_push_state (notes);
}
+void
+My_lily_lexer::push_chord_state ()
+{
+ yy_push_state (chords);
+}
+
void
My_lily_lexer::push_lyric_state ()
{
yy_push_state (lyrics);
}
+
void
My_lily_lexer::pop_state ()
{
yylval.id = id;
return id->token_code_i_;
}
- if (YYSTATE != notes) {
- if (notename_b (str))
- {
- yylval.pitch = new Musical_pitch (lookup_pitch (str));
+ if ((YYSTATE != notes) && (YYSTATE != chords)) {
+ if (notename_b (str)) {
+ yylval.pitch = new Musical_pitch (lookup_notename (str));
yylval.pitch->set_spot (Input (source_file_l (),
here_ch_C ()));
return NOTENAME_PITCH;
- }
+ }
}
if (check_debug)
print_declarations (true);
My_lily_lexer::scan_bare_word (String str)
{
DOUT << "word: `" << str<< "'\n";
- if (YYSTATE == notes){
+ if ((YYSTATE == notes) || (YYSTATE == chords)) {
if (notename_b (str)) {
DOUT << "(notename)\n";
- yylval.pitch = new Musical_pitch (lookup_pitch (str));
+ yylval.pitch = new Musical_pitch (lookup_notename (str));
+ yylval.pitch->set_spot (Input (source_file_l (),
+ here_ch_C ()));
+ return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH;
+ } else if (chordmodifier_b (str)) {
+ DOUT << "(chordmodifier)\n";
+ yylval.pitch = new Musical_pitch (lookup_chordmodifier (str));
yylval.pitch->set_spot (Input (source_file_l (),
here_ch_C ()));
- return NOTENAME_PITCH;
+ return CHORDMODIFIER_PITCH;
}
}
return YY_START == notes;
}
+bool
+My_lily_lexer::chord_state_b () const
+{
+ return YY_START == chords;
+}
+
bool
My_lily_lexer::lyric_state_b () const
{