]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
* VERSION (MY_PATCH_LEVEL): make 1.7.0
[lilypond.git] / lily / lexer.ll
index 7bff8df6f4b16026132d488f5d397afcd9e29e86..48d8c3564048cdac9e594947b7161ebfac8c5bd8 100644 (file)
 
 #include <stdio.h>
 #include <ctype.h>
-#include <iostream.h> /* gcc 3.0 */
 #include <errno.h>
 
+#include <iostream>
 
+#include "parse-scm.hh"
 #include "score.hh"
 #include "lily-guile.hh"
 #include "string.hh"
 #include "string-convert.hh"
 #include "my-lily-lexer.hh"
-#include "array.hh"
+#include "input-file-results.hh"
 #include "interval.hh"
 #include "lily-guile.hh"
 #include "parser.hh"
-#include "debug.hh"
+#include "warn.hh"
 #include "main.hh"
 #include "musical-request.hh"
 #include "version.hh"
@@ -65,7 +66,7 @@ valid_version_b (String s);
        yylval.string = new String
 
 #define yylval \
-       (*(YYSTYPE*)lexval_l)
+       (*(YYSTYPE*)lexval)
 
 #define YY_USER_ACTION add_lexed_char (YYLeng ());
 /*
@@ -76,6 +77,8 @@ LYRICS                ({AA}|{TEX})[^0-9 \t\n\f]*
 
 
 SCM scan_fraction (String);
+SCM (* scm_parse_error_handler) (void *);
+
 
 %}
 
@@ -110,6 +113,7 @@ WORD                {A}{AN}*
 ALPHAWORD      {A}+
 DIGIT          {N}
 UNSIGNED       {N}+
+E_UNSIGNED     \\{N}+
 FRACTION       {N}+\/{N}+
 INT            -?{UNSIGNED}
 REAL           ({INT}\.{N}*)|(-?\.{N}+)
@@ -152,7 +156,7 @@ HYPHEN              --
 }
 <version>\"[^"]*\"     { /* got the version number */
        String s (YYText ()+1);
-       s = s.left_str (s.index_last_i ('"'));
+       s = s.left_string (s.index_last ('"'));
 
        yy_pop_state ();
        if (!valid_version_b (s))
@@ -172,7 +176,7 @@ HYPHEN              --
                yy_pop_state ();
        }
        <<EOF>>         {
-               LexerError (_ ("EOF found inside a comment").ch_C ());
+               LexerError (_ ("EOF found inside a comment").to_str0 ());
                if (! close_input ()) 
                  yyterminate (); // can't move this, since it actually rets a YY_NULL
        }
@@ -194,37 +198,37 @@ HYPHEN            --
 }
 <incl>\"[^"]*\";?   { /* got the include file name */
        String s (YYText ()+1);
-       s = s.left_str (s.index_last_i ('"'));
+       s = s.left_string (s.index_last ('"'));
 
-       new_input (s,source_global_l);
+       new_input (s, &global_input_file->sources_ );
        yy_pop_state ();
 }
 <incl>\\{BLACK}*;?{WHITE} { /* got the include identifier */
        String s = YYText () + 1;
        strip_trailing_white (s);
-       if (s.length_i () && (s[s.length_i () - 1] == ';'))
-         s = s.left_str (s.length_i () - 1);
+       if (s.length () && (s[s.length () - 1] == ';'))
+         s = s.left_string (s.length () - 1);
 
        SCM sid = lookup_identifier (s);
        if (gh_string_p (sid)) {
-               new_input (ly_scm2string (sid), source_global_l);
+               new_input (ly_scm2string (sid), &global_input_file->sources_);
                yy_pop_state ();
        } else { 
            String msg (_f ("wrong or undefined identifier: `%s'", s ));
 
-           LexerError (msg.ch_C ());
+           LexerError (msg.to_str0 ());
            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;
+       error (_ ("Missing end quote"));
        exit (1);
 }
 <chords,notes,figures>{RESTNAME}       {
        const char *s = YYText ();
-       yylval.scm = ly_str02scm (s);
+       yylval.scm = scm_makfrom0str (s);
        return RESTNAME;
 }
 <chords,notes,figures>R                {
@@ -232,33 +236,33 @@ HYPHEN            --
 }
 <INITIAL,chords,lyrics,notes,figures>\\\${BLACK}*{WHITE}       {
        String s=YYText () + 2;
-       s=s.left_str (s.length_i () - 1);
+       s=s.left_string (s.length () - 1);
        return scan_escaped_word (s); 
 }
 <INITIAL,chords,lyrics,notes,figures>\${BLACK}*{WHITE}         {
        String s=YYText () + 1;
-       s=s.left_str (s.length_i () - 1);
+       s=s.left_string (s.length () - 1);
        return scan_bare_word (s);
 }
 <INITIAL,chords,lyrics,notes,figures>\\\${BLACK}*              { // backup rule
-       cerr << _ ("white expected") << endl;
+       error (_("white expected"));
        exit (1);
 }
 <INITIAL,chords,lyrics,notes,figures>\${BLACK}*                { // backup rule
-       cerr << _ ("white expected") << endl;
+       error (_("white expected"));
        exit (1);
 }
 
 <INITIAL,chords,lyrics,notes,figures># { //embedded scm
        //char const* s = YYText () + 1;
-       char const* s = here_ch_C ();
+       char const* s = here_str0 ();
        int n = 0;
        if (main_input_b_ && safe_global_b) {
                error (_ ("Can't evaluate Scheme in safe mode"));
                yylval.scm =  SCM_EOL;
                return SCM_T;
        }
-       yylval.scm = ly_parse_scm (s, &n);
+       yylval.scm = ly_parse_scm (s, &n, here_input());
        
        for (int i=0; i < n; i++)
        {
@@ -272,12 +276,6 @@ HYPHEN             --
        _       {
                return FIGURE_SPACE;
        }
-       \]      {
-               return FIGURE_BRACKET_CLOSE;
-       }
-       \[      {
-               return FIGURE_BRACKET_OPEN;
-       }
        \>              {
                return FIGURE_CLOSE;
        }
@@ -299,13 +297,17 @@ HYPHEN            --
        }
 
        {DIGIT}         {
-               yylval.i = String_convert::dec2_i (String (YYText ()));
+               yylval.i = String_convert::dec2int (String (YYText ()));
                return DIGIT;
        }
        {UNSIGNED}              {
-               yylval.i = String_convert::dec2_i (String (YYText ()));
+               yylval.i = String_convert::dec2int (String (YYText ()));
                return UNSIGNED;
        }
+       {E_UNSIGNED}    {
+               yylval.i = String_convert::dec2int (String (YYText () +1));
+               return E_UNSIGNED;
+       }
 
        \" {
                start_quote ();
@@ -317,7 +319,7 @@ HYPHEN              --
 }
 <quote>{
        \\{ESCAPED}     {
-               *yylval.string += to_str (escaped_char (YYText ()[1]));
+               *yylval.string += to_string (escaped_char (YYText ()[1]));
        }
        [^\\"]+ {
                *yylval.string += YYText ();
@@ -328,7 +330,7 @@ HYPHEN              --
 
                /* yylval is union. Must remember STRING before setting SCM*/
                String *sp = yylval.string;
-               yylval.scm = ly_str02scm (sp->ch_C ());
+               yylval.scm = scm_makfrom0str (sp->to_str0 ());
                delete sp;
                return STRING;
        }
@@ -346,7 +348,7 @@ HYPHEN              --
                return FRACTION;
        }
        {UNSIGNED}              {
-               yylval.i = String_convert::dec2_i (String (YYText ()));
+               yylval.i = String_convert::dec2int (String (YYText ()));
                return UNSIGNED;
        }
        {NOTECOMMAND}   {
@@ -361,11 +363,11 @@ HYPHEN            --
                        return yylval.i = HYPHEN;
                s = lyric_fudge (s);
 
-               char c = s[s.length_i () - 1];
+               char c = s[s.length () - 1];
                if (c == '{' ||  c == '}') // brace open is for not confusing dumb tools.
                        here_input ().warning (
-                               _ ("Brace found at end of lyric. Did you forget a space?"));
-               yylval.scm = ly_str02scm (s.ch_C ());
+                               _ ("Brace found at end of lyric.  Did you forget a space?"));
+               yylval.scm = scm_makfrom0str (s.to_str0 ());
 
 
                return STRING;
@@ -386,7 +388,7 @@ HYPHEN              --
                return FRACTION;
        }
        {UNSIGNED}              {
-               yylval.i = String_convert::dec2_i (String (YYText ()));
+               yylval.i = String_convert::dec2int (String (YYText ()));
                return UNSIGNED;
        }
        \" {
@@ -401,6 +403,9 @@ HYPHEN              --
        \/\+ {
                return CHORD_BASS;
        }
+       \/  {
+               return CHORD_SLASH;
+       }
        \^  {
                return CHORD_CARET;
        }
@@ -434,10 +439,11 @@ HYPHEN            --
 }
 
 {UNSIGNED}     {
-       yylval.i = String_convert::dec2_i (String (YYText ()));
+       yylval.i = String_convert::dec2int (String (YYText ()));
        return UNSIGNED;
 }
 
+
 [{}]   {
 
        return YYText ()[0];
@@ -466,10 +472,15 @@ HYPHEN            --
        return E_OPEN;
     case ')':
        return E_CLOSE;
+    case '[':
+       return E_LEFTSQUARE;
+    case ']':
+       return E_RIGHTSQUARE;
     case '~':
        return E_TILDE;
     case '\\':
        return E_BACKSLASH;
+
     default:
        return E_CHAR;
     }
@@ -477,7 +488,7 @@ HYPHEN              --
 
 <*>.           {
        String msg = _f ("invalid character: `%c'", YYText ()[0]);
-       LexerError (msg.ch_C ());
+       LexerError (msg.to_str0 ());
        return YYText ()[0];
 }
 
@@ -517,7 +528,7 @@ My_lily_lexer::scan_escaped_word (String str)
 {
        // use more SCM for this.
 
-       SCM sym = ly_symbol2scm (str.ch_C ());
+       SCM sym = ly_symbol2scm (str.to_str0 ());
 
        int l = lookup_keyword (str);
        if (l != -1) {
@@ -563,9 +574,9 @@ My_lily_lexer::scan_escaped_word (String str)
                }
        }
        String msg (_f ("unknown escaped string: `\\%s'", str));        
-       LexerError (msg.ch_C ());
+       LexerError (msg.to_str0 ());
 
-       yylval.scm = ly_str02scm (str.ch_C ());
+       yylval.scm = scm_makfrom0str (str.to_str0 ());
 
        return STRING;
 }
@@ -573,7 +584,7 @@ My_lily_lexer::scan_escaped_word (String str)
 int
 My_lily_lexer::scan_bare_word (String str)
 {
-       SCM sym = ly_symbol2scm (str.ch_C ());
+       SCM sym = ly_symbol2scm (str.to_str0 ());
        if ((YYSTATE == notes) || (YYSTATE == chords)) {
                SCM pitch = scm_hashq_get_handle (pitchname_tab_, sym);
                if (gh_pair_p (pitch)) {
@@ -586,7 +597,7 @@ My_lily_lexer::scan_bare_word (String str)
                }
        }
 
-       yylval.scm = ly_str02scm (str.ch_C ());
+       yylval.scm = scm_makfrom0str (str.to_str0 ());
        return STRING;
 }
 
@@ -622,34 +633,28 @@ void
 strip_leading_white (String&s)
 {
        int i=0;
-       for (;  i < s.length_i (); i++) 
+       for (;  i < s.length (); i++) 
                if (!isspace (s[i]))
                        break;
 
-       s = s.nomid_str (0, i);
+       s = s.nomid_string (0, i);
 }
 
 void
 strip_trailing_white (String&s)
 {
-       int i=s.length_i ();    
+       int i=s.length ();      
        while (i--) 
                if (!isspace (s[i]))
                        break;
 
-       s = s.left_str (i+1);
+       s = s.left_string (i+1);
 }
 
 
 
-Lilypond_version oldest_version ("1.3.59");
-
-void
-print_lilypond_versions (ostream &os)
-{
-  os << _f ("Oldest supported input version: %s", oldest_version.str ()) 
-    << endl;
-}
+/* 1.3.146 == removal of ; */ 
+Lilypond_version oldest_version ("1.3.146");
 
 
 bool
@@ -659,8 +664,8 @@ valid_version_b (String s)
   Lilypond_version ver (s);
   if (! ((ver >= oldest_version) && (ver <= current)))
        {       
-               non_fatal_error (_f ("incorrect lilypond version: %s (%s, %s)", ver.str (), oldest_version.str (), current.str ()));
-               non_fatal_error (_ ("Consider converting the input with the convert-ly script")); 
+               non_fatal_error (_f ("Incorrect lilypond version: %s (%s, %s)", ver.string (), oldest_version.string (), current.string ()));
+               non_fatal_error (_ ("Consider updating the input with the convert-ly script")); 
                return false;
     }
   return true;
@@ -670,7 +675,7 @@ valid_version_b (String s)
 String
 lyric_fudge (String s)
 {
-  char  * chars  =s.copy_ch_p ();
+  char  * chars  =s.get_copy_str0 ();
 
   for (char * p = chars; *p ; p++)
     {
@@ -682,10 +687,10 @@ lyric_fudge (String s)
   delete[] chars;
 
   int i =0;    
-  if ((i=s.index_i ("\\,")) != -1)   // change "\," to TeX's "\c "
+  if ((i=s.index ("\\,")) != -1)   // change "\," to TeX's "\c "
     {
-      * (s.ch_l () + i + 1) = 'c';
-      s = s.left_str (i+2) + " " + s.right_str (s.length_i ()-i-2);
+      * (s.get_str0 () + i + 1) = 'c';
+      s = s.left_string (i+2) + " " + s.right_string (s.length ()-i-2);
     }
 
   return s;
@@ -697,13 +702,13 @@ 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 i = frac.index ('/');
+       int l = frac.length ();
+       String left = frac.left_string (i);
+       String right = frac.right_string (l - i - 1);
 
-       int n = String_convert::dec2_i (left);
-       int d = String_convert::dec2_i (right);
+       int n = String_convert::dec2int (left);
+       int d = String_convert::dec2int (right);
        return gh_cons (gh_int2scm (n), gh_int2scm (d));
 }