]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/lexer.ll
2003 -> 2004
[lilypond.git] / lily / lexer.ll
index c658e7bf8acfe3de6b2fe13fa4292239840dfe8b..86b48b218d94feaf35ba3db7a98d1ea5366f865a 100644 (file)
@@ -4,7 +4,7 @@
 
   source file of the LilyPond music typesetter
 
-  (c) 1996--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1996--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
            Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
@@ -47,7 +47,7 @@ using namespace std;
 #include "main.hh"
 #include "version.hh"
 #include "lilypond-input-version.hh"
-#include "translator-def.hh"
+#include "context-def.hh"
 #include "identifier-smob.hh"
 
 /*
@@ -180,6 +180,7 @@ HYPHEN              --
 
        yy_pop_state();
        this->here_input().source_file_->name_ = s;
+       progress_indication (_f("\nRenamed input to `%s'", s.to_str0()));
        scm_module_define (gh_car (scopes_),
                     ly_symbol2scm ("input-file-name"),
                     scm_makfrom0str (s.to_str0()));
@@ -205,6 +206,7 @@ HYPHEN              --
        }
        <<EOF>>         {
                LexerError (_ ("EOF found inside a comment").to_str0 ());
+               main_input_b_ = false;
                if (! close_input ()) 
                  yyterminate (); // can't move this, since it actually rets a YY_NULL
        }
@@ -218,7 +220,7 @@ HYPHEN              --
                main_input_b_ = true;
        }
        else
-               error (_ ("\\maininput disallowed outside init files"));
+               error (_ ("\\maininput not allowed outside init files"));
 }
 
 <INITIAL,chords,lyrics,figures,notes>\\include           {
@@ -285,17 +287,14 @@ HYPHEN            --
        //char const* s = YYText () + 1;
        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;
-       }
-       SCM sval = ly_parse_scm (s, &n, here_input());
+       SCM sval = ly_parse_scm (s, &n, here_input (),
+               safe_global_b && main_input_b_);
+
        if (sval == SCM_UNDEFINED)
-               {
+       {
                sval = SCM_UNSPECIFIED;
                errorlevel_ = 1;
-               }
+       }
 
        for (int i=0; i < n; i++)
        {
@@ -483,6 +482,8 @@ HYPHEN              --
                        SCM tag = gh_cdr(s);
                        if (tag == ly_symbol2scm("markup0"))
                                return MARKUP_HEAD_MARKUP0;
+                       if (tag == ly_symbol2scm("empty"))
+                               return MARKUP_HEAD_EMPTY;
                        else if (tag == ly_symbol2scm ("markup0-markup1"))
                                return MARKUP_HEAD_MARKUP0_MARKUP1;
                        else if (tag == ly_symbol2scm ("markup-list0"))
@@ -526,8 +527,7 @@ HYPHEN              --
 }
 
 <<EOF>> {
-
-
+       main_input_b_ = false;
        if (! close_input ()) { 
          yyterminate (); // can't move this, since it actually rets a YY_NULL
        }
@@ -606,8 +606,9 @@ HYPHEN              --
 %%
 
 void
-My_lily_lexer::push_note_state ()
+My_lily_lexer::push_note_state (SCM tab)
 {
+       pitchname_tab_stack_ = gh_cons (tab, pitchname_tab_stack_);
        yy_push_state (notes);
 }
 
@@ -617,8 +618,9 @@ My_lily_lexer::push_figuredbass_state()
        yy_push_state (figures);
 }
 void
-My_lily_lexer::push_chord_state ()
+My_lily_lexer::push_chord_state (SCM tab)
 {
+       pitchname_tab_stack_ = gh_cons (tab, pitchname_tab_stack_);
        yy_push_state (chords);
 }
 
@@ -637,6 +639,8 @@ My_lily_lexer::push_markup_state ()
 void
 My_lily_lexer::pop_state ()
 {
+       if (YYSTATE == notes || YYSTATE == chords)
+               pitchname_tab_stack_ = gh_cdr (pitchname_tab_stack_);
        yy_pop_state ();
 }
 
@@ -653,7 +657,7 @@ My_lily_lexer::scan_escaped_word (String str)
 {
        // use more SCM for this.
 
-       SCM sym = ly_symbol2scm (str.to_str0 ());
+//     SCM sym = ly_symbol2scm (str.to_str0 ());
 
        int l = lookup_keyword (str);
        if (l != -1) {
@@ -666,15 +670,6 @@ My_lily_lexer::scan_escaped_word (String str)
                return identifier_type (sid);
        }
 
-       if ((YYSTATE != notes) && (YYSTATE != chords)) {
-               SCM pitch = scm_hashq_get_handle (pitchname_tab_, sym);
-               
-               if (gh_pair_p (pitch))
-               {
-                       yylval.scm = ly_cdr (pitch);
-                       return NOTENAME_PITCH;
-               }
-       }
        String msg (_f ("unknown escaped string: `\\%s'", str));        
        LexerError (msg.to_str0 ());
 
@@ -688,13 +683,20 @@ My_lily_lexer::scan_bare_word (String str)
 {
        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)) {
-                   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)
+               SCM handle = SCM_BOOL_F;
+               if (gh_pair_p (pitchname_tab_stack_))
+                       handle = scm_hashq_get_handle (gh_car (pitchname_tab_stack_), sym);
+               
+               if (gh_pair_p (handle)) {
+                       yylval.scm = ly_cdr (handle);
+                       if (unsmob_pitch (yylval.scm)) 
+                           return (YYSTATE == notes) ? NOTENAME_PITCH : TONICNAME_PITCH;
+                       else if (gh_symbol_p (yylval.scm))
+                           return DRUM_PITCH;
+               }
+               else if ((handle = scm_hashq_get_handle (chordmodifier_tab_, sym))!= SCM_BOOL_F)
                {
-                   yylval.scm = ly_cdr (pitch);
+                   yylval.scm = ly_cdr (handle);
                    return CHORD_MODIFIER;
                }
        }