%{ // -*-Fundamental-*- #include #include "string.hh" #include "notename.hh" #include "lexer.hh" #include "varray.hh" #include "parser.hh" #include "debug.hh" #include "input-score.hh" #include "parseconstruct.hh" #include "main.hh" #include "string-convert.hh" %} %option c++ %option noyywrap %option nodefault %option yylineno %option debug %option yyclass="My_flex_lexer" %option stack %x notes %x incl %x quote %x lyrics A [a-zA-Z] AA {A}|_ N [0-9] AN {AA}|{N} PUNCT [?!,.:;] ACCENT [\\'"^] NATIONAL [\241-\377] TEX {AA}|-|{PUNCT}|{ACCENT}|{NATIONAL} WORD {A}{AN}* ALPHAWORD {A}+ INT -?{N}+ REAL {INT}?(\.{N}*)? OPTSIGN !? PITCHMOD ['`]*{OPTSIGN} RESTNAME r|s|p NOTECOMMAND \\{WORD} NOTENAME [a-z]+ UNOTENAME [A-Z][a-z]* DOTS \.+ LYRICS {TEX}+ COMMENT [%#].*\n %% \$ { yy_push_state(notes); } \@ { yy_push_state(lyrics); } {RESTNAME} { const char *s = YYText(); yylval.string = new String (s); mtor << "rest:"<< yylval.string; return RESTNAME; } {UNOTENAME} { int *p=yylval.ii; return ret_notename(p, YYText(), -1); } {NOTENAME} { int *p=yylval.ii; return ret_notename(p, YYText(), 0); } {NOTECOMMAND} { String c = YYText() +1; mtor << "\\word: " << YYText()+1<{PITCHMOD} { const char *s = YYText(); mtor << "pitchmod:"<< YYText()<{DOTS} { yylval.i = strlen(YYText()); return DOTS; } {INT} { yylval.i = String_convert::dec2_i( String( YYText() ) ); return INT; } {COMMENT} { } [ \t\n]+ { } \$ { yy_pop_state(); } \"[^"]*\" { String s (YYText()+1); s = s.left_str(s.length_i()-1); yylval.string = new String(s); return STRING; } . { return yylval.c = YYText()[0]; } \" { yy_push_state(quote); } [^"]* { yylval.string = new String (YYText()); } \" { mtor << "quoted string\n"; yy_pop_state(); return STRING; } {DOTS} { yylval.i = strlen(YYText()); return DOTS; } {INT} { yylval.i = String_convert::dec2_i( String( YYText() ) ); return INT; } {NOTECOMMAND} { String c = YYText() +1; mtor << "\\word: " << YYText()+1<\"[^"]*\" { String s (YYText()+1); s = s.left_str(s.length_i()-1); yylval.string = new String(s); return STRING; } {LYRICS} { String s (YYText()); int i = 0; while ((i=s.index_i("_")) != -1) // change word binding "_" to " " *(s.ch_l() + i) = ' '; if ((i=s.index_i("\\,")) != -1) // change "\," to TeX's "\c " { *(s.ch_l() + i + 1) = 'c'; s = s.left_str(i+2) + " " + s.right_str(s.length_i()-i-2); } yylval.string = new String(s); return STRING; } \| { return YYText()[0]; } {COMMENT} { } [{}] { return YYText()[0]; } [()\[\]|/.^>_-] { return yylval.c = YYText()[0]; } [ \t\n]+ { } @ { yy_pop_state(); } <> { mtor << "<>"; if (! close_input()) yyterminate(); // can't move this, since it actually rets a YY_NULL } include { yy_push_state(incl); } [ \t]* { /* eat the whitespace */ } \"[^"]*\"+ { /* got the include file name */ String s (YYText()+1); s = s.left_str(s.length_i()-1); defined_ch_c_l = here_ch_c_l() - String( YYText() ).length_i() - 1; new_input(s); yy_pop_state(); } {WORD} { mtor << "word: " << YYText()<