]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
''
[lilypond.git] / lily / lexer.ll
index d8646ab67325d08da0f5a99cd8f8597dd9c3b257..423e437b20340db07d1069cbe41325d6a13ddff4 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,10 +147,10 @@ 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 ('"'));
 
@@ -171,7 +179,7 @@ HYPHEN              --
 }
 
 
-<INITIAL,chords,lyrics,notes>\\maininput           {
+<INITIAL,chords,lyrics,notes,figures>\\maininput           {
        if (!main_input_b_)
        {
                start_main_input ();
@@ -181,7 +189,7 @@ 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 */
@@ -202,42 +210,46 @@ HYPHEN            --
                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,18 @@ HYPHEN             --
 
        return SCM_T;
 }
-<notes>{
+<figures>{
+       _       {
+               return FIGURE_SPACE;
+       }
+       \>              {
+               return FIGURE_CLOSE;
+       }
+       \<      {
+               return FIGURE_OPEN;
+       }
+}
+<notes,figures>{
        {ALPHAWORD}     {
                return scan_bare_word (YYText ());
        }
@@ -264,6 +287,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 ()));
@@ -308,6 +335,10 @@ HYPHEN             --
        \" {
                start_quote ();
        }
+       {FRACTION}      {
+               yylval.scm =  scan_fraction (YYText ());
+               return FRACTION;
+       }
        {UNSIGNED}              {
                yylval.i = String_convert::dec2_i (String (YYText ()));
                return UNSIGNED;
@@ -344,6 +375,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;
@@ -388,7 +423,7 @@ HYPHEN              --
        int cnv=sscanf (YYText (), "%lf", &r);
        assert (cnv == 1);
 
-       yylval.real = r;
+       yylval.scm = gh_double2scm (r);
        return REAL;
 }
 
@@ -407,11 +442,11 @@ HYPHEN            --
        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 +460,10 @@ HYPHEN             --
        return E_OPEN;
     case ')':
        return E_CLOSE;
+    case '~':
+       return E_TILDE;
+    case '\\':
+       return E_BACKSLASH;
     default:
        return E_CHAR;
     }
@@ -444,6 +483,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 +552,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 +571,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 +602,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 +636,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 +684,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));
+}
+