]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
* lily/include/my-lily-parser.hh: rename My_lily -> Lily
[lilypond.git] / lily / parser.yy
index f5ebfa291c1652043a84076e73ef080fb482fb0d..2188cd934ddde3fc3f22e638dfba2632cd7c656e 100644 (file)
@@ -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
 
@@ -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
 
@@ -257,7 +262,6 @@ or
 %token CLEF
 %token COMMANDSPANREQUEST
 %token CONSISTS
-%token CONSISTSEND
 %token CONTEXT
 %token DEFAULT
 %token DENIES
@@ -271,7 +275,6 @@ or
 %token INVALID
 %token KEY
 %token LYRICS
-%token LYRICS_STRING
 %token MARK
 %token MIDI
 %token MULTI_MEASURE_REST
@@ -332,6 +335,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,6 +357,7 @@ 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 
@@ -548,9 +553,6 @@ identifier_init:
                $$ = $1->self_scm ();
                scm_gc_unprotect_object ($$);
        }
-       | full_markup {
-               $$ = $1;
-       }
        | output_def {
                $$ = $1->self_scm ();
                scm_gc_unprotect_object ($$);
@@ -567,14 +569,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:
@@ -667,25 +675,31 @@ score_block:
        ;
 
 score_body:
-       Music   {
+       /**/    {
                $$ = new Score;
        
                $$->set_spot (THIS->here_input ());
-               SCM m = $1->self_scm ();
+       }
+       | SCORE_IDENTIFIER {
+               $$ = new Score ( *unsmob_score ($1));
+               $$->set_spot (THIS->here_input ());
+       }
+       | 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;
-
-       }
-       | SCORE_IDENTIFIER {
-               $$ = new Score ( *unsmob_score ($1));
-               $$->set_spot (THIS->here_input ());
        }
        | score_body lilypond_header    {
                $$->header_ = $2;
@@ -982,6 +996,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 {
@@ -1089,7 +1108,7 @@ Prefix_composite_music:
                SCM nn = THIS->lexer_->lookup_identifier ("pitchnames");
                THIS->lexer_->push_note_state (alist_to_hashq (nn));
        }
-       Music
+       Grouped_music_list
                { $$ = $3;
                  THIS->lexer_->pop_state ();
                }
@@ -1098,18 +1117,12 @@ Prefix_composite_music:
                SCM nn = THIS->lexer_->lookup_identifier ("drumPitchNames");
                THIS->lexer_->push_note_state (alist_to_hashq (nn));
        }
-       /* FIXME: This used to be: */
-       Music
-/*     Grouped_music_list */
+       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");
@@ -1126,9 +1139,6 @@ Prefix_composite_music:
                THIS->lexer_->push_chord_state (alist_to_hashq (nn));
 
        }
-       /* FIXME:
-       Music
-*/
        Grouped_music_list
        {
                  Music *chm = MY_MAKE_MUSIC ("UnrelativableMusic");
@@ -1140,9 +1150,6 @@ Prefix_composite_music:
        }
        | LYRICS
                { THIS->lexer_->push_lyric_state (); }
-       /* FIXME:
-       Music
-*/
        Grouped_music_list
                {
                  $$ = $3;
@@ -1165,8 +1172,8 @@ 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 ());
        }
@@ -1222,9 +1229,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 ());
        }
@@ -1261,8 +1271,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"); }
@@ -1283,6 +1292,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));
        }
@@ -1343,21 +1357,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);
@@ -1365,9 +1385,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
@@ -1449,19 +1468,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 (ly_c_pair_p (post)) {
+                       SCM arts = scm_reverse_x (post, SCM_EOL);
                        n->set_property ("articulations", arts);
                }
+               if (ly_c_number_p (check))
+               {
+                       int q = ly_scm2int (check);
+                       n->set_property ("absolute-octave", scm_int2num (q-1));
+               }
+
+               
                $$ = n;
        }
        | DRUM_PITCH post_events {
@@ -2484,7 +2515,7 @@ markup_list_body:
 %%
 
 void
-My_lily_parser::set_yydebug (bool )
+Lily_parser::set_yydebug (bool )
 {
 #if 0
        yydebug = 1;
@@ -2492,7 +2523,7 @@ My_lily_parser::set_yydebug (bool )
 }
 
 void
-My_lily_parser::do_yyparse ()
+Lily_parser::do_yyparse ()
 {
        yyparse ((void*)this);
 }
@@ -2510,7 +2541,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)
@@ -2531,7 +2562,7 @@ 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)) {
                *destination = sid;