]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.l
release: 0.1.9
[lilypond.git] / lily / lexer.l
index f942a19cc307be87b18cad50658192aebc9082ce..8e702b7c793d00b52041edad18b5473f1d298d2f 100644 (file)
@@ -22,6 +22,7 @@
 
 
 #include <stdio.h>
+#include <ctype.h>
 
 #include "string.hh"
 #include "string-convert.hh"
@@ -32,6 +33,9 @@
 #include "parseconstruct.hh"
 #include "main.hh"
 #include "identifier.hh"
+void strip_trailing_white(String&);
+void strip_leading_white(String&);
+
 
 #define start_quote()  \
        yy_push_state(quote);\
@@ -52,6 +56,7 @@
 %option warn
 
 %x incl
+%x header
 %x lyrics
 %x notes
 %x quote
@@ -70,9 +75,10 @@ TEX          {AA}|-|{PUNCT}|{ACCENT}|{NATIONAL}
 WORD           {A}{AN}*
 ALPHAWORD      {A}+
 INT            -?{N}+
-REAL           {INT}?\.{N}*
+REAL           ({INT}\.{N}*)|(-?\.{N}+)
 KEYWORD                \\{WORD}
 WHITE          [ \n\t\f]
+HORIZONTALWHITE                [ \t]
 BLACK          [^ \n\t\f]
 RESTNAME       [rs]
 NOTECOMMAND    \\{A}+
@@ -94,7 +100,7 @@ LYRICS               ({AA}|{NATIONAL})[^0-9 \t\n\f]*
   %[^{\n].*    {
   }
   {WHITE}+     {
-       
+
   }
 }
 
@@ -107,21 +113,44 @@ LYRICS            ({AA}|{NATIONAL})[^0-9 \t\n\f]*
        "%"+"}"         {
                yy_pop_state();
        }
+       <<EOF>>         {
+               LexerError("EOF found inside a comment");
+               if (! close_input()) 
+                 yyterminate(); // can't move this, since it actually rets a YY_NULL
+       }
 }
-<longcomment><<EOF>> {
-       LexerError("EOF found inside a comment");
-       if (! close_input()) { 
-         yyterminate(); // can't move this, since it actually rets a YY_NULL
+<header>{
+       [\{\}]  {
+               return YYText()[0];
+       }
+       ^{WORD}         {
+               String s=YYText();
+               yylval.string = new String(s);
+               return FIELDNAME;
+       }
+       {HORIZONTALWHITE}+{BLACK}.*\n           {
+               String s=YYText();
+               strip_leading_white(s);
+               strip_trailing_white(s);
+               yylval.string = new String(s);
+               return RECORDLINE;
+       }
+       {WHITE}*        {
+       }
+
+       .               {
+               return YYText()[0];
        }
 }
-<notes,INITIAL,lyrics>
-\\include           {
+
+
+<notes,INITIAL,lyrics>\\include           {
        yy_push_state(incl);
 }
 <incl>\"[^"]*\"   { /* got the include file name */
        String s (YYText()+1);
        s = s.left_str(s.length_i()-1);
-       mtor << "#include `" << s << "\'\n";
+       DOUT << "#include `" << s << "\'\n";
        new_input(s,source_l_g);
        yy_pop_state();
 }
@@ -132,7 +161,7 @@ LYRICS              ({AA}|{NATIONAL})[^0-9 \t\n\f]*
 <notes>{RESTNAME}      {
        const char *s = YYText();
        yylval.string = new String (s); 
-       mtor << "rest:"<< yylval.string;
+       DOUT << "rest:"<< yylval.string;
        return RESTNAME;
 }
 <INITIAL,lyrics,notes>\\\${BLACK}*{WHITE}      {
@@ -180,9 +209,6 @@ LYRICS              ({AA}|{NATIONAL})[^0-9 \t\n\f]*
                return INT;
        }
 
-       \+\+            {
-               return CONCAT;
-       }
        \" {
                start_quote();
        }
@@ -202,7 +228,7 @@ LYRICS              ({AA}|{NATIONAL})[^0-9 \t\n\f]*
                *yylval.string += YYText();
        }
        \"      {
-               mtor << "quoted string: `" << *yylval.string << "'\n";
+               DOUT << "quoted string: `" << *yylval.string << "'\n";
                yy_pop_state();
                return STRING;
        }
@@ -224,7 +250,7 @@ LYRICS              ({AA}|{NATIONAL})[^0-9 \t\n\f]*
                /* ugr. This sux. */
                String s (YYText()); 
                int i = 0;
-               while ((i=s.index_i("_")) != -1) // change word binding "_" to " "
+                       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 "
                        {
@@ -232,7 +258,7 @@ LYRICS              ({AA}|{NATIONAL})[^0-9 \t\n\f]*
                        s = s.left_str(i+2) + " " + s.right_str(s.length_i()-i-2);
                        }
                yylval.string = new String(s);
-               mtor << "lyric : `" << s << "'\n";
+               DOUT << "lyric : `" << s << "'\n";
                return STRING;
        }
        . {
@@ -241,7 +267,7 @@ LYRICS              ({AA}|{NATIONAL})[^0-9 \t\n\f]*
 }
 
 <<EOF>> {
-       mtor << "<<eof>>";
+       DOUT << "<<eof>>";
 
        if (! close_input()) { 
          yyterminate(); // can't move this, since it actually rets a YY_NULL
@@ -257,7 +283,7 @@ LYRICS              ({AA}|{NATIONAL})[^0-9 \t\n\f]*
        Real r;
        int cnv=sscanf (YYText(), "%lf", &r);
        assert(cnv == 1);
-       mtor  << "REAL" << r<<'\n';
+       DOUT  << "REAL" << r<<'\n';
        yylval.real = r;
        return REAL;
 }
@@ -269,12 +295,12 @@ LYRICS            ({AA}|{NATIONAL})[^0-9 \t\n\f]*
 
 [{}]   {
 
-       mtor << "parens\n";
+       DOUT << "parens\n";
        return YYText()[0];
 }
 [*:=]          {
        char c = YYText()[0];
-       mtor << "misc char" <<c<<"\n";
+       DOUT << "misc char" <<c<<"\n";
        return c;
 }
 
@@ -324,20 +350,28 @@ My_lily_lexer::pop_state()
 int
 My_lily_lexer::scan_escaped_word(String str)
 {      
-       mtor << "\\word: `" << str<<"'\n";
+       DOUT << "\\word: `" << str<<"'\n";
        int l = lookup_keyword(str);
        if (l != -1) {
-               mtor << "(keyword)\n";
+               DOUT << "(keyword)\n";
                return l;
        }
        Identifier * id = lookup_identifier(str);
        if (id) {
-               mtor << "(identifier)\n";
+               DOUT << "(identifier)\n";
                yylval.id = id;
                return id->token_code_i_;
        }
+       if ( YYSTATE != notes ) {
+               Melodic_req * mel_l = lookup_melodic_req_l(str);
+               if (mel_l) {
+                   DOUT << "(notename)\n";
+                   yylval.melreq = mel_l;
+                   return NOTENAME_ID;
+               }
+       }
        LexerError( "Unknown escaped string: `" + str + "'");   
-       mtor << "(string)";
+       DOUT << "(string)";
        String *sp = new String( str);
        yylval.string=sp;
        return STRING;
@@ -346,26 +380,15 @@ My_lily_lexer::scan_escaped_word(String str)
 int
 My_lily_lexer::scan_bare_word(String str)
 {
-       mtor << "word: `" << str<< "'\n";       
+       DOUT << "word: `" << str<< "'\n";       
        if (YYSTATE == notes){
                Melodic_req * mel_l = lookup_melodic_req_l(str);
                if (mel_l) {
-                   mtor << "(notename)\n";
+                   DOUT << "(notename)\n";
                    yylval.melreq = mel_l;
                    return NOTENAME_ID;
                }
        }
-#if 0
-       if (YYSTATE != notes) {
-               // ugr. Should do this in note mode?
-       //              Identifier * id = lookup_identifier(str);
-               if (id) {
-                       mtor << "(identifier)\n";
-                       yylval.id = id;
-                       return id->token_code_i_;
-               }
-       }
-#endif
 
        yylval.string=new String( str );
        return STRING;
@@ -382,3 +405,29 @@ My_lily_lexer::lyric_state_b() const
 {
        return YY_START == lyrics;
 }
+
+void 
+My_lily_lexer::push_header_state() 
+{
+       yy_push_state(header);
+}
+
+void strip_trailing_white(String&s)
+{
+       int i=0;
+       for (;  i < s.length_i(); i++) 
+               if (!isspace(s[i]))
+                       break;
+
+       s = s.nomid_str(0, i);
+}
+void strip_leading_white(String&s)
+{
+       int i=s.length_i();     
+       while (i--) 
+               if (!isspace(s[i]))
+                       break;
+
+       s = s.left_str(i+1);
+
+}