]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
''
[lilypond.git] / lily / lexer.ll
index 01a2cf6c700edb794c01aa3ebb23eb20e235f842..423e437b20340db07d1069cbe41325d6a13ddff4 100644 (file)
@@ -25,6 +25,8 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <iostream.h> /* gcc 3.0 */
+#include <errno.h>
+
 
 #include "score.hh"
 #include "lily-guile.hh"
@@ -72,6 +74,9 @@ LYRICS                ({AA}|{TEX})[^0-9 \t\n\f]*
 
 */
 
+
+SCM scan_fraction (String);
+
 %}
 
 %option c++
@@ -88,6 +93,7 @@ LYRICS                ({AA}|{TEX})[^0-9 \t\n\f]*
 %x incl
 %x lyrics
 %x notes
+%x figures
 %x quote
 %x longcomment
 
@@ -96,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}
@@ -104,6 +110,7 @@ WORD                {A}{AN}*
 ALPHAWORD      {A}+
 DIGIT          {N}
 UNSIGNED       {N}+
+FRACTION       {N}+\/{N}+
 INT            -?{UNSIGNED}
 REAL           ({INT}\.{N}*)|(-?\.{N}+)
 KEYWORD                \\{WORD}
@@ -123,7 +130,7 @@ HYPHEN              --
        // windows-suck-suck-suck
 }
 
-<INITIAL,chords,incl,lyrics,notes>{
+<INITIAL,chords,incl,lyrics,notes,figures>{
   "%{" {
        yy_push_state (longcomment);
   }
@@ -140,7 +147,7 @@ HYPHEN              --
   }
 }
 
-<INITIAL,chords,lyrics,notes>\\version{WHITE}* {
+<INITIAL,chords,lyrics,notes,figures>\\version{WHITE}* {
        yy_push_state (version);
 }
 <version>\"[^"]*\"     { /* got the version number */
@@ -172,7 +179,7 @@ HYPHEN              --
 }
 
 
-<INITIAL,chords,lyrics,notes>\\maininput           {
+<INITIAL,chords,lyrics,notes,figures>\\maininput           {
        if (!main_input_b_)
        {
                start_main_input ();
@@ -182,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 */
@@ -215,34 +222,34 @@ HYPHEN            --
        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;
@@ -261,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 ());
        }
@@ -269,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 ()));
@@ -313,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;
@@ -349,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;
@@ -412,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) {
@@ -430,6 +460,10 @@ HYPHEN             --
        return E_OPEN;
     case ')':
        return E_CLOSE;
+    case '~':
+       return E_TILDE;
+    case '\\':
+       return E_BACKSLASH;
     default:
        return E_CHAR;
     }
@@ -449,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 ()
 {
@@ -513,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;
                }
        }
@@ -532,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;
                }
        }
@@ -563,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 
@@ -591,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)
@@ -630,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));
+}
+