]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
release: 1.4.12
[lilypond.git] / lily / lexer.ll
index d8646ab67325d08da0f5a99cd8f8597dd9c3b257..ea40d1d8caa5c2cfbc84ceba46b0c75a8c37ebe8 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++
@@ -95,7 +101,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 +109,7 @@ WORD                {A}{AN}*
 ALPHAWORD      {A}+
 DIGIT          {N}
 UNSIGNED       {N}+
+FRACTION       {N}+\/{N}+
 INT            -?{UNSIGNED}
 REAL           ({INT}\.{N}*)|(-?\.{N}+)
 KEYWORD                \\{WORD}
@@ -142,7 +149,7 @@ HYPHEN              --
 <INITIAL,chords,lyrics,notes>\\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 ('"'));
 
@@ -202,8 +209,12 @@ 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
@@ -264,6 +275,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 +323,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 +363,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 +411,7 @@ HYPHEN              --
        int cnv=sscanf (YYText (), "%lf", &r);
        assert (cnv == 1);
 
-       yylval.real = r;
+       yylval.scm = gh_double2scm (r);
        return REAL;
 }
 
@@ -421,6 +444,8 @@ HYPHEN              --
        return E_SMALLER;
     case '!':
        return E_EXCLAMATION;
+    case '\\':
+       return E_BACKSLASH;
     case '(':
        return E_OPEN;
     case ')':
@@ -586,6 +611,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 +659,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));
+}
+