]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
release: 1.5.35
[lilypond.git] / lily / lexer.ll
index 7deca514b0a9e5aebb3944ebba3e64f7ffcc3173..7bff8df6f4b16026132d488f5d397afcd9e29e86 100644 (file)
@@ -24,6 +24,9 @@
 
 #include <stdio.h>
 #include <ctype.h>
+#include <iostream.h> /* gcc 3.0 */
+#include <errno.h>
+
 
 #include "score.hh"
 #include "lily-guile.hh"
@@ -71,6 +74,9 @@ LYRICS                ({AA}|{TEX})[^0-9 \t\n\f]*
 
 */
 
+
+SCM scan_fraction (String);
+
 %}
 
 %option c++
@@ -87,6 +93,7 @@ LYRICS                ({AA}|{TEX})[^0-9 \t\n\f]*
 %x incl
 %x lyrics
 %x notes
+%x figures
 %x quote
 %x longcomment
 
@@ -95,7 +102,7 @@ A            [a-zA-Z]
 AA             {A}|_
 N              [0-9]
 AN             {AA}|{N}
-PUNCT          [?!:']
+PUNCT          [?!:'`]
 ACCENT         \\[`'"^]
 NATIONAL       [\001-\006\021-\027\031\036\200-\377]
 TEX            {AA}|-|{PUNCT}|{ACCENT}|{NATIONAL}
@@ -103,6 +110,7 @@ WORD                {A}{AN}*
 ALPHAWORD      {A}+
 DIGIT          {N}
 UNSIGNED       {N}+
+FRACTION       {N}+\/{N}+
 INT            -?{UNSIGNED}
 REAL           ({INT}\.{N}*)|(-?\.{N}+)
 KEYWORD                \\{WORD}
@@ -122,7 +130,7 @@ HYPHEN              --
        // windows-suck-suck-suck
 }
 
-<INITIAL,chords,incl,lyrics,notes>{
+<INITIAL,chords,incl,lyrics,notes,figures>{
   "%{" {
        yy_push_state (longcomment);
   }
@@ -139,13 +147,13 @@ HYPHEN            --
   }
 }
 
-<INITIAL,chords,lyrics,notes>\\version{WHITE}* {
+<INITIAL,chords,lyrics,notes,figures>\\version{WHITE}* {
        yy_push_state (version);
 }
-<version>\"[^"]*\";?   { /* got the include file name */
+<version>\"[^"]*\"     { /* got the version number */
        String s (YYText ()+1);
        s = s.left_str (s.index_last_i ('"'));
-       DEBUG_OUT << "#version `" << s << "'\n";
+
        yy_pop_state ();
        if (!valid_version_b (s))
                return INVALID;
@@ -171,7 +179,7 @@ HYPHEN              --
 }
 
 
-<INITIAL,chords,lyrics,notes>\\maininput           {
+<INITIAL,chords,lyrics,notes,figures>\\maininput           {
        if (!main_input_b_)
        {
                start_main_input ();
@@ -181,13 +189,13 @@ HYPHEN            --
                error (_ ("\\maininput disallowed outside init files"));
 }
 
-<INITIAL,chords,lyrics,notes>\\include           {
+<INITIAL,chords,lyrics,figures,notes>\\include           {
        yy_push_state (incl);
 }
 <incl>\"[^"]*\";?   { /* got the include file name */
        String s (YYText ()+1);
        s = s.left_str (s.index_last_i ('"'));
-       DEBUG_OUT << "#include `" << s << "'\n";
+
        new_input (s,source_global_l);
        yy_pop_state ();
 }
@@ -196,48 +204,52 @@ HYPHEN            --
        strip_trailing_white (s);
        if (s.length_i () && (s[s.length_i () - 1] == ';'))
          s = s.left_str (s.length_i () - 1);
-       DEBUG_OUT << "#include `\\" << s << "'\n";
+
        SCM sid = lookup_identifier (s);
        if (gh_string_p (sid)) {
                new_input (ly_scm2string (sid), source_global_l);
                yy_pop_state ();
        } else { 
-           String msg (_f ("wrong or undefined identifier: `%s'", s ));        
+           String msg (_f ("wrong or undefined identifier: `%s'", s ));
+
            LexerError (msg.ch_C ());
+           SCM err = scm_current_error_port ();
+           scm_puts ("This value was found in the table: ", err);
+           scm_display (sid, err);
          }
 }
 <incl>\"[^"]*   { // backup rule
        cerr << _ ("Missing end quote") << endl;
        exit (1);
 }
-<chords,notes>{RESTNAME}       {
+<chords,notes,figures>{RESTNAME}       {
        const char *s = YYText ();
        yylval.scm = ly_str02scm (s);
        return RESTNAME;
 }
-<chords,notes>R                {
+<chords,notes,figures>R                {
        return MULTI_MEASURE_REST;
 }
-<INITIAL,chords,lyrics,notes>\\\${BLACK}*{WHITE}       {
+<INITIAL,chords,lyrics,notes,figures>\\\${BLACK}*{WHITE}       {
        String s=YYText () + 2;
        s=s.left_str (s.length_i () - 1);
        return scan_escaped_word (s); 
 }
-<INITIAL,chords,lyrics,notes>\${BLACK}*{WHITE}         {
+<INITIAL,chords,lyrics,notes,figures>\${BLACK}*{WHITE}         {
        String s=YYText () + 1;
        s=s.left_str (s.length_i () - 1);
        return scan_bare_word (s);
 }
-<INITIAL,chords,lyrics,notes>\\\${BLACK}*              { // backup rule
+<INITIAL,chords,lyrics,notes,figures>\\\${BLACK}*              { // backup rule
        cerr << _ ("white expected") << endl;
        exit (1);
 }
-<INITIAL,chords,lyrics,notes>\${BLACK}*                { // backup rule
+<INITIAL,chords,lyrics,notes,figures>\${BLACK}*                { // backup rule
        cerr << _ ("white expected") << endl;
        exit (1);
 }
 
-<INITIAL,chords,lyrics,notes># { //embedded scm
+<INITIAL,chords,lyrics,notes,figures># { //embedded scm
        //char const* s = YYText () + 1;
        char const* s = here_ch_C ();
        int n = 0;
@@ -256,7 +268,24 @@ HYPHEN             --
 
        return SCM_T;
 }
-<notes>{
+<figures>{
+       _       {
+               return FIGURE_SPACE;
+       }
+       \]      {
+               return FIGURE_BRACKET_CLOSE;
+       }
+       \[      {
+               return FIGURE_BRACKET_OPEN;
+       }
+       \>              {
+               return FIGURE_CLOSE;
+       }
+       \<      {
+               return FIGURE_OPEN;
+       }
+}
+<notes,figures>{
        {ALPHAWORD}     {
                return scan_bare_word (YYText ());
        }
@@ -264,6 +293,10 @@ HYPHEN             --
        {NOTECOMMAND}   {
                return scan_escaped_word (YYText () + 1); 
        }
+       {FRACTION}      {
+               yylval.scm =  scan_fraction (YYText ());
+               return FRACTION;
+       }
 
        {DIGIT}         {
                yylval.i = String_convert::dec2_i (String (YYText ()));
@@ -290,7 +323,7 @@ HYPHEN              --
                *yylval.string += YYText ();
        }
        \"      {
-               DEBUG_OUT << "quoted string: `" << *yylval.string << "'\n";
+
                yy_pop_state ();
 
                /* yylval is union. Must remember STRING before setting SCM*/
@@ -308,6 +341,10 @@ HYPHEN             --
        \" {
                start_quote ();
        }
+       {FRACTION}      {
+               yylval.scm =  scan_fraction (YYText ());
+               return FRACTION;
+       }
        {UNSIGNED}              {
                yylval.i = String_convert::dec2_i (String (YYText ()));
                return UNSIGNED;
@@ -330,7 +367,7 @@ HYPHEN              --
                                _ ("Brace found at end of lyric. Did you forget a space?"));
                yylval.scm = ly_str02scm (s.ch_C ());
 
-               DEBUG_OUT << "lyric : `" << s << "'\n";
+
                return STRING;
        }
        . {
@@ -344,6 +381,10 @@ HYPHEN             --
        {NOTECOMMAND}   {
                return scan_escaped_word (YYText () + 1);
        }
+       {FRACTION}      {
+               yylval.scm =  scan_fraction (YYText ());
+               return FRACTION;
+       }
        {UNSIGNED}              {
                yylval.i = String_convert::dec2_i (String (YYText ()));
                return UNSIGNED;
@@ -369,7 +410,7 @@ HYPHEN              --
 }
 
 <<EOF>> {
-       DEBUG_OUT << "<<eof>>";
+
 
        if (! close_input ()) { 
          yyterminate (); // can't move this, since it actually rets a YY_NULL
@@ -387,8 +428,8 @@ HYPHEN              --
        Real r;
        int cnv=sscanf (YYText (), "%lf", &r);
        assert (cnv == 1);
-       DEBUG_OUT  << "REAL" << r<<'\n';
-       yylval.real = r;
+
+       yylval.scm = gh_double2scm (r);
        return REAL;
 }
 
@@ -398,20 +439,20 @@ HYPHEN            --
 }
 
 [{}]   {
-       DEBUG_OUT << "parens\n";
+
        return YYText ()[0];
 }
 [*:=]          {
        char c = YYText ()[0];
-       DEBUG_OUT << "misc char" <<c<<"\n";
+
        return c;
 }
 
-<INITIAL,notes>.       {
+<INITIAL,notes,figures>.       {
        return YYText ()[0];
 }
 
-<INITIAL,lyrics,notes>\\. {
+<INITIAL,lyrics,notes,figures>\\. {
     char c= YYText ()[1];
 
     switch (c) {
@@ -425,6 +466,10 @@ HYPHEN             --
        return E_OPEN;
     case ')':
        return E_CLOSE;
+    case '~':
+       return E_TILDE;
+    case '\\':
+       return E_BACKSLASH;
     default:
        return E_CHAR;
     }
@@ -444,6 +489,11 @@ My_lily_lexer::push_note_state ()
        yy_push_state (notes);
 }
 
+void
+My_lily_lexer::push_figuredbass_state()
+{
+       yy_push_state (figures);
+}
 void
 My_lily_lexer::push_chord_state ()
 {
@@ -508,7 +558,7 @@ My_lily_lexer::scan_escaped_word (String str)
                
                if (gh_pair_p (pitch))
                {
-                       yylval.scm = gh_cdr (pitch);
+                       yylval.scm = ly_cdr (pitch);
                        return NOTENAME_PITCH;
                }
        }
@@ -527,11 +577,11 @@ My_lily_lexer::scan_bare_word (String str)
        if ((YYSTATE == notes) || (YYSTATE == chords)) {
                SCM pitch = scm_hashq_get_handle (pitchname_tab_, sym);
                if (gh_pair_p (pitch)) {
-                   yylval.scm = gh_cdr (pitch);
+                   yylval.scm = ly_cdr (pitch);
                     return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH;
                } else if ((pitch = scm_hashq_get_handle (chordmodifier_tab_, sym))!= SCM_BOOL_F)
                {
-                   yylval.scm = gh_cdr (pitch);
+                   yylval.scm = ly_cdr (pitch);
                    return CHORDMODIFIER_PITCH;
                }
        }
@@ -558,6 +608,12 @@ My_lily_lexer::lyric_state_b () const
        return YY_START == lyrics;
 }
 
+bool
+My_lily_lexer::figure_state_b () const
+{
+       return YY_START == figures;
+}
+
 /*
  urg, belong to String (_convert)
  and should be generalised 
@@ -586,6 +642,15 @@ strip_trailing_white (String&s)
 
 
 
+Lilypond_version oldest_version ("1.3.59");
+
+void
+print_lilypond_versions (ostream &os)
+{
+  os << _f ("Oldest supported input version: %s", oldest_version.str ()) 
+    << endl;
+}
+
 
 bool
 valid_version_b (String s)
@@ -625,3 +690,20 @@ lyric_fudge (String s)
 
   return s;
 }
+
+/*
+Convert "NUM/DEN" into a '(NUM . DEN) cons.
+*/
+SCM
+scan_fraction (String frac)
+{
+       int i = frac.index_i ('/');
+       int l = frac.length_i ();
+       String left = frac.left_str (i);
+       String right = frac.right_str (l - i - 1);
+
+       int n = String_convert::dec2_i (left);
+       int d = String_convert::dec2_i (right);
+       return gh_cons (gh_int2scm (n), gh_int2scm (d));
+}
+