source file of the LilyPond music typesetter
- (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+ (c) 1996,1997 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include "string.hh"
#include "string-convert.hh"
#include "my-lily-lexer.hh"
-#include "varray.hh"
+#include "array.hh"
#include "interval.hh"
#include "parser.hh"
#include "debug.hh"
#define yylval (*(YYSTYPE*)lexval_l)
#define YY_USER_ACTION add_lexed_char (YYLeng ());
+/*
+
+LYRICS ({AA}|{TEX})[^0-9 \t\n\f]*
+
+*/
+
%}
%option c++
%option never-interactive
%option warn
+%x chords
%x incl
%x lyrics
%x notes
INT -?{UNSIGNED}
REAL ({INT}\.{N}*)|(-?\.{N}+)
KEYWORD \\{WORD}
-WHITE [ \n\t\f]
+WHITE [ \n\t\f\r]
HORIZONTALWHITE [ \t]
-BLACK [^ \n\t\f]
+BLACK [^ \n\t\f\r]
RESTNAME [rs]
NOTECOMMAND \\{A}+
LYRICS ({AA}|{TEX})[^0-9 \t\n\f]*
ESCAPED [nt\\'"]
-PLET \\\[
-TELP \\\]
+EXTENDER __
%%
// windows-suck-suck-suck
}
-<notes,incl,INITIAL,lyrics>{
+<INITIAL,chords,incl,lyrics,notes>{
"%{" {
yy_push_state (longcomment);
}
yy_pop_state ();
}
<<EOF>> {
- LexerError ("EOF found inside a comment");
+ LexerError (_ ("EOF found inside a comment").ch_C ());
if (! close_input ())
yyterminate (); // can't move this, since it actually rets a YY_NULL
}
}
-<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 */
Identifier * id = lookup_identifier (s);
if (id)
{
- String* s_p = id->string ();
- DOUT << "#include `" << *s_p << "\'\n";
- new_input (*s_p, source_global_l);
- delete s_p;
+ String* s_l = id->access_content_String (false);
+ DOUT << "#include `" << *s_l << "\'\n";
+ new_input (*s_l, source_global_l);
+
yy_pop_state ();
}
else
{
- String msg ("Undefined identifier: `" + s + "'");
+ String msg (_f ("undefined identifier: `%s\'", s ));
LexerError (msg.ch_C ());
}
}
<incl>\"[^"]* { // backup rule
- cerr << "missing end quote" << endl;
+ cerr << _ ("missing end quote") << endl;
exit (1);
}
-<notes>{RESTNAME} {
+<chords,notes>{RESTNAME} {
const char *s = YYText ();
yylval.string = new String (s);
DOUT << "rest:"<< yylval.string;
return RESTNAME;
}
-<notes>R {
+<chords,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);
+ 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
- cerr << "white expected" << endl;
+<INITIAL,chords,lyrics,notes>\\\${BLACK}* { // backup rule
+ cerr << _ ("white expected") << endl;
exit (1);
}
-<INITIAL,lyrics,notes>\${BLACK}* { // backup rule
- cerr << "white expected" << endl;
+<INITIAL,chords,lyrics,notes>\${BLACK}* { // backup rule
+ cerr << _ ("white expected") << endl;
exit (1);
}
<notes>{
-
{ALPHAWORD} {
return scan_bare_word (YYText ());
-
}
{NOTECOMMAND} {
- return scan_escaped_word (YYText ()+1);
+ return scan_escaped_word (YYText () + 1);
}
{DIGIT} {
}
<quote>{
\\{ESCAPED} {
- *yylval.string += escaped_char(YYText()[1]);
+ *yylval.string += to_str (escaped_char(YYText()[1]));
}
[^\\"]+ {
*yylval.string += YYText ();
}
<lyrics>{
-
\" {
start_quote ();
}
return UNSIGNED;
}
{NOTECOMMAND} {
- return scan_escaped_word (YYText ()+1);
+ return scan_escaped_word (YYText () + 1);
}
{LYRICS} {
/* ugr. This sux. */
String s (YYText ());
+ if (s == "__")
+ return yylval.i = EXTENDER;
int i = 0;
while ((i=s.index_i ("_")) != -1) // change word binding "_" to " "
*(s.ch_l () + i) = ' ';
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;
+ }
+ \" {
+ start_quote ();
+ }
+ . {
+ return yylval.c = YYText ()[0];
+ }
+}
<<EOF>> {
DOUT << "<<eof>>";
yyterminate (); // can't move this, since it actually rets a YY_NULL
}
}
+
+
{WORD} {
return scan_bare_word (YYText ());
}
{KEYWORD} {
- return scan_escaped_word (YYText ()+1);
+ return scan_escaped_word (YYText () + 1);
}
{REAL} {
Real r;
return c;
}
-<lyrics,notes>{PLET} {
- return yylval.i = PLET;
-}
-
-<lyrics,notes>{TELP} {
- return yylval.i = TELP;
-}
-
<INITIAL,notes>. {
return yylval.c = YYText ()[0];
}
}
<*>. {
- String msg= String ("illegal character: ") +String (YYText ()[0]);
+ String msg = _f ("illegal character: `%c\'", YYText ()[0]);
LexerError (msg.ch_C ());
return 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);
- String msg ("Unknown escaped string: `" + str + "'");
+ String msg (_f ("unknown escaped string: `\\%s\'", str));
LexerError (msg.ch_C ());
DOUT << "(string)";
String *sp = new String (str);
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));
-
- return NOTENAME_PITCH;
+ 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 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
{