]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
* lily/parser.yy (event_that_take_dir): allow postfix notation for ties.
[lilypond.git] / lily / parser.yy
index 4032b5ad8d2440543f1fc8de15e461fd21d584a1..d124c5095dec8c3b7c4f708120b1bfc4a1c4e9f1 100644 (file)
@@ -5,30 +5,60 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
            Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 /*
   Two shift/reduce problems:
-    -
-    -
+    - empty music-list
+    - empty pre-events
+
+
+
+(bullshit.
+
+s/r:
+
+1.     foo = bar.
+
+       "bar" -> String -> Lyric -> Music
+
+       "bar" -> String
+
+
+2.  \repeat
+       \repeat .. \alternative
+
+
+    \repeat { \repeat .. \alternative }
+
+or
+
+    \repeat { \repeat } \alternative 
+
+)
+
+--hwn
+
  */
 
 /*
 
-the rules for who is protecting what are very shady. TODO: uniformise
-this.
+TODO:
+
+* The rules for who is protecting what are very shady. Uniformise
+  this.
+
+* There are too many lexical modes. 
 
 
 */
 
-#include <iostream.h>
 #include <ctype.h>
 
 #include "translator-def.hh"
 #include "lily-guile.hh"
-#include "change-iterator.hh"
 #include "misc.hh"
 #include "my-lily-lexer.hh"
 #include "paper-def.hh"
@@ -37,30 +67,18 @@ this.
 #include "file-path.hh"
 #include "warn.hh"
 #include "dimensions.hh"
-#include "command-request.hh"
-#include "musical-request.hh"
 #include "my-lily-parser.hh"
-#include "context-specced-music.hh"
 #include "score.hh"
-#include "music-list.hh"
-#include "output-property-music-iterator.hh"
-#include "property-iterator.hh"
 #include "input-file-results.hh"
 #include "input.hh"
-#include "relative-music.hh"
-#include "lyric-combine-music.hh"
-#include "transposed-music.hh"
-#include "time-scaled-music.hh"
-#include "repeated-music.hh"
-#include "untransposable-music.hh"
 #include "lilypond-input-version.hh"
-#include "grace-music.hh"
-#include "part-combine-music.hh"
 #include "scm-hash.hh"
 #include "auto-change-iterator.hh"
-#include "un-relativable-music.hh"
 #include "chord.hh"
 #include "ly-modules.hh"
+#include "music-sequence.hh"
+#include "input-smob.hh"
+#include "event.hh"
 
 bool
 regular_identifier_b (SCM id)
@@ -78,6 +96,7 @@ regular_identifier_b (SCM id)
 }
 
 
+
 bool
 is_duration_b (int t)
 {
@@ -94,24 +113,8 @@ set_music_properties (Music *p, SCM a)
 }
 
 
-SCM make_music_proc;
-
-Music*
-parser_make_music (SCM sym)
-{
-       if (!make_music_proc)
-               make_music_proc = scm_primitive_eval (ly_symbol2scm ("make-music-by-name"));
-       
-       SCM rv = scm_call_1 (make_music_proc, sym);
-
-       /*
-       UGH.
-       */
-       scm_gc_protect_object (rv);
-       return unsmob_music (rv);
-}
 
-#define MY_MAKE_MUSIC(x)  parser_make_music (ly_symbol2scm (x))
+#define MY_MAKE_MUSIC(x)  make_music_by_name (ly_symbol2scm (x))
 
 Music* 
 set_property_music (SCM sym, SCM value)
@@ -132,6 +135,7 @@ set_property_music (SCM sym, SCM value)
 
 #define YYERROR_VERBOSE 1
 
+My_lily_parser* my_lily_parser;
 #define YYPARSE_PARAM my_lily_parser
 #define YYLEX_PARAM my_lily_parser
 #define THIS\
@@ -147,16 +151,11 @@ of the parse stack onto the heap. */
 
 
 %union {
-
-    Link_array<Music> *reqvec;
-
-    String *string; // needed by the lexer as temporary scratch area.
+       String * string;
     Music *music;
     Score *score;
-    Scheme_hash_table *scmhash;
     Music_output_def * outputdef;
     SCM scm;
-    Tempo_req *tempo;
     int i;
 }
 %{
@@ -168,6 +167,7 @@ yylex (YYSTYPE *s,  void * v)
        My_lily_lexer * lex = pars->lexer_;
 
        lex->lexval = (void*) s;
+       lex->prepare_for_next_token();
        return lex->yylex ();
 }
 
@@ -180,17 +180,13 @@ yylex (YYSTYPE *s,  void * v)
 %token AUTOCHANGE
 %token ALIAS
 %token APPLY
-%token ARPEGGIO
-%token DYNAMICSCRIPT
 %token ACCEPTS
 %token ALTERNATIVE
 %token BAR
 %token BREATHE
 %token CHORDMODIFIERS
 %token CHORDS
-%token CHAR_T
 %token CLEF
-%token CM_T
 %token CONSISTS
 %token DURATION
 %token SEQUENTIAL
@@ -198,22 +194,18 @@ yylex (YYSTYPE *s,  void * v)
 %token SIMULTANEOUS
 %token CONSISTSEND
 %token DENIES
-%token DURATION
 %token EXTENDER
 %token FIGURES FIGURE_OPEN FIGURE_CLOSE
 %token FIGURE_BRACKET_CLOSE FIGURE_BRACKET_OPEN
-%token GLISSANDO
 %token GRACE 
 %token HEADER
 %token HYPHEN
-%token IN_T
 %token INVALID
 %token KEY
 %token LYRICS
 %token MARK
 %token MULTI_MEASURE_REST
 %token MIDI
-%token MM_T
 %token PITCH
 %token DEFAULT
 %token NAME
@@ -222,10 +214,8 @@ yylex (YYSTYPE *s,  void * v)
 %token ONCE
 %token PAPER
 %token PARTIAL
-%token PENALTY
 %token PROPERTY
 %token OVERRIDE SET REVERT 
-%token PT_T
 %token RELATIVE
 %token REMOVE
 %token REPEAT
@@ -233,10 +223,8 @@ yylex (YYSTYPE *s,  void * v)
 %token PARTCOMBINE
 %token SCM_T
 %token SCORE
-%token SCRIPT
 %token SKIP
 %token SPANREQUEST
-%token STYLESHEET
 %token COMMANDSPANREQUEST
 %token TEMPO
 %token OUTPUTPROPERTY
@@ -249,6 +237,10 @@ yylex (YYSTYPE *s,  void * v)
 %token CONTEXT
 %token REST
 
+%token CHORD_OPEN
+%token CHORD_CLOSE
+
+
 /* escaped */
 %token E_CHAR E_EXCLAMATION E_SMALLER E_BIGGER E_OPEN E_CLOSE
 %token E_LEFTSQUARE E_RIGHTSQUARE E_TILDE
@@ -271,9 +263,8 @@ yylex (YYSTYPE *s,  void * v)
 
 %token <scm>   SCORE_IDENTIFIER
 %token <scm>   MUSIC_OUTPUT_DEF_IDENTIFIER
-
 %token <scm>   NUMBER_IDENTIFIER
-%token <scm>   REQUEST_IDENTIFIER
+%token <scm>   EVENT_IDENTIFIER
 %token <scm>   MUSIC_IDENTIFIER TRANSLATOR_IDENTIFIER
 %token <scm>   STRING_IDENTIFIER SCM_IDENTIFIER 
 %token <scm>   RESTNAME
@@ -284,10 +275,10 @@ yylex (YYSTYPE *s,  void * v)
 
 %type <outputdef> output_def
 %type <scm>    lilypond_header lilypond_header_body
-%type <music>  open_request_parens close_request_parens open_request close_request
-%type <music> request_with_dir request_that_take_dir verbose_request
+%type <music>  open_event_parens close_event_parens open_event close_event
+%type <music> event_with_dir event_that_take_dir verbose_event
 %type <i>      sub_quotes sup_quotes
-%type <music>  simple_element  request_chord command_element Simple_music  Composite_music 
+%type <music>  simple_element  event_chord command_element Simple_music  Composite_music 
 %type <music>  Repeated_music
 %type <scm>     Alternative_music
 %type <i>      tremolo_type
@@ -295,10 +286,12 @@ yylex (YYSTYPE *s,  void * v)
 %type <i>      script_dir
 %type <scm>    identifier_init 
 
+%type <music> note_chord_element chord_body chord_body_element
+%type <scm>  chord_body_elements 
 %type <scm> steno_duration optional_notemode_duration multiplied_duration
 %type <scm>  verbose_duration
        
-%type <reqvec>  pre_requests post_requests
+%type <scm>  pre_events post_events
 %type <music> gen_text_def
 %type <scm>   steno_pitch pitch absolute_pitch
 %type <scm>   explicit_pitch steno_tonic_pitch
@@ -315,17 +308,16 @@ yylex (YYSTYPE *s,  void * v)
 %type <scm> Music_list
 %type <outputdef>  music_output_def_body
 %type <music> shorthand_command_req
-%type <music>  post_reques
+%type <music>  post_even
 %type <music> command_req verbose_command_req
 %type <music>  extender_req
 %type <music> hyphen_req
-%type <music> string_request
+%type <music> string_event
 %type <scm>    string bare_number number_expression number_term number_factor 
-
 %type <score>  score_block score_body
 
 %type <scm>    translator_spec_block translator_spec_body
-%type <tempo>  tempo_request
+%type <music>  tempo_event
 %type <scm> notenames_body notenames_block chordmodifiers_block
 %type <scm>    script_abbreviation
 
@@ -370,9 +362,6 @@ toplevel_expression:
                else if (dynamic_cast<Midi_def*> ($1))
                        THIS->lexer_->set_identifier (scm_makfrom0str ("$defaultmidi"), $1->self_scm ());
        }
-       | embedded_scm {
-               // junk value
-       }       
        ;
 
 embedded_scm:
@@ -452,6 +441,7 @@ all objects can be unprotected as soon as they're here.
 
 */
        }
+       | embedded_scm { }
        ;
 
 
@@ -472,7 +462,7 @@ identifier_init:
                $$ = $1->self_scm ();
                scm_gc_unprotect_object ($$);
        }
-       | post_request {
+       | post_event {
                $$ = $1->self_scm ();
                scm_gc_unprotect_object ($$);
        }
@@ -499,7 +489,7 @@ translator_spec_block:
 
 translator_spec_body:
        TRANSLATOR_IDENTIFIER   {
-               $$ = unsmob_translator_def ($1)->clone_scm ();
+               $$ = $1;
                unsmob_translator_def ($$)-> set_spot (THIS->here_input ());
        }
        | TYPE STRING   {
@@ -590,7 +580,7 @@ score_body:
 
        }
        | SCORE_IDENTIFIER {
-               $$ = new Score (*unsmob_score ($1));
+               $$ = unsmob_score ($1);
                $$->set_spot (THIS->here_input ());
        }
        | score_body lilypond_header    {
@@ -636,21 +626,21 @@ music_output_def_body:
                        p = dynamic_cast<Paper_def*> (id->clone ());
                else
                        p = new Paper_def;
-               THIS-> lexer_->add_scope (p->scope_);
+
+               THIS->lexer_->add_scope (p->scope_);
                $$ = p;
        }
        | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER         {
-               Music_output_def *p = unsmob_music_output_def ($3);
-               p = p->clone ();
-               THIS->lexer_->add_scope (p->scope_);
-               $$ = p;
+               Music_output_def * o =  unsmob_music_output_def ($3);
+               $$ =o;
+
+               THIS->lexer_->add_scope (o->scope_);
        }
        | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER  {
-               Music_output_def *p = unsmob_music_output_def ($3);
-               p = p->clone ();
+               Music_output_def * o =  unsmob_music_output_def ($3);
+               $$ = o;
 
-               THIS->lexer_->add_scope (p->scope_);
-               $$ = p;
+               THIS->lexer_->add_scope (o->scope_);
        }
        | music_output_def_body assignment  {
 
@@ -658,10 +648,7 @@ music_output_def_body:
        | music_output_def_body translator_spec_block   {
                $$->assign_translator ($2);
        }
-       | music_output_def_body STYLESHEET embedded_scm {
-               dynamic_cast<Paper_def*> ($$)-> style_sheet_ = $3;
-       }
-       | music_output_def_body tempo_request  {
+       | music_output_def_body tempo_event  {
                /*
                        junk this ? there already is tempo stuff in
                        music.
@@ -670,14 +657,14 @@ music_output_def_body:
                Duration *d = unsmob_duration ($2->get_mus_property ("duration"));
                Midi_def * md = dynamic_cast<Midi_def*> ($$);
                if (md)
-                       md->set_tempo (d->length_mom (), m);
+                       md->set_tempo (d->get_length (), m);
        }
        | music_output_def_body error {
 
        }
        ;
 
-tempo_request:
+tempo_event:
        TEMPO steno_duration '=' bare_unsigned  {
                $$ = MY_MAKE_MUSIC("TempoEvent");
                $$->set_mus_property ("duration", $2);
@@ -692,12 +679,13 @@ The representation of a  list is the
 
  to have  efficient append.
 */
-Music_list: /* empty */ {
+Music_list:
+       /* empty */ {
                $$ = scm_cons (SCM_EOL, SCM_EOL);
        }
        | Music_list Music {
                SCM s = $$;
-               SCM c = scm_cons ($2->self_scm (), SCM_EOL);
+               SCM c = scm_cons ($2->self_scm (), SCM_EOL);
                scm_gc_unprotect_object ($2->self_scm ()); /* UGH */
                if (gh_pair_p (ly_cdr (s)))
                        gh_set_cdr_x (ly_cdr (s), c); /* append */
@@ -736,8 +724,15 @@ Repeated_music:
                    _("More alternatives than repeats.  Junking excess alternatives."));
                  alts = ly_truncate_list (times, alts);
                }
-               
-               Music *r = MY_MAKE_MUSIC("RepeatedMusic");
+
+
+               static SCM proc;
+               if (!proc)
+                       proc = scm_c_eval_string ("make-repeated-music");
+
+               SCM mus = scm_call_1 (proc, $2);
+               scm_gc_protect_object (mus); // UGH. 
+               Music *r =unsmob_music (mus);
                if (beg)
                        {
                        r-> set_mus_property ("element", beg->self_scm ());
@@ -746,9 +741,6 @@ Repeated_music:
                r->set_mus_property ("repeat-count", gh_int2scm (times >? 1));
 
                r-> set_mus_property ("elements",alts);
-               SCM func = scm_primitive_eval (ly_symbol2scm ("repeat-name-to-ctor"));
-               SCM result = gh_call1 (func, $2);
-
                if (gh_equal_p ($2, scm_makfrom0str ("tremolo")))
                {
                /*
@@ -761,9 +753,6 @@ Repeated_music:
                        else
                          gh_call3 (func, r->self_scm (), gh_int2scm(-intlog2 ($3)), gh_int2scm(0));
                }
-
-               set_music_properties (r, result);
-
                r->set_spot (*$4->origin ());
 
                $$ = r;
@@ -798,7 +787,7 @@ Simultaneous_music:
        ;
 
 Simple_music:
-       request_chord           { $$ = $1; }
+       event_chord             { $$ = $1; }
        | OUTPUTPROPERTY embedded_scm embedded_scm '=' embedded_scm     {
                SCM pred = $2;
                if (!gh_symbol_p ($3))
@@ -811,7 +800,7 @@ Simple_music:
                        THIS->parser_error (_ ("First argument must be a procedure taking one argument"));
                }
 
-       Music*m = MY_MAKE_MUSIC("OutputPropertySetMusic");
+               Music*m = MY_MAKE_MUSIC("OutputPropertySetMusic");
                m->set_mus_property ("predicate", pred);
                m->set_mus_property ("grob-property", $3);
                m->set_mus_property ("grob-value",  $5);
@@ -819,9 +808,7 @@ Simple_music:
                $$ = m;
        }
        | MUSIC_IDENTIFIER {
-               $$ = unsmob_music ($1)->clone ();
-
-               $$->set_spot (THIS->here_input());
+               $$ = unsmob_music ($1);
        }
        | property_def
        | translator_change
@@ -830,7 +817,7 @@ Simple_music:
 
 Composite_music:
        CONTEXT STRING Music    {
-       Music*csm =TYPED_MAKE_MUSIC("ContextSpeccedMusic");
+               Music*csm =MY_MAKE_MUSIC("ContextSpeccedMusic");
 
                csm->set_mus_property ("element", $3->self_scm ());
                scm_gc_unprotect_object ($3->self_scm ());
@@ -843,6 +830,7 @@ Composite_music:
        | AUTOCHANGE STRING Music       {
        Music*chm = MY_MAKE_MUSIC("AutoChangeMusic");
                chm->set_mus_property ("element", $3->self_scm ());
+               chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_proc);
 
                scm_gc_unprotect_object ($3->self_scm ());
                chm->set_mus_property ("what", $2); 
@@ -1081,7 +1069,6 @@ simple_property_def:
                  = gh_equal_p ($4, scm_makfrom0str ("autoBeamSettings"));
                bool itc = internal_type_checking_global_b;
                Music *t = MY_MAKE_MUSIC("OverrideProperty");
-
                t->set_mus_property ("symbol", scm_string_to_symbol ($4));
                t->set_mus_property ("pop-first", SCM_BOOL_T);
                if (autobeam)
@@ -1160,28 +1147,76 @@ scalar:
         ;
 
 
-request_chord:
-       pre_requests {
+event_chord:
+       pre_events {
                THIS->push_spot ();
-       } /*cont */ simple_element post_requests        {
-               Music_sequence *l = dynamic_cast<Music_sequence*> ($3);
-               
-               $1->concat (*$4);
-               for (int i=0; i < $1->size (); i++) {
-                 Music * m = $1->elem (i);
-                 l->append_music (m);
-               }
-               $$ = $3;
+       } /*cont */ simple_element post_events  {
+               SCM elts = $3-> get_mus_property ("elements");
+
+               elts = gh_append3 (elts, scm_reverse_x ($1, SCM_EOL),
+                                  scm_reverse_x ($4, SCM_EOL));
 
-               delete $1;
-               delete $4;
+               $3-> set_mus_property ("elements", elts);
+               $$ = $3;
        }
        | command_element
+       | note_chord_element
+       ;
+
+
+note_chord_element:
+       chord_body optional_notemode_duration post_events
+       {
+               SCM dur = unsmob_duration ($2)->smobbed_copy();
+               SCM es = $1->get_mus_property ("elements");
+               SCM postevs = scm_reverse_x ($3, SCM_EOL);
+
+               for (SCM s = es; gh_pair_p (s); s = gh_cdr (s))
+                 unsmob_music (gh_car(s))->set_mus_property ("duration", dur);
+               es = gh_append2 (es, postevs);
+
+               $1-> set_mus_property ("elements", es);
+               $$ = $1;
+       }
+       ;
+
+chord_body:
+       CHORD_OPEN chord_body_elements CHORD_CLOSE
+       {
+               $$ = MY_MAKE_MUSIC("EventChord");
+               $$->set_mus_property ("elements",
+                       scm_reverse_x ($2, SCM_EOL));
+       }
+       ;
+
+chord_body_elements:
+       /* empty */             { $$ = SCM_EOL; }
+       | chord_body_elements chord_body_element {
+               $$ = gh_cons ($2->self_scm(), $1);
+               scm_gc_unprotect_object ($2->self_scm());
+       }
+       ;
+
+chord_body_element:
+       pitch exclamations questions post_events
+       {
+               Music * n = MY_MAKE_MUSIC("NoteEvent");
+               n->set_mus_property ("pitch", $1);
+               if ($3 % 2)
+                       n->set_mus_property ("cautionary", SCM_BOOL_T);
+               if ($2 % 2 || $3 % 2)
+                       n->set_mus_property ("force-accidental", SCM_BOOL_T);
+
+               SCM arts = scm_reverse_x ($4, SCM_EOL);
+               n->set_mus_property ("articulations", arts);
+
+               $$ = n;
+       }
        ;
 
 command_element:
        command_req {
-               $$ = MY_MAKE_MUSIC("RequestChord");
+               $$ = MY_MAKE_MUSIC("EventChord");
                $$->set_mus_property ("elements", scm_cons ($1->self_scm (), SCM_EOL));
          scm_gc_unprotect_object ($1->self_scm());
 
@@ -1189,23 +1224,21 @@ command_element:
                $1-> set_spot (THIS->here_input ());
        }
        | E_LEFTSQUARE {
-               Music *l = MY_MAKE_MUSIC("SpanEvent");
+               Music *l = MY_MAKE_MUSIC("LigatureEvent");
                l->set_mus_property ("span-direction", gh_int2scm (START));
-               l->set_mus_property ("span-type", scm_makfrom0str ("ligature"));
                l->set_spot (THIS->here_input ());
 
-               $$ = MY_MAKE_MUSIC("RequestChord");
+               $$ = MY_MAKE_MUSIC("EventChord");
                $$->set_mus_property ("elements", scm_cons (l->self_scm (), SCM_EOL));
          scm_gc_unprotect_object (l->self_scm());
                $$->set_spot (THIS->here_input ());
        }
        | E_RIGHTSQUARE {
-               Music *l = MY_MAKE_MUSIC("SpanEvent");
+               Music *l = MY_MAKE_MUSIC("LigatureEvent");
                l->set_mus_property ("span-direction", gh_int2scm (STOP));
-               l->set_mus_property ("span-type", scm_makfrom0str ("ligature"));
                l->set_spot (THIS->here_input ());
 
-               $$ = MY_MAKE_MUSIC("RequestChord");
+               $$ = MY_MAKE_MUSIC("EventChord");
                $$->set_mus_property ("elements", scm_cons (l->self_scm (), SCM_EOL));
                $$->set_spot (THIS->here_input ());
          scm_gc_unprotect_object (l->self_scm());
@@ -1233,7 +1266,7 @@ command_element:
                csm->set_mus_property ("context-type", scm_makfrom0str ("Timing"));
        }
        | PARTIAL duration_length       {
-               Moment m = - unsmob_duration ($2)->length_mom ();
+               Moment m = - unsmob_duration ($2)->get_length ();
                Music * p = set_property_music (ly_symbol2scm ( "measurePosition"),m.smobbed_copy ());
 
                Music * sp = MY_MAKE_MUSIC("ContextSpeccedMusic");
@@ -1244,25 +1277,13 @@ command_element:
                sp-> set_mus_property ("context-type", scm_makfrom0str ("Timing"));
        }
        | CLEF STRING  {
-               SCM func = scm_primitive_eval (ly_symbol2scm ("clef-name-to-properties"));
-               SCM result = gh_call1 (func, $2);
-
-               SCM l = SCM_EOL;
-               for (SCM s = result ; gh_pair_p (s); s = ly_cdr (s)) {
-                       Music * p = MY_MAKE_MUSIC("Music");
-                       set_music_properties (p, ly_car (s));
-                       l = scm_cons (p->self_scm (), l);
-                       scm_gc_unprotect_object (p->self_scm ());
-               }
-               Music * seq = MY_MAKE_MUSIC("SequentialMusic");
-               seq->set_mus_property ("elements", l);
-
-               Music * sp = MY_MAKE_MUSIC("ContextSpeccedMusic");
-               sp->set_mus_property ("element", seq->self_scm ());
-               scm_gc_unprotect_object (seq->self_scm ());
+               static SCM proc ;
+               if (!proc)
+                       proc = scm_c_eval_string ("make-clef-set");
 
-               $$ =sp ;
-               sp-> set_mus_property ("context-type", scm_makfrom0str ("Staff"));
+               SCM result = scm_call_1 (proc, $2);
+               scm_gc_protect_object (result);
+               $$ = unsmob_music (result);
        }
        | TIME_T fraction  {
                Music * p1 = set_property_music (ly_symbol2scm ( "timeSignatureFraction"), $2);
@@ -1312,20 +1333,17 @@ shorthand_command_req:
                $$ = MY_MAKE_MUSIC("TieEvent");
        }
        | '['           {
-               Music *b= MY_MAKE_MUSIC("SpanEvent");
+               Music *b= MY_MAKE_MUSIC("BeamEvent");
                b->set_mus_property ("span-direction", gh_int2scm (START))
 ;
-               b->set_mus_property ("span-type", scm_makfrom0str ("beam"));
                $$ =b;
 
 
                THIS->last_beam_start_ = b->self_scm ();
        }
        | ']'           {
-               Music *b= MY_MAKE_MUSIC("SpanEvent");
-               b->set_mus_property ("span-direction", gh_int2scm (STOP))
-;
-               b->set_mus_property ("span-type", scm_makfrom0str ("beam"));
+               Music *b= MY_MAKE_MUSIC("BeamEvent");
+               b->set_mus_property ("span-direction", gh_int2scm (STOP));
                $$ = b;
        }
        | BREATHE {
@@ -1337,14 +1355,7 @@ shorthand_command_req:
        ;
 
 verbose_command_req:
-       COMMANDSPANREQUEST bare_int STRING { /*TODO: junkme */
-               Music * sp = MY_MAKE_MUSIC("SpanEvent");
-               sp->set_mus_property ("span-direction", gh_int2scm (Direction ($2)));
-               sp->set_mus_property ("span-type",$3);
-               sp->set_spot (THIS->here_input ());
-               $$ = sp;
-       }
-       | MARK DEFAULT  {
+       MARK DEFAULT  {
                Music * m = MY_MAKE_MUSIC("MarkEvent");
                $$ = m;
        }
@@ -1353,23 +1364,13 @@ verbose_command_req:
                m->set_mus_property ("label", $2);
                $$ = m;
        }
-       | PENALTY SCM_T         {
-               Music * b = MY_MAKE_MUSIC("BreakEvent");
-               SCM s = $2;
-               if (!gh_number_p (s))
-                       s  =gh_int2scm (0);
-
-               b->set_mus_property ("penalty", s);
-               b->set_spot (THIS->here_input ());
-               $$ = b;
-       }
        | SKIP duration_length {
                Music * skip = MY_MAKE_MUSIC("SkipEvent");
                skip->set_mus_property ("duration", $2);
 
                $$ = skip;
        }
-       | tempo_request {
+       | tempo_event {
                $$ = $1;
        }
        | KEY DEFAULT {
@@ -1385,25 +1386,25 @@ verbose_command_req:
        }
        ;
 
-post_requests:
-       {
-               $$ = new Link_array<Music>;
+post_events:
+       /* empty */ {
+               $$ = SCM_EOL;
        }
-       | post_requests post_request {
+       | post_events post_event {
                $2->set_spot (THIS->here_input ());
-               $$->push ($2);
+               $$ = gh_cons ($2->self_scm(), $$);
+               scm_gc_unprotect_object ($2->self_scm());
        }
        ;
 
-post_request:
-       verbose_request
-       | request_with_dir
-       | close_request
-       | string_request
+post_event:
+       verbose_event
+       | event_with_dir
+       | close_event
+       | string_event
        ;
 
-
-string_request:
+string_event:
        E_UNSIGNED {
                Music * s = MY_MAKE_MUSIC("StringNumberEvent");
                s->set_mus_property ("string-number",  gh_int2scm($1));
@@ -1413,9 +1414,28 @@ string_request:
        ;
 
 
-request_that_take_dir:
+event_that_take_dir:
        gen_text_def
-       | verbose_request
+       | verbose_event
+       | close_event
+       | open_event
+       | '['  {
+               Music * m = MY_MAKE_MUSIC ("NewBeamEvent");
+               m->set_spot (THIS->here_input());
+               m->set_mus_property ("span-direction" , gh_int2scm (START));
+               $$ = m;
+       }
+       | ']'  {
+               Music * m = MY_MAKE_MUSIC ("NewBeamEvent");
+               m->set_spot (THIS->here_input());
+               m->set_mus_property ("span-direction" , gh_int2scm (STOP));
+               $$ = m;
+       }
+       | '~' {
+               Music * m = MY_MAKE_MUSIC ("NewTieEvent");
+               m->set_spot (THIS->here_input());
+               $$ = m;
+       }
        | script_abbreviation {
                SCM s = THIS->lexer_->lookup_identifier ("dash" + ly_scm2string ($1));
                Music *a = MY_MAKE_MUSIC("ArticulationEvent");
@@ -1426,35 +1446,16 @@ request_that_take_dir:
        }
        ;
 
-request_with_dir:
-       script_dir request_that_take_dir        {
+event_with_dir:
+       script_dir event_that_take_dir  {
                $2->set_mus_property ("direction", gh_int2scm ($1));
                $$ = $2;
        }
        ;
        
-verbose_request:
-       REQUEST_IDENTIFIER      {
-               $$ = unsmob_music ($1)->clone ();
-               $$->set_spot (THIS->here_input ());
-       }
-       | DYNAMICSCRIPT embedded_scm {
-               /*
-                       TODO: junkme, use text-type == dynamic
-               */
-               Music *d = MY_MAKE_MUSIC("TextScriptEvent");
-               SCM dyn = ly_symbol2scm ("dynamic");
-               d->set_mus_property ("text-type" , dyn);
-               d->set_mus_property ("text", $2);
-               d->set_spot (THIS->here_input ());
-               $$ = d;
-       }
-       | SPANREQUEST bare_int STRING {
-               Music * sp = MY_MAKE_MUSIC("SpanEvent");
-               sp->set_mus_property ("span-direction", gh_int2scm ( $2));
-               sp->set_mus_property ("span-type", $3);
-               sp->set_spot (THIS->here_input ());
-               $$ = sp;
+verbose_event:
+       EVENT_IDENTIFIER        {
+               $$ = unsmob_music ($1);
        }
        | tremolo_type  {
                Music * a = MY_MAKE_MUSIC("TremoloEvent");
@@ -1462,26 +1463,6 @@ verbose_request:
                a->set_mus_property ("tremolo-type", gh_int2scm ($1));
                $$ = a;
         }
-       | SCRIPT STRING         { 
-               Music * a = MY_MAKE_MUSIC("ArticulationEvent");
-               a->set_mus_property ("articulation-type", $2);
-               a->set_spot (THIS->here_input ());
-               $$ = a;
-       }
-
-       /*
-               duh, junk this syntax from the parser, if possible. 
-       */
-       | ARPEGGIO {
-               Music *a = MY_MAKE_MUSIC("ArpeggioEvent");
-               a->set_spot (THIS->here_input ());
-               $$ = a;
-       }
-       | GLISSANDO {
-               Music *g = MY_MAKE_MUSIC("GlissandoEvent");
-               g->set_spot /* No pun intended */ (THIS->here_input ());
-               $$ = g;
-       }       
        ;
 
 sup_quotes:
@@ -1588,67 +1569,61 @@ hyphen_req:
        }
        ;
 
-close_request:
-       close_request_parens {
+close_event:
+       close_event_parens {
                $$ = $1;
                dynamic_cast<Music *> ($$)->set_mus_property ("span-direction", gh_int2scm (START))
 ;
        }
        ;
  
-close_request_parens:
+close_event_parens:
        '('     {
-               Music * s= MY_MAKE_MUSIC("SpanEvent");
+               Music * s= MY_MAKE_MUSIC("SlurEvent");
                $$ = s;
-               s->set_mus_property ("span-type", scm_makfrom0str ( "slur"));
                s->set_spot (THIS->here_input());
        }
        | E_OPEN        {
-               Music * s= MY_MAKE_MUSIC("SpanEvent");
+               Music * s= MY_MAKE_MUSIC("PhrasingSlurEvent");
                $$ = s;
-               s->set_mus_property ("span-type", scm_makfrom0str ( "phrasing-slur"));
                s->set_spot (THIS->here_input());
        }
        | E_SMALLER {
-               Music *s =MY_MAKE_MUSIC("SpanEvent");
+               Music *s =MY_MAKE_MUSIC("CrescendoEvent");
                $$ = s;
-               s->set_mus_property ("span-type", scm_makfrom0str ( "crescendo"));
                s->set_spot (THIS->here_input());
        }
        | E_BIGGER {
-               Music *s =MY_MAKE_MUSIC("SpanEvent");
+               Music *s =MY_MAKE_MUSIC("DecrescendoEvent");
                $$ = s;
-               s->set_mus_property ("span-type", scm_makfrom0str ("decrescendo"));
                s->set_spot (THIS->here_input());
        }
        ;
 
 
-open_request:
-       open_request_parens {
+open_event:
+       open_event_parens {
                $$ = $1;
                dynamic_cast<Music *> ($$)->set_mus_property ("span-direction", gh_int2scm (STOP))
 ;
        }
        ;
 
-open_request_parens:
+open_event_parens:
        E_EXCLAMATION   {
-               Music *s =  MY_MAKE_MUSIC("SpanEvent");
-               s->set_mus_property ("span-type", scm_makfrom0str ( "crescendo"));
+               Music *s =  MY_MAKE_MUSIC("CrescendoEvent");
                s->set_spot (THIS->here_input());
 
                $$ = s;
        }
        | ')'   {
-               Music * s= MY_MAKE_MUSIC("SpanEvent");
+               Music * s= MY_MAKE_MUSIC("SlurEvent");
                $$ = s;
-               s->set_mus_property ("span-type", scm_makfrom0str ( "slur"));
                s->set_spot (THIS->here_input());
 
        }
        | E_CLOSE       {
-               Music * s= MY_MAKE_MUSIC("SpanEvent");
+               Music * s= MY_MAKE_MUSIC("PhrasingSlurEvent");
                $$ = s;
                s->set_mus_property ("span-type", scm_makfrom0str ( "phrasing-slur"));
                s->set_spot (THIS->here_input());
@@ -1669,11 +1644,9 @@ gen_text_def:
                $$ = t;
        }
        | DIGIT {
-               String ds = to_string ($1);
-               Music * t = MY_MAKE_MUSIC("TextScriptEvent");
+               Music * t = MY_MAKE_MUSIC("FingerEvent");
                SCM finger = ly_symbol2scm ("finger");
-               t->set_mus_property ("text",  scm_makfrom0str (ds.to_str0 ()));
-               t->set_mus_property ("text-type" , finger);
+               t->set_mus_property ("digit",  gh_int2scm ($1));
                t->set_spot (THIS->here_input ());
                $$ = t;
        }
@@ -1709,12 +1682,13 @@ script_dir:
        | '-'   { $$ = CENTER; }
        ;
 
-pre_requests:
-       {
-               $$ = new Link_array<Music>;
+pre_events:
+       /* empty */ { 
+               $$ = SCM_EOL;
        }
-       | pre_requests open_request {
-               $$->push ($2);
+       | pre_events open_event {
+               $$ = gh_cons ($2->self_scm(), $$);
+               scm_gc_unprotect_object ($2->self_scm());
        }
        ;
 
@@ -1765,7 +1739,9 @@ steno_duration:
        | DURATION_IDENTIFIER dots      {
                Duration *d =unsmob_duration ($1);
                Duration k (d->duration_log (),d->dot_count () + $2);
-               $$ = k.smobbed_copy ();
+
+               *d = k;
+               $$ = $1;
        }
        ;
 
@@ -1815,6 +1791,10 @@ tremolo_type:
        ;
 
 
+
+/*****************************************************************
+               BASS FIGURES
+*****************************************************************/
 bass_number:
        DIGIT
        | UNSIGNED 
@@ -1878,7 +1858,7 @@ figure_list:
 
 figure_spec:
        FIGURE_OPEN figure_list FIGURE_CLOSE {
-               Music * m = MY_MAKE_MUSIC("RequestChord");
+               Music * m = MY_MAKE_MUSIC("EventChord");
                $2 = scm_reverse_x ($2, SCM_EOL);
                m->set_mus_property ("elements",  $2);
                $$ = m->self_scm ();
@@ -1913,7 +1893,7 @@ simple_element:
                if ($2 % 2 || $3 % 2)
                        n->set_mus_property ("force-accidental", SCM_BOOL_T);
 
-               Music *v = MY_MAKE_MUSIC("RequestChord");
+               Music *v = MY_MAKE_MUSIC("EventChord");
                v->set_mus_property ("elements", scm_list_n (n->self_scm (), SCM_UNDEFINED));
                scm_gc_unprotect_object (n->self_scm());
 
@@ -1926,30 +1906,27 @@ simple_element:
                Input i = THIS->pop_spot (); 
                m->set_spot (i);
                for (SCM s = m->get_mus_property ("elements"); gh_pair_p (s); s = ly_cdr (s))
-                       {
-                               unsmob_music (ly_car (s))->set_mus_property ("duration", $2);
-                       }
+               {
+                       unsmob_music (ly_car (s))->set_mus_property ("duration", $2);
+               }
                $$ = m;
        }       
        | RESTNAME optional_notemode_duration           {
 
                Input i = THIS->pop_spot ();
-               SCM e = SCM_UNDEFINED;
+               Music * ev = 0;
                if (ly_scm2string ($1) =="s") {
                        /* Space */
-                       Music * skip = MY_MAKE_MUSIC("SkipEvent");
-                       skip->set_mus_property ("duration" ,$2);
-                       skip->set_spot (i);
-                       e = skip->self_scm ();
+                       ev = MY_MAKE_MUSIC("SkipEvent");
                  }
-                 else {
-                       Music * rest_req = MY_MAKE_MUSIC("RestEvent");
-                       rest_req->set_mus_property ("duration", $2);
-                       rest_req->set_spot (i);
-                       e = rest_req->self_scm ();
+               else {
+                       ev = MY_MAKE_MUSIC("RestEvent");
+               
                    }
-               Music * velt = MY_MAKE_MUSIC("RequestChord");
-               velt-> set_mus_property ("elements", scm_list_n (e,SCM_UNDEFINED));
+               ev->set_mus_property ("duration" ,$2);
+               ev->set_spot (i);
+               Music * velt = MY_MAKE_MUSIC("EventChord");
+               velt->set_mus_property ("elements", scm_list_n (ev->self_scm (),SCM_UNDEFINED));
                velt->set_spot (i);
 
                $$ = velt;
@@ -1957,29 +1934,14 @@ simple_element:
        | MULTI_MEASURE_REST optional_notemode_duration         {
                THIS->pop_spot ();
 
-               Music * sk = MY_MAKE_MUSIC("SkipEvent");
-               sk->set_mus_property ("duration", $2);
-               Music *sp1 = MY_MAKE_MUSIC("SpanEvent");
-               Music *sp2 = MY_MAKE_MUSIC("SpanEvent");
-               sp1-> set_mus_property ("span-direction", gh_int2scm (START))
-;
-               sp2-> set_mus_property ("span-direction", gh_int2scm (STOP))
-;
-               SCM r = scm_makfrom0str ("rest");
-               sp1->set_mus_property ("span-type", r);
-               sp2->set_mus_property ("span-type", r);
-
-               Music *rqc1 = MY_MAKE_MUSIC("RequestChord");
-               rqc1->set_mus_property ("elements", scm_list_n (sp1->self_scm (), SCM_UNDEFINED));
-               Music *rqc2 = MY_MAKE_MUSIC("RequestChord");
-               rqc2->set_mus_property ("elements", scm_list_n (sk->self_scm (), SCM_UNDEFINED));;
-               Music *rqc3 = MY_MAKE_MUSIC("RequestChord");
-               rqc3->set_mus_property ("elements", scm_list_n (sp2->self_scm (), SCM_UNDEFINED));;
-
-               SCM ms = scm_list_n (rqc1->self_scm (), rqc2->self_scm (), rqc3->self_scm (), SCM_UNDEFINED);
+               static SCM proc ;
+               if (!proc)
+                       proc = scm_c_eval_string ("make-multi-measure-rest");
 
-               $$ = MY_MAKE_MUSIC("SequentialMusic");
-               $$->set_mus_property ("elements", ms);
+               SCM mus = scm_call_2 (proc, $2,
+                       make_input (THIS->here_input()));       
+               scm_gc_protect_object (mus);
+               $$ = unsmob_music (mus);
        }
        | STRING optional_notemode_duration     {
                Input i = THIS->pop_spot ();
@@ -1988,13 +1950,13 @@ simple_element:
                 lreq->set_mus_property ("text", $1);
                lreq->set_mus_property ("duration",$2);
                lreq->set_spot (i);
-               Music * velt = MY_MAKE_MUSIC("RequestChord");
+               Music * velt = MY_MAKE_MUSIC("EventChord");
                velt->set_mus_property ("elements", scm_list_n (lreq->self_scm (), SCM_UNDEFINED));
 
                $$= velt;
        }
        | chord {
-               Input i = THIS->pop_spot ();
+               THIS->pop_spot ();
 
                if (!THIS->lexer_->chord_state_b ())
                        THIS->parser_error (_ ("Have to be in Chord mode for chords"));
@@ -2122,10 +2084,7 @@ number_term:
        ;
 
 number_factor:
-       '(' number_expression ')'       {
-               $$ = $2;
-       }
-       | '-'  number_factor { /* %prec UNARY_MINUS */
+       '-'  number_factor { /* %prec UNARY_MINUS */
                $$ = scm_difference ($2, SCM_UNDEFINED);
        }
        | bare_number
@@ -2142,20 +2101,11 @@ bare_number:
        | NUMBER_IDENTIFIER             {
                $$ = $1;
        }
-       | REAL CM_T     {
-               $$ = gh_double2scm (gh_scm2double ($1) CM );
-       }
-       | REAL PT_T     {
-               $$ = gh_double2scm (gh_scm2double ($1) PT);
-       }
-       | REAL IN_T     {
-               $$ = gh_double2scm (gh_scm2double ($1) INCH);
+       | REAL NUMBER_IDENTIFIER        {
+               $$ = gh_double2scm (gh_scm2double ($1) * gh_scm2double ($2));
        }
-       | REAL MM_T     {
-               $$ = gh_double2scm (gh_scm2double ($1) MM);
-       }
-       | REAL CHAR_T   {
-               $$ = gh_double2scm (gh_scm2double ($1) CHAR);
+       | UNSIGNED NUMBER_IDENTIFIER    {
+               $$ = gh_double2scm ($1 * gh_scm2double ($2));
        }
        ;
 
@@ -2217,7 +2167,7 @@ void
 My_lily_parser::set_yydebug (bool )
 {
 #if 0
-       yydebug = b;
+       yydebug = 1;
 #endif
 }
 
@@ -2226,7 +2176,6 @@ extern My_lily_parser * current_parser;
 void
 My_lily_parser::do_yyparse ()
 {
-
        current_parser = this;;
        yyparse ((void*)this);
 }
@@ -2242,6 +2191,7 @@ which is entirely legitimate.
 Or we can scrap it. Barchecks should detect wrong durations, and
 skipTypesetting speeds it up a lot.
 */
+
 void
 My_lily_parser::beam_check (SCM dur)
 {
@@ -2253,3 +2203,44 @@ My_lily_parser::beam_check (SCM dur)
     }
   last_beam_start_ = SCM_EOL;
 }
+
+
+/*
+It is a little strange, to have this function in this file, but
+otherwise, we have to import music classes into the lexer.
+
+*/
+int
+My_lily_lexer::try_special_identifiers (SCM * destination, SCM sid)
+{
+       if (gh_string_p (sid)) {
+               *destination = sid;
+               return STRING_IDENTIFIER;
+       } else if (gh_number_p (sid)) {
+               *destination = sid;
+               return NUMBER_IDENTIFIER;
+       } else if (unsmob_translator_def (sid)) {
+               *destination = unsmob_translator_def (sid)->clone_scm();
+               return TRANSLATOR_IDENTIFIER;
+       } else if (unsmob_score (sid)) {
+               Score *sc =  new Score (*unsmob_score (sid));
+               *destination =sc->self_scm ();
+               return SCORE_IDENTIFIER;
+       } else if (Music * mus =unsmob_music (sid)) {
+               *destination = unsmob_music (sid)->clone ()->self_scm();
+               unsmob_music (*destination)->
+                       set_mus_property ("origin", make_input (last_input_));
+               return dynamic_cast<Event*> (mus)
+                       ? EVENT_IDENTIFIER : MUSIC_IDENTIFIER;
+       } else if (unsmob_duration (sid)) {
+               *destination = unsmob_duration (sid)->smobbed_copy();
+               return DURATION_IDENTIFIER;
+       } else if (unsmob_music_output_def (sid)) {
+               Music_output_def *p = unsmob_music_output_def (sid);
+               p = p->clone ();
+
+               *destination = p->self_scm();
+               return MUSIC_OUTPUT_DEF_IDENTIFIER;
+       }
+       return -1;      
+}