]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
* Documentation/user/notation.itely (Bar lines): Added a note that
[lilypond.git] / lily / parser.yy
index 3907d8b3ea1a2845ba0291ab4fd4ff4aa8289bf0..078c19e098b7da04e3af1e4b9fd38d28bd30ba34 100644 (file)
@@ -40,8 +40,8 @@ TODO:
 #include "misc.hh"
 #include "music-list.hh"
 #include "music-sequence.hh"
-#include "my-lily-lexer.hh"
-#include "my-lily-parser.hh"
+#include "lily-lexer.hh"
+#include "lily-parser.hh"
 #include "paper-book.hh"
 #include "output-def.hh"
 #include "scm-hash.hh"
@@ -53,7 +53,7 @@ TODO:
 #define MY_MAKE_MUSIC(x)  make_music_by_name (ly_symbol2scm (x))
 
 Music *property_op_to_music (SCM op);
-Music *context_spec_music (SCM type, SCM id, Music *m, SCM ops_);
+Music *context_spec_music (SCM type, SCM id, Music *m, SCM ops);
 SCM get_next_unique_context ();
 
 #define YYERROR_VERBOSE 1
@@ -61,7 +61,7 @@ SCM get_next_unique_context ();
 #define YYPARSE_PARAM my_lily_parser
 #define YYLEX_PARAM my_lily_parser
 #define THIS\
-       ((My_lily_parser *) my_lily_parser)
+       ((Lily_parser *) my_lily_parser)
 
 #define yyerror THIS->parser_error
 
@@ -71,7 +71,7 @@ void
 tag_music (Music *m, SCM tag, Input ip)
 {
        SCM tags = m->get_property ("tags");
-       if (ly_c_symbol_p (tag))
+       if (scm_is_symbol (tag))
                tags = scm_cons (tag, tags);
        else if (ly_c_list_p (tag))
                tags = ly_append2 (tag, tags);
@@ -104,7 +104,7 @@ SCM
 make_simple_markup (SCM encoding, SCM a)
 {
        SCM simple = ly_scheme_function ("simple-markup");
-       if (ly_c_symbol_p (encoding))
+       if (scm_is_symbol (encoding))
                return scm_list_3 (ly_scheme_function ("encoded-simple-markup"),
                           encoding, a);
        return scm_list_2 (simple, a);
@@ -119,8 +119,8 @@ is_duration (int t)
 void
 set_music_properties (Music *p, SCM a)
 {
-  for (SCM k = a; ly_c_pair_p (k); k = ly_cdr (k))
-       p->internal_set_property (ly_caar (k), ly_cdar (k));
+  for (SCM k = a; scm_is_pair (k); k = scm_cdr (k))
+       p->internal_set_property (scm_caar (k), scm_cdar (k));
 }
 
 SCM
@@ -150,7 +150,7 @@ bool
 ly_input_procedure_p (SCM x)
 {
        return ly_c_procedure_p (x)
-               || (ly_c_pair_p (x) && ly_c_procedure_p (ly_car (x)));
+               || (scm_is_pair (x) && ly_c_procedure_p (scm_car (x)));
 }
 
 Music*
@@ -189,7 +189,7 @@ make_lyric_combine_music (SCM name, Music *music)
 deleting them.  Let's hope that a stack overflow doesnt trigger a move
 of the parse stack onto the heap. */
 
-%left NEWLYRICS
+%left ADDLYRICS
 
 %union {
        Book *book;
@@ -205,8 +205,8 @@ of the parse stack onto the heap. */
 int
 yylex (YYSTYPE *s, void *v)
 {
-       My_lily_parser *pars = (My_lily_parser*) v;
-       My_lily_lexer *lex = pars->lexer_;
+       Lily_parser *pars = (Lily_parser*) v;
+       Lily_lexer *lex = pars->lexer_;
 
        lex->lexval = (void*) s;
        lex->prepare_for_next_token ();
@@ -223,8 +223,13 @@ yylex (YYSTYPE *s, void *v)
 
 2. \markup identifier.
 
+  (what? --hwn)
+
 3. \markup { }
 
+  (what? --hwn)
+
+
 4.  \repeat
        \repeat .. \alternative
 
@@ -252,18 +257,20 @@ or
 %token CHANGE
 %token CHORDMODIFIERS
 %token CHORDS
+%token CHORDMODE
 %token DOUBLE_ANGLE_OPEN
 %token DOUBLE_ANGLE_CLOSE
 %token CLEF
 %token COMMANDSPANREQUEST
 %token CONSISTS
-%token CONSISTSEND
 %token CONTEXT
 %token DEFAULT
 %token DENIES
 %token DESCRIPTION
 %token EXTENDER
-%token FIGURES FIGURE_OPEN FIGURE_CLOSE
+%token FIGURES
+%token FIGUREMODE
+%token FIGURE_OPEN FIGURE_CLOSE
 %token FIGURE_BRACKET_CLOSE FIGURE_BRACKET_OPEN
 %token GROBDESCRIPTIONS
 %token HEADER
@@ -271,13 +278,13 @@ or
 %token INVALID
 %token KEY
 %token LYRICS
-%token LYRICS_STRING
+%token LYRICMODE
 %token MARK
 %token MIDI
 %token MULTI_MEASURE_REST
 %token NAME
 %token NEWCONTEXT
-%token NOTES
+%token NOTEMODE
 %token OCTAVE
 %token ONCE
 %token OVERRIDE SET REVERT
@@ -291,7 +298,7 @@ or
 %token SCM_T
 %token SCORE
 %token SEQUENTIAL
-%token NEWLYRICS
+%token ADDLYRICS
 %token SIMULTANEOUS
 %token SKIP
 %token SPANREQUEST
@@ -332,6 +339,7 @@ or
 %token <scm>   NUMBER_IDENTIFIER
 %token <scm>   OUTPUT_DEF_IDENTIFIER
 %token <scm>   RESTNAME
+%token <scm> LYRICS_STRING
 %token <scm>   SCM_T
 %token <scm>   SCORE_IDENTIFIER
 %token <scm>   STRING
@@ -353,11 +361,13 @@ or
 %token <scm> MUSIC_FUNCTION_MUSIC 
 %token <scm> MUSIC_FUNCTION_MUSIC_MUSIC 
 %token <scm> MUSIC_FUNCTION_SCM 
+%token <scm> MUSIC_FUNCTION_SCM_SCM 
 %token <scm> MUSIC_FUNCTION_SCM_MUSIC 
 %token <scm> MUSIC_FUNCTION_SCM_MUSIC_MUSIC 
 %token <scm> MUSIC_FUNCTION_SCM_SCM_MUSIC 
-%token DRUMS
 
+%token DRUMS
+%token DRUMMODE
 
 
 %type <book>   book_block book_body
@@ -376,7 +386,6 @@ or
 %type <music>  gen_text_def direction_less_event direction_reqd_event
 %type <music>  music_property_def context_change
 %type <music>  note_chord_element chord_body chord_body_element
-%type <music>  open_event close_event
 %type <music>  post_event tagged_post_event
 %type <music>  relative_music re_rhythmed_music
 %type <music>  simple_element event_chord command_element
@@ -393,6 +402,7 @@ or
 %type <scm>    context_def_spec_block context_def_spec_body
 %type <scm>    context_mod context_def_mod optional_context_mod
 %type <scm>    context_prop_spec
+%type <scm>    direction_less_char
 %type <scm>    duration_length fraction
 %type <scm>    embedded_scm scalar
 %type <scm>    identifier_init
@@ -414,6 +424,8 @@ or
 %type <scm>    lyric_element
 %type <scm>     Alternative_music
 %type <scm>    markup markup_line markup_list markup_list_body full_markup
+%type <scm>    mode_changing_head
+%type <scm>    mode_changing_head_with_context
 
 %type <score>  score_block score_body
 
@@ -548,9 +560,6 @@ identifier_init:
                $$ = $1->self_scm ();
                scm_gc_unprotect_object ($$);
        }
-       | full_markup {
-               $$ = $1;
-       }
        | output_def {
                $$ = $1->self_scm ();
                scm_gc_unprotect_object ($$);
@@ -567,14 +576,20 @@ identifier_init:
                scm_gc_unprotect_object ($$);
        }
        | number_expression {
-               $$ = $1;
+               $$ = $1;
        }
        | string {
                $$ = $1;
        }
-       | embedded_scm  {
+        | embedded_scm {
+               $$ = $1;
+       }
+       | full_markup {
                $$ = $1;
        }
+       | DIGIT {
+               $$ = scm_int2num ($1);
+       }
        ;
 
 context_def_spec_block:
@@ -596,12 +611,12 @@ context_def_spec_body:
        | context_def_spec_body GROBDESCRIPTIONS embedded_scm {
                Context_def*td = unsmob_context_def ($$);
 
-               for (SCM p = $3; ly_c_pair_p (p); p = ly_cdr (p)) {
-                       SCM tag = ly_caar (p);
+               for (SCM p = $3; scm_is_pair (p); p = scm_cdr (p)) {
+                       SCM tag = scm_caar (p);
 
                        /* TODO: should make new tag "grob-definition" ? */
                        td->add_context_mod (scm_list_3 (ly_symbol2scm ("assign"),
-                                                       tag, scm_cons (ly_cdar (p), SCM_EOL)));
+                                                       tag, scm_cons (scm_cdar (p), SCM_EOL)));
                }
        }
        | context_def_spec_body context_mod {
@@ -641,18 +656,12 @@ book_body:
                $$->scores_.push (score);
                scm_gc_unprotect_object (score->self_scm ());
        }
-       | book_body Composite_music {
-               Music *music = $2;
-               Score *score
-                       = unsmob_score (ly_music_scorify (music->self_scm ()));
-               $$->scores_.push (score);
-               scm_gc_unprotect_object (music->self_scm ());
-       }
        | book_body lilypond_header {
                $$->header_ = $2;
        }
        | book_body error {
-
+               $$->bookpaper_ = 0;
+               $$->scores_.clear();
        }
        ;
 
@@ -679,29 +688,25 @@ score_body:
        | score_body Music {
                SCM m = $2->self_scm ();
                scm_gc_unprotect_object (m);
-       
-               /*
-                       guh.
-               */
-               SCM check_funcs = ly_scheme_function ("toplevel-music-functions");
-               for (; ly_c_pair_p (check_funcs); check_funcs = ly_cdr (check_funcs))
-                       m = scm_call_1 (ly_car (check_funcs), m);
-               if (unsmob_music ($$->music_))
-               {
-                       THIS->parser_error (_("Already have music in score"));
-                       unsmob_music ($$->music_)->origin ()->error (_("This is the previous music"));
-               }
-               $$->music_ = m;
+               $$->set_music (m, THIS->self_scm ());
        }
        | score_body lilypond_header    {
                $$->header_ = $2;
        }
        | score_body output_def {
-               $$->defs_.push ($2);
+               if ($2->lookup_variable (ly_symbol2scm ("is-bookpaper")) == SCM_BOOL_T)
+               {
+                       THIS->parser_error (_("\\bookpaper cannot be in \\score. Use \\paper instead"));
+               
+               }
+               else
+               {
+                       $$->defs_.push ($2);
+               }
                scm_gc_unprotect_object ($2->self_scm ());
        }
        | score_body error {
-
+               $$->error_found_ = true;
        }
        ;
 
@@ -725,8 +730,6 @@ book_paper_block:
 output_def:
        output_def_body '}' {
                $$ = $1;
-               if ($1->parent_)
-                       THIS->lexer_->remove_scope ();
 
                THIS->lexer_->remove_scope ();
                THIS->lexer_->pop_state ();
@@ -745,10 +748,7 @@ output_def_head:
                THIS->lexer_->add_scope (p->scope_);
        }
        | PAPER         {
-               Output_def* p = get_paper (THIS);
-
-               if (p->parent_)
-                       THIS->lexer_->add_scope (p->parent_->scope_);
+               Output_def *p = get_paper (THIS);
 
                THIS->lexer_->add_scope (p->scope_);
                $$ = p;
@@ -782,7 +782,7 @@ output_def_body:
                        junk this ? there already is tempo stuff in
                        music.
                */
-               int m = ly_scm2int ($2->get_property ("metronome-count"));
+               int m = scm_to_int ($2->get_property ("metronome-count"));
                Duration *d = unsmob_duration ($2->get_property ("tempo-unit"));
                set_tempo ($$, d->get_length (), m);
                scm_gc_unprotect_object ($2->self_scm ());
@@ -805,8 +805,8 @@ The representation of a  list is the
 
   (LIST . LAST-CONS)
 
- to have  efficient append.
-*/
+ to have efficient append.  */
+
 Music_list:
        /* empty */ {
                $$ = scm_cons (SCM_EOL, SCM_EOL);
@@ -815,19 +815,32 @@ Music_list:
                SCM s = $$;
                SCM c = scm_cons ($2->self_scm (), SCM_EOL);
                scm_gc_unprotect_object ($2->self_scm ()); /* UGH */
-               if (ly_c_pair_p (ly_cdr (s)))
-                       scm_set_cdr_x (ly_cdr (s), c); /* append */
+
+               if (scm_is_pair (scm_cdr (s)))
+                       scm_set_cdr_x (scm_cdr (s), c); /* append */
                else
                        scm_set_car_x (s, c); /* set first cons */
                scm_set_cdr_x (s, c);  /* remember last cell */
        }
        | Music_list embedded_scm {
+
        }
        | Music_list error {
+               Music * m = MY_MAKE_MUSIC("Music");
+               // ugh. code dup 
+               m->set_property ("error-found", SCM_BOOL_T);
+               SCM s = $$;
+               SCM c = scm_cons (m->self_scm (), SCM_EOL);
+               scm_gc_unprotect_object (m->self_scm ()); /* UGH */
+
+               if (scm_is_pair (scm_cdr (s)))
+                       scm_set_cdr_x (scm_cdr (s), c); /* append */
+               else
+                       scm_set_car_x (s, c); /* set first cons */
+               scm_set_cdr_x (s, c);  /* remember last cell */
        }
        ;
 
-
 Music:
        Simple_music
        | Composite_music
@@ -848,9 +861,9 @@ Repeated_music:
        {
                Music *beg = $4;
                int times = $3;
-               SCM alts = ly_c_pair_p ($5) ? ly_car ($5) : SCM_EOL;
+               SCM alts = scm_is_pair ($5) ? scm_car ($5) : SCM_EOL;
                if (times < scm_ilength (alts)) {
-                 unsmob_music (ly_car (alts))
+                 unsmob_music (scm_car (alts))
                    ->origin ()->warning (
                    _ ("More alternatives than repeats.  Junking excess alternatives."));
                  alts = ly_truncate_list (times, alts);
@@ -905,12 +918,12 @@ Repeated_music:
 Sequential_music:
        SEQUENTIAL '{' Music_list '}'           {
                $$ = MY_MAKE_MUSIC ("SequentialMusic");
-               $$->set_property ("elements", ly_car ($3));
+               $$->set_property ("elements", scm_car ($3));
                $$->set_spot (THIS->here_input ());
        }
        | '{' Music_list '}'            {
                $$ = MY_MAKE_MUSIC ("SequentialMusic");
-               $$->set_property ("elements", ly_car ($2));
+               $$->set_property ("elements", scm_car ($2));
                $$->set_spot (THIS->here_input ());
        }
        ;
@@ -918,13 +931,13 @@ Sequential_music:
 Simultaneous_music:
        SIMULTANEOUS '{' Music_list '}'{
                $$ = MY_MAKE_MUSIC ("SimultaneousMusic");
-               $$->set_property ("elements", ly_car ($3));
+               $$->set_property ("elements", scm_car ($3));
                $$->set_spot (THIS->here_input ());
 
        }
        | simul_open Music_list simul_close     {
                $$ = MY_MAKE_MUSIC ("SimultaneousMusic");
-               $$->set_property ("elements", ly_car ($2));
+               $$->set_property ("elements", scm_car ($2));
                $$->set_spot (THIS->here_input ());
        }
        ;
@@ -988,6 +1001,11 @@ Generic_prefix_music_scm:
                $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, $4->self_scm ());
                scm_gc_unprotect_object ($4->self_scm ());
        }
+       | MUSIC_FUNCTION_SCM_SCM {
+               THIS->push_spot (); 
+       }  embedded_scm embedded_scm {
+               $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, $4);
+       }
        | MUSIC_FUNCTION_MUSIC_MUSIC {
                THIS->push_spot (); 
        }  Music  Music {
@@ -1007,17 +1025,17 @@ Generic_prefix_music_scm:
 
 Generic_prefix_music:
        Generic_prefix_music_scm {
-               SCM func = ly_car ($1);
-               Input *loc = unsmob_input (ly_cadr ($1));
-               SCM args = ly_cddr ($1);
+               SCM func = scm_car ($1);
+               Input *loc = unsmob_input (scm_cadr ($1));
+               SCM args = scm_cddr ($1);
                SCM sig = scm_object_property (func, ly_symbol2scm ("music-function-signature"));
                int k = 0;
                bool ok  = true; 
                for (SCM s = sig, t = args;
-                       ok && ly_c_pair_p (s) && ly_c_pair_p (t);
-                       s = ly_cdr (s), t = ly_cdr (t)) {
+                       ok && scm_is_pair (s) && scm_is_pair (t);
+                       s = scm_cdr (s), t = scm_cdr (t)) {
                        k++;
-                       if (scm_call_1 (ly_car (s), ly_car (t)) != SCM_BOOL_T)
+                       if (scm_call_1 (scm_car (s), scm_car (t)) != SCM_BOOL_T)
                        {
                                loc->error (_f ("Argument %d failed typecheck", k));
                                THIS->error_level_ = 1;
@@ -1026,7 +1044,7 @@ Generic_prefix_music:
                }
                SCM m = SCM_EOL;
                if (ok)
-                       m = scm_apply_0 (func, ly_cdr ($1));
+                       m = scm_apply_0 (func, scm_cdr ($1));
                if (unsmob_music (m))
                        {
                        $$ = unsmob_music (m);
@@ -1066,7 +1084,7 @@ Prefix_composite_music:
                fraction Music  
 
        {
-               int n = ly_scm2int (ly_car ($3)); int d = ly_scm2int (ly_cdr ($3));
+               int n = scm_to_int (scm_car ($3)); int d = scm_to_int (scm_cdr ($3));
                Music *mp = $4;
 
                $$= MY_MAKE_MUSIC ("TimeScaledMusic");
@@ -1086,82 +1104,103 @@ Prefix_composite_music:
                Pitch from = *unsmob_pitch ($2);
                Pitch to = *unsmob_pitch ($3);
 
-               p->transpose (interval (from, to));
+               p->transpose (pitch_interval (from, to));
                $$->set_property ("element", p->self_scm ());
                scm_gc_unprotect_object (p->self_scm ());
        }
-       | NOTES
+       | mode_changing_head Grouped_music_list {
+               if ($1 == ly_symbol2scm ("chords"))
+               {
+                 Music *chm = MY_MAKE_MUSIC ("UntransposableMusic");
+                 chm->set_property ("element", $2->self_scm ());
+                 $$ = chm;
+                 scm_gc_unprotect_object ($2->self_scm ());
+               }
+               else
+               {
+                 $$ = $2;
+               }
+               THIS->lexer_->pop_state ();
+       }
+       | mode_changing_head_with_context optional_context_mod Grouped_music_list {
+               $$ = context_spec_music ($1, get_next_unique_context (),
+                                        $3, $2);
+               if ($1 == ly_symbol2scm ("ChordNames"))
                {
+                 Music *chm = MY_MAKE_MUSIC ("UntransposableMusic");
+                 chm->set_property ("element", $$->self_scm ());
+                 scm_gc_unprotect_object ($$->self_scm ());
+                 $$ = chm;
+               }
+               THIS->lexer_->pop_state ();
+       }
+       | relative_music        { $$ = $1; }
+       | re_rhythmed_music     { $$ = $1; }
+       | TAG embedded_scm Music {
+               tag_music ($3, $2, THIS->here_input ());
+               $$ = $3;
+       }
+       ;
+
+mode_changing_head: 
+       NOTEMODE {
                SCM nn = THIS->lexer_->lookup_identifier ("pitchnames");
                THIS->lexer_->push_note_state (alist_to_hashq (nn));
+
+               $$ = ly_symbol2scm ("notes");
        }
-       Music
-               { $$ = $3;
-                 THIS->lexer_->pop_state ();
-               }
-       | DRUMS
+       | DRUMMODE 
                {
                SCM nn = THIS->lexer_->lookup_identifier ("drumPitchNames");
                THIS->lexer_->push_note_state (alist_to_hashq (nn));
+
+               $$ = ly_symbol2scm ("drums");
        }
-       /* FIXME: This used to be: */
-       Music
-/*     Grouped_music_list */
-               { $$ = $3;
-                 THIS->lexer_->pop_state ();
-               }
-       | FIGURES
-               { THIS->lexer_->push_figuredbass_state (); }
-       /* FIXME: This used to be:
-       Music
-       but that breaks web build
-       */
-       Grouped_music_list
-               {
-                 Music *chm = MY_MAKE_MUSIC ("UntransposableMusic");
-                 chm->set_property ("element", $3->self_scm ());
-                 $$ = chm;
-                 scm_gc_unprotect_object ($3->self_scm ());
+       | FIGUREMODE {
+               THIS->lexer_->push_figuredbass_state ();
 
-                 THIS->lexer_->pop_state ();
+               $$ = ly_symbol2scm ("figures");
        }
-       | CHORDS {
+       | CHORDMODE {
                SCM nn = THIS->lexer_->lookup_identifier ("chordmodifiers");
                THIS->lexer_->chordmodifier_tab_ = alist_to_hashq (nn);
                nn = THIS->lexer_->lookup_identifier ("pitchnames");
                THIS->lexer_->push_chord_state (alist_to_hashq (nn));
+               $$ = ly_symbol2scm ("chords");
 
        }
-       /* FIXME:
-       Music
-*/
-       Grouped_music_list
-       {
-                 Music *chm = MY_MAKE_MUSIC ("UnrelativableMusic");
-                 chm->set_property ("element", $3->self_scm ());
-                 scm_gc_unprotect_object ($3->self_scm ());
-                 $$ = chm;
+       | LYRICMODE
+               { THIS->lexer_->push_lyric_state ();
+               $$ = ly_symbol2scm ("lyrics");
+       }
+       ;
 
-                 THIS->lexer_->pop_state ();
+mode_changing_head_with_context: 
+       DRUMS {
+               SCM nn = THIS->lexer_->lookup_identifier ("drumPitchNames");
+               THIS->lexer_->push_note_state (alist_to_hashq (nn));
+
+               $$ = ly_symbol2scm ("DrumStaff");
        }
-       | LYRICS
-               { THIS->lexer_->push_lyric_state (); }
-       /* FIXME:
-       Music
-*/
-       Grouped_music_list
-               {
-                 $$ = $3;
-                 THIS->lexer_->pop_state ();
+       | FIGURES {
+               THIS->lexer_->push_figuredbass_state ();
+
+               $$ = ly_symbol2scm ("FiguredBass");
        }
-       | relative_music        { $$ = $1; }
-       | re_rhythmed_music     { $$ = $1; }
-       | TAG embedded_scm Music {
-               tag_music ($3, $2, THIS->here_input ());
-               $$ = $3;
+       | CHORDS {
+               SCM nn = THIS->lexer_->lookup_identifier ("chordmodifiers");
+               THIS->lexer_->chordmodifier_tab_ = alist_to_hashq (nn);
+               nn = THIS->lexer_->lookup_identifier ("pitchnames");
+               THIS->lexer_->push_chord_state (alist_to_hashq (nn));
+               $$ = ly_symbol2scm ("ChordNames");
+       }
+       | LYRICS
+               { THIS->lexer_->push_lyric_state ();
+               $$ = ly_symbol2scm ("Lyrics");
        }
        ;
 
+
 relative_music:
        RELATIVE absolute_pitch Music {
                Music *m = $3;
@@ -1171,30 +1210,26 @@ relative_music:
        }
        | RELATIVE Composite_music {
                Music *m = $2;
-               /* FIXME: why is octave==0 and default not middleC? */
-               Pitch middle_c (-1, 0, 0);
+
+               Pitch middle_c (0, 0, 0);
                $$ = make_music_relative (middle_c, m);
                scm_gc_unprotect_object (m->self_scm ());
        }
        ;
 
 new_lyrics:
-       NEWLYRICS { THIS->lexer_->push_lyric_state (); }
+       ADDLYRICS { THIS->lexer_->push_lyric_state (); }
        /*cont */
        Grouped_music_list {
        /* Can also use Music at the expensive of two S/Rs similar to
            \repeat \alternative */
                THIS->lexer_->pop_state ();
-#if 0
-               Music *music = MY_MAKE_MUSIC ("SimultaneousMusic");
-               music->set_property ("elements", scm_list_1 ($3->self_scm ()));
-               $$ = music;
-#else
+
                $$ = scm_cons ($3->self_scm (), SCM_EOL);
-#endif
        }
-       | new_lyrics NEWLYRICS { THIS->lexer_->push_lyric_state (); }
-       Grouped_music_list {
+       | new_lyrics ADDLYRICS {
+               THIS->lexer_->push_lyric_state ();
+       } Grouped_music_list {
                THIS->lexer_->pop_state ();
                $$ = scm_cons ($4->self_scm (), $1);
        }
@@ -1203,19 +1238,18 @@ new_lyrics:
 re_rhythmed_music:
        Grouped_music_list new_lyrics {
 
-               /* FIXME: should find out uniqueXXX name from music */
                SCM name = $1->get_property ("context-id");
                //if (name == SCM_EOL)
-               if (!ly_c_string_p (name))
+               if (!scm_is_string (name))
                        name = scm_makfrom0str ("");
 
                SCM context = scm_makfrom0str ("Lyrics");
                Music *all = MY_MAKE_MUSIC ("SimultaneousMusic");
 
                SCM lst = SCM_EOL;
-               for (SCM s = $2; ly_c_pair_p (s); s = ly_cdr (s))
+               for (SCM s = $2; scm_is_pair (s); s = scm_cdr (s))
                {
-                       Music *music = unsmob_music (ly_car (s));
+                       Music *music = unsmob_music (scm_car (s));
                        Music *com = make_lyric_combine_music (name, music);
                        Music *csm = context_spec_music (context,
                                get_next_unique_context (), com, SCM_EOL);
@@ -1228,9 +1262,12 @@ re_rhythmed_music:
                $$ = all;
                scm_gc_unprotect_object ($1->self_scm ());
        }
-       | LYRICSTO string Music {
-               Music *music = $3;
-               SCM name = $2;
+       | LYRICSTO {
+               THIS->lexer_->push_lyric_state ();
+       } simple_string Music {
+               THIS->lexer_->pop_state ();
+               Music *music = $4;
+               SCM name = $3;
                $$ = make_lyric_combine_music (name, music);
                scm_gc_unprotect_object (music->self_scm ());
        }
@@ -1267,8 +1304,7 @@ property_operation:
        ;
 
 context_def_mod:
-       CONSISTSEND { $$ = ly_symbol2scm ("consists-end"); }
-       | CONSISTS { $$ = ly_symbol2scm ("consists"); }
+       CONSISTS { $$ = ly_symbol2scm ("consists"); }
        | REMOVE { $$ = ly_symbol2scm ("remove"); }
 
        | ACCEPTS { $$ = ly_symbol2scm ("accepts"); }
@@ -1289,6 +1325,11 @@ context_mod:
 
 context_prop_spec:
        simple_string {
+               if (!is_regular_identifier ($1))
+               {
+                       THIS->here_input ().error (_("Grob name should be alphanumeric"));
+               }
+
                $$ = scm_list_2 (ly_symbol2scm ("Bottom"),
                        scm_string_to_symbol ($1));
        }
@@ -1302,30 +1343,30 @@ music_property_def:
        OVERRIDE context_prop_spec embedded_scm '=' scalar {
                $$ = property_op_to_music (scm_list_4 (
                        ly_symbol2scm ("poppush"),
-                       ly_cadr ($2),
+                       scm_cadr ($2),
                        $3, $5));
-               $$= context_spec_music (ly_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
+               $$= context_spec_music (scm_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
        }
        | REVERT context_prop_spec embedded_scm {
                $$ = property_op_to_music (scm_list_3 (
                        ly_symbol2scm ("pop"),
-                       ly_cadr ($2),
+                       scm_cadr ($2),
                        $3));
 
-               $$= context_spec_music (ly_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
+               $$= context_spec_music (scm_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
        }
        | SET context_prop_spec '=' scalar {
                $$ = property_op_to_music (scm_list_3 (
                        ly_symbol2scm ("assign"),
-                       ly_cadr ($2),
+                       scm_cadr ($2),
                        $4));
-               $$= context_spec_music (ly_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
+               $$= context_spec_music (scm_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
        }
        | UNSET context_prop_spec {
                $$ = property_op_to_music (scm_list_2 (
                        ly_symbol2scm ("unset"),
-                       ly_cadr ($2)));
-               $$= context_spec_music (ly_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
+                       scm_cadr ($2)));
+               $$= context_spec_music (scm_car ($2), SCM_UNDEFINED, $$, SCM_EOL);
        }
        | ONCE music_property_def {
                SCM e = $2->get_property ("element");
@@ -1349,21 +1390,27 @@ string:
        ;
 
 simple_string: STRING {
+               $$ = $1;
        }
        | LYRICS_STRING {
+               $$ = $1;
        }
        ;
 
 scalar: string {
+               $$ = $1;
        }
        | LYRICS_STRING {
+               $$ = $1;
        }
         | bare_int {
                $$ = scm_int2num ($1);
        }
         | embedded_scm {
+               $$ = $1;
        }
        | full_markup {
+               $$ = $1;
        }
        | DIGIT {
                $$ = scm_int2num ($1);
@@ -1371,9 +1418,8 @@ scalar: string {
        ;
 
 /*
-FIXME: remove or fix this comment.  What is `This'?
 
-This is a trick:
+pre_events doesn't contain anything. It is a trick:
 
 Adding pre_events to the simple_element
 makes the choice between
@@ -1416,8 +1462,8 @@ note_chord_element:
                SCM es = $1->get_property ("elements");
                SCM postevs = scm_reverse_x ($3, SCM_EOL);
 
-               for (SCM s = es; ly_c_pair_p (s); s = ly_cdr (s))
-                 unsmob_music (ly_car (s))->set_property ("duration", dur);
+               for (SCM s = es; scm_is_pair (s); s = scm_cdr (s))
+                 unsmob_music (scm_car (s))->set_property ("duration", dur);
                es = ly_append2 (es, postevs);
 
                $1-> set_property ("elements", es);
@@ -1455,19 +1501,31 @@ chord_body_elements:
        ;
 
 chord_body_element:
-       pitch exclamations questions post_events
+       pitch  exclamations questions octave_check post_events
        {
+               int q = $3;
+               int ex = $2;
+               SCM check = $4;
+               SCM post = $5;
+
                Music *n = MY_MAKE_MUSIC ("NoteEvent");
                n->set_property ("pitch", $1);
-               if ($3 % 2)
+               if (q % 2)
                        n->set_property ("cautionary", SCM_BOOL_T);
-               if ($2 % 2 || $3 % 2)
+               if (ex % 2 || q % 2)
                        n->set_property ("force-accidental", SCM_BOOL_T);
 
-               if (ly_c_pair_p ($4)) {
-                       SCM arts = scm_reverse_x ($4, SCM_EOL);
+               if (scm_is_pair (post)) {
+                       SCM arts = scm_reverse_x (post, SCM_EOL);
                        n->set_property ("articulations", arts);
                }
+               if (scm_is_number (check))
+               {
+                       int q = scm_to_int (check);
+                       n->set_property ("absolute-octave", scm_int2num (q-1));
+               }
+
+               
                $$ = n;
        }
        | DRUM_PITCH post_events {
@@ -1476,7 +1534,7 @@ chord_body_element:
                n->set_property ("drum-type", $1);
                n->set_spot (THIS->here_input ());
 
-               if (ly_c_pair_p ($2)) {
+               if (scm_is_pair ($2)) {
                        SCM arts = scm_reverse_x ($2, SCM_EOL);
                        n->set_property ("articulations", arts);
                }
@@ -1509,24 +1567,11 @@ command_element:
                $$ = skip;
        }
        | QUOTE STRING duration_length {
-               SCM tab = THIS->lexer_->lookup_identifier ("musicQuotes");
-               SCM evs = SCM_EOL;
-               if (scm_hash_table_p (tab) == SCM_BOOL_T)
-               {
-                       SCM key = $2; // use symbol?
-                       evs = scm_hash_ref (tab, key, SCM_BOOL_F);
-               }
-               Music *quote = 0;
-               if (ly_c_vector_p (evs))
-               {
-                       quote = MY_MAKE_MUSIC ("QuoteMusic");
-                       quote->set_property ("duration", $3);
-                       quote->set_property ("quoted-events", evs);
-               } else {
-                       THIS->here_input ().warning (_f ("Can\'t find music"));
-                       quote = MY_MAKE_MUSIC ("Event");
-               }
+               Music *quote = MY_MAKE_MUSIC ("QuoteMusic");
+               quote->set_property ("duration", $3);
+               quote->set_property ("quoted-music-name", $2);
                quote->set_spot (THIS->here_input ());
+
                $$ = quote;
        }
        | OCTAVE { THIS->push_spot (); }
@@ -1571,8 +1616,10 @@ command_element:
                $$->set_spot (THIS->here_input ());
        }
        | TRANSPOSITION pitch {
+               Pitch middle_c;
+               Pitch sounds_as_c = pitch_interval (*unsmob_pitch ($2), middle_c);
                $$ = set_property_music (ly_symbol2scm ("instrumentTransposition"),
-                                       $2);
+                                        sounds_as_c.smobbed_copy());
                $$->set_spot (THIS-> here_input ());
                $$ = context_spec_music (ly_symbol2scm ("Staff"), SCM_UNDEFINED,
                        $$, SCM_EOL);
@@ -1606,7 +1653,7 @@ command_element:
        | TIME_T fraction  {
                SCM proc= ly_scheme_function ("make-time-signature-set");
 
-               SCM result = scm_apply_2   (proc, ly_car ($2), ly_cdr ($2), SCM_EOL);
+               SCM result = scm_apply_2   (proc, scm_car ($2), scm_cdr ($2), SCM_EOL);
                scm_gc_protect_object (result);
                $$ = unsmob_music (result);
        }
@@ -1710,45 +1757,53 @@ string_number_event:
        }
        ;
 
-
-direction_less_event:
+direction_less_char:
        '['  {
-
-
-/*
-
-TODO: should take all these defs out of the parser, adn make use
-configurable, i.e.
-
-
-(set-articulation '~ "trill")
-
-*/
-               Music *m = MY_MAKE_MUSIC ("BeamEvent");
-               m->set_spot (THIS->here_input ());
-               m->set_property ("span-direction", scm_int2num (START));
-               $$ = m;
+               $$ = ly_symbol2scm ("bracketOpenSymbol");
        }
        | ']'  {
-               Music *m = MY_MAKE_MUSIC ("BeamEvent");
-               m->set_spot (THIS->here_input ());
-               m->set_property ("span-direction", scm_int2num (STOP));
-               $$ = m;
+               $$ = ly_symbol2scm ("bracketCloseSymbol"); 
        }
-       | '~' {
-               Music *m = MY_MAKE_MUSIC ("TieEvent");
-               m->set_spot (THIS->here_input ());
-               $$ = m;
+       | '~'  {
+               $$ = ly_symbol2scm ("tildeSymbol");
        }
-       | close_event {
-               $$ = $1;
-               dynamic_cast<Music *> ($$)->set_property ("span-direction",
-                       scm_int2num (START));
+       | '('  {
+               $$ = ly_symbol2scm ("parenthesisOpenSymbol");
        }
-       | open_event {
-               $$ = $1;
-               dynamic_cast<Music *> ($$)->set_property ("span-direction",
-                       scm_int2num (STOP));
+       | ')'  {
+               $$ = ly_symbol2scm ("parenthesisCloseSymbol");
+       }
+       | E_EXCLAMATION  {
+               $$ = ly_symbol2scm ("escapedExclamationSymbol");
+       }
+       | E_OPEN  {
+               $$ = ly_symbol2scm ("escapedParenthesisOpenSymbol");
+       }
+       | E_CLOSE  {
+               $$ = ly_symbol2scm ("escapedParenthesisCloseSymbol");
+       }
+       | E_BIGGER  {
+               $$ = ly_symbol2scm ("escapedBiggerSymbol");
+       }
+       | E_SMALLER  {
+               $$ = ly_symbol2scm ("escapedSmallerSymbol");
+       }
+       ;
+
+direction_less_event:
+       direction_less_char {
+               SCM predefd = THIS->lexer_->lookup_identifier_symbol ($1);
+               Music * m = 0;
+               if (unsmob_music (predefd))
+               {
+                       m = unsmob_music (predefd)->clone ();
+               }
+               else
+               {
+                       m = MY_MAKE_MUSIC ("Music");
+               }
+               m->set_spot (THIS->here_input ());
+               $$ = m;         
        }
        | EVENT_IDENTIFIER      {
                $$ = unsmob_music ($1);
@@ -1768,7 +1823,7 @@ direction_reqd_event:
        | script_abbreviation {
                SCM s = THIS->lexer_->lookup_identifier ("dash" + ly_scm2string ($1));
                Music *a = MY_MAKE_MUSIC ("ArticulationEvent");
-               if (ly_c_string_p (s))
+               if (scm_is_string (s))
                        a->set_property ("articulation-type", s);
                else THIS->parser_error (_ ("Expecting string as script definition"));
                $$ = a;
@@ -1848,52 +1903,6 @@ pitch_also_in_chords:
        | steno_tonic_pitch
        ;
 
-close_event:
-       '('     {
-               Music *s = MY_MAKE_MUSIC ("SlurEvent");
-               $$ = s;
-               s->set_spot (THIS->here_input ());
-       }
-       | E_OPEN        {
-               Music *s = MY_MAKE_MUSIC ("PhrasingSlurEvent");
-               $$ = s;
-               s->set_spot (THIS->here_input ());
-       }
-       | E_SMALLER {
-               Music *s = MY_MAKE_MUSIC ("CrescendoEvent");
-               $$ = s;
-               s->set_spot (THIS->here_input ());
-       }
-       | E_BIGGER {
-               Music *s = MY_MAKE_MUSIC ("DecrescendoEvent");
-               $$ = s;
-               s->set_spot (THIS->here_input ());
-       }
-       ;
-
-
-open_event:
-       E_EXCLAMATION   {
-               Music *s = MY_MAKE_MUSIC ("CrescendoEvent");
-               s->set_spot (THIS->here_input ());
-
-               $$ = s;
-       }
-       | ')'   {
-               Music *s= MY_MAKE_MUSIC ("SlurEvent");
-               $$ = s;
-               s->set_spot (THIS->here_input ());
-
-       }
-       | E_CLOSE       {
-               Music *s= MY_MAKE_MUSIC ("PhrasingSlurEvent");
-               $$ = s;
-               s->set_property ("span-type",
-                       scm_makfrom0str ("phrasing-slur"));
-               s->set_spot (THIS->here_input ());
-       }
-       ;
-
 gen_text_def:
        full_markup {
                Music *t = MY_MAKE_MUSIC ("TextScriptEvent");
@@ -2001,7 +2010,7 @@ multiplied_duration:
                $$ = unsmob_duration ($$)->compressed ( $3) .smobbed_copy ();
        }
        | multiplied_duration '*' FRACTION {
-               Rational  m (ly_scm2int (ly_car ($3)), ly_scm2int (ly_cdr ($3)));
+               Rational  m (scm_to_int (scm_car ($3)), scm_to_int (scm_cdr ($3)));
 
                $$ = unsmob_duration ($$)->compressed (m).smobbed_copy ();
        }
@@ -2072,7 +2081,7 @@ bass_figure:
                Music *m = unsmob_music ($1);
                if ($2) {
                        SCM salter = m->get_property ("alteration");
-                       int alter = ly_c_number_p (salter) ? ly_scm2int (salter) : 0;
+                       int alter = scm_is_number (salter) ? scm_to_int (salter) : 0;
                        m->set_property ("alteration",
                                scm_int2num (alter + $2));
                } else {
@@ -2135,9 +2144,9 @@ simple_element:
                n->set_property ("pitch", $1);
                n->set_property ("duration", $5);
 
-               if (ly_c_number_p ($4))
+               if (scm_is_number ($4))
                {
-                       int q = ly_scm2int ($4);
+                       int q = scm_to_int ($4);
                        n->set_property ("absolute-octave", scm_int2num (q-1));
                }
 
@@ -2173,9 +2182,9 @@ simple_element:
                Music *m = unsmob_music ($1);
                Input i = THIS->pop_spot ();
                m->set_spot (i);
-               for (SCM s = m->get_property ("elements"); ly_c_pair_p (s); s = ly_cdr (s))
+               for (SCM s = m->get_property ("elements"); scm_is_pair (s); s = scm_cdr (s))
                {
-                       unsmob_music (ly_car (s))->set_property ("duration", $2);
+                       unsmob_music (scm_car (s))->set_property ("duration", $2);
                }
                $$ = m;
        }       
@@ -2237,8 +2246,10 @@ simple_element:
 lyric_element:
        /* FIXME: lyric flavoured markup would be better */
        full_markup {
+               $$ = $1;
        }
        | LYRICS_STRING {
+               $$ = make_simple_markup (THIS->lexer_->encoding (), $1);
        }
        ;
 
@@ -2354,10 +2365,10 @@ bare_number:
                $$ = $1;
        }
        | REAL NUMBER_IDENTIFIER        {
-               $$ = scm_make_real (ly_scm2double ($1) *ly_scm2double ($2));
+               $$ = scm_make_real (scm_to_double ($1) *scm_to_double ($2));
        }
        | UNSIGNED NUMBER_IDENTIFIER    {
-               $$ = scm_make_real ($1 *ly_scm2double ($2));
+               $$ = scm_make_real ($1 *scm_to_double ($2));
        }
        ;
 
@@ -2375,7 +2386,7 @@ bare_int:
        bare_number {
                if (scm_integer_p ($1) == SCM_BOOL_T)
                {
-                       int k = ly_scm2int ($1);
+                       int k = scm_to_int ($1);
                        $$ = k;
                } else
                {
@@ -2490,7 +2501,7 @@ markup_list_body:
 %%
 
 void
-My_lily_parser::set_yydebug (bool )
+Lily_parser::set_yydebug (bool )
 {
 #if 0
        yydebug = 1;
@@ -2498,7 +2509,7 @@ My_lily_parser::set_yydebug (bool )
 }
 
 void
-My_lily_parser::do_yyparse ()
+Lily_parser::do_yyparse ()
 {
        yyparse ((void*)this);
 }
@@ -2516,7 +2527,7 @@ skipTypesetting speeds it up a lot.
 */
 
 void
-My_lily_parser::beam_check (SCM dur)
+Lily_parser::beam_check (SCM dur)
 {
   Duration *d = unsmob_duration (dur);
   if (unsmob_music (last_beam_start_) && d->duration_log () <= 2)
@@ -2537,12 +2548,12 @@ otherwise, we have to import music classes into the lexer.
 
 */
 int
-My_lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
+Lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
 {
-       if (ly_c_string_p (sid)) {
+       if (scm_is_string (sid)) {
                *destination = sid;
                return STRING_IDENTIFIER;
-       } else if (ly_c_number_p (sid)) {
+       } else if (scm_is_number (sid)) {
                *destination = sid;
                return NUMBER_IDENTIFIER;
        } else if (unsmob_context_def (sid)) {
@@ -2568,7 +2579,7 @@ My_lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
 
                *destination = p->self_scm ();
                return OUTPUT_DEF_IDENTIFIER;
-       } else if (Text_item::markup_p (sid)) {
+       } else if (Text_interface::markup_p (sid)) {
                *destination = sid;
                return MARKUP_IDENTIFIER;
        }
@@ -2580,9 +2591,9 @@ Music *
 property_op_to_music (SCM op)
 {
        Music *m = 0;
-       SCM tag = ly_car (op);
-       SCM symbol = ly_cadr (op);
-       SCM args = ly_cddr (op);
+       SCM tag = scm_car (op);
+       SCM symbol = scm_cadr (op);
+       SCM args = scm_cddr (op);
        SCM grob_val = SCM_UNDEFINED;
        SCM grob_sym = SCM_UNDEFINED;
        SCM val = SCM_UNDEFINED;
@@ -2590,7 +2601,7 @@ property_op_to_music (SCM op)
        if (tag == ly_symbol2scm ("assign"))
                {
                m = MY_MAKE_MUSIC ("PropertySet");
-               val = ly_car (args);
+               val = scm_car (args);
                }
        else if (tag == ly_symbol2scm ("unset"))
                m = MY_MAKE_MUSIC ("PropertyUnset");
@@ -2598,12 +2609,12 @@ property_op_to_music (SCM op)
                 || tag == ly_symbol2scm ("push"))
                {
                m = MY_MAKE_MUSIC ("OverrideProperty");
-               grob_sym = ly_car (args);
-               grob_val = ly_cadr (args);
+               grob_sym = scm_car (args);
+               grob_val = scm_cadr (args);
                }
        else if (tag == ly_symbol2scm ("pop")) {
                m = MY_MAKE_MUSIC ("RevertProperty");
-               grob_sym = ly_car (args);
+               grob_sym = scm_car (args);
                }
 
        m->set_property ("symbol", symbol);
@@ -2642,14 +2653,17 @@ context_spec_music (SCM type, SCM id, Music *m, SCM ops)
        scm_gc_unprotect_object (m->self_scm ());
 
        csm->set_property ("context-type",
-               ly_c_symbol_p (type) ? type : scm_string_to_symbol (type));
+               scm_is_symbol (type) ? type : scm_string_to_symbol (type));
        csm->set_property ("property-operations", ops);
 
-       if (ly_c_string_p (id))
+       if (scm_is_string (id))
                csm->set_property ("context-id", id);
        return csm;
 }
 
+/*
+FIXME: this should be postponed until the music hits \Score
+*/
 SCM
 get_next_unique_context ()
 {