]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/parser.yy
Tie LilyPond, lexer and parser together more type-safely.
[lilypond.git] / lily / parser.yy
index 728bc6619372ebe677a6a8acae2cff8b59756375..8ddf0c7afd72fcf1f3309abb6fbe18057c9cc0d2 100644 (file)
 
 #define YYDEBUG 1
 #define YYERROR_VERBOSE 1
-#define YYPARSE_PARAM my_lily_parser
-#define YYLEX_PARAM my_lily_parser
-#define PARSER ((Lily_parser *) my_lily_parser)
+#define PARSER parser
 
-#define yyerror PARSER->parser_error
+#define yyerror Lily_parser::parser_error
 
 /* We use custom location type: Input objects */
 #define YYLTYPE Input
@@ -36,6 +34,9 @@
 
 %}
 
+%parse-param {Lily_parser *parser}
+%lex-param {Lily_parser *parser}
+
 /* We use SCMs to do strings, because it saves us the trouble of
 deleting them.  Let's hope that a stack overflow doesnt trigger a move
 of the parse stack onto the heap. */
@@ -135,6 +136,12 @@ using namespace std;
 #include "text-interface.hh"
 #include "warn.hh"
 
+void
+Lily_parser::parser_error (Input const *i, Lily_parser *parser, string s)
+{
+       parser->parser_error (*i, s);
+}
+
 #define MYBACKUP(Token, Value, Location)                               \
 do                                                                     \
        if (yychar == YYEMPTY)                                          \
@@ -213,7 +220,7 @@ SCM make_chord_step (int step, Rational alter);
 SCM make_simple_markup (SCM a);
 bool is_duration (int t);
 bool is_regular_identifier (SCM id);
-int yylex (YYSTYPE *s, YYLTYPE *loc, void *v);
+int yylex (YYSTYPE *s, YYLTYPE *loc, Lily_parser *parser);
 void set_music_properties (Music *p, SCM a);
 
 %}
@@ -344,7 +351,6 @@ If we give names, Bison complains.
 %token <scm> FRACTION
 %token <scm> LYRICS_STRING
 %token <scm> LYRIC_ELEMENT
-%token <scm> LYRIC_ELEMENT_P
 %token <scm> LYRIC_MARKUP_IDENTIFIER
 %token <scm> MARKUP_FUNCTION
 %token <scm> MARKUP_LIST_FUNCTION
@@ -821,7 +827,7 @@ context_def_spec_body:
                                td->add_context_mod (scm_car (p));
                        }
                } else {
-                       PARSER->parser_error (@2, "context-mod expected");
+                       PARSER->parser_error (@2, _ ("not a context mod"));
                }
        }
        | context_def_spec_body context_mod {
@@ -1187,7 +1193,7 @@ context_modification:
                if (unsmob_context_mod ($2))
                        $$ = $2;
                else {
-                       PARSER->parser_error (@2, "context-mod expected");
+                       PARSER->parser_error (@2, _ ("not a context mod"));
                        $$ = Context_mod ().smobbed_copy ();
                }
        }
@@ -1215,6 +1221,13 @@ context_mod_list:
                  if (md)
                      unsmob_context_mod ($1)->add_context_mods (md->get_mods ());
         }
+       | context_mod_list embedded_scm {
+               Context_mod *md = unsmob_context_mod ($2);
+               if (md)
+                       unsmob_context_mod ($1)->add_context_mods (md->get_mods ());
+               else
+                       PARSER->parser_error (@2, _ ("not a context mod"));
+        }
         ;
 
 composite_music:
@@ -1359,10 +1372,10 @@ function_arglist_backup:
                // well: see how we do this at the mandatory argument
                // point.
                if (scm_is_true (scm_call_1 ($2, $4)))
-                       $$ = scm_cons ($3, $2);
+                       $$ = scm_cons ($4, $3);
                else {
                        $$ = scm_cons (loc_on_music (@3, $1), $3);
-                       MYBACKUP (LYRIC_MARKUP_IDENTIFIER, $4, @4);
+                       MYBACKUP (LYRICS_STRING, $4, @4);
                }
        }
        | EXPECT_OPTIONAL EXPECT_SCM function_arglist_closed_keep UNSIGNED
@@ -1524,7 +1537,7 @@ function_arglist_common_lyric:
                        if (scm_is_true (scm_call_1 ($1, lyric_event)))
                        {
                                $$ = $2;
-                               MYREPARSE (@3, $1, LYRIC_ELEMENT_P, $3);
+                               MYREPARSE (@3, $1, LYRICS_STRING, $3);
                        } else {
                                $$ = scm_cons ($3, $2);
                        }
@@ -2769,7 +2782,6 @@ lyric_element:
        | LYRICS_STRING {
                $$ = $1;
        }
-       | LYRIC_ELEMENT_P
        ;
 
 lyric_element_arg:
@@ -3014,7 +3026,7 @@ markup_scm:
                else if (Text_interface::is_markup_list ($1))
                        MYBACKUP (MARKUPLIST_IDENTIFIER, $1, @1);
                else {
-                       PARSER->parser_error (@1, _("markup expected"));
+                       PARSER->parser_error (@1, _ ("not a markup"));
                        MYBACKUP (MARKUP_IDENTIFIER, scm_string (SCM_EOL), @1);
                }
        } BACKUP
@@ -3155,7 +3167,7 @@ Lily_parser::set_yydebug (bool x)
 void
 Lily_parser::do_yyparse ()
 {
-       yyparse ((void*)this);
+       yyparse (this);
 }
 
 
@@ -3253,7 +3265,7 @@ get_next_unique_lyrics_context_id ()
        return scm_from_locale_string (s);
 }
 
-SCM check_scheme_arg (Lily_parser *my_lily_parser, Input loc,
+SCM check_scheme_arg (Lily_parser *parser, Input loc,
                      SCM arg, SCM args, SCM pred)
 {
        args = scm_cons (arg, args);
@@ -3344,12 +3356,11 @@ make_chord_elements (SCM pitch, SCM dur, SCM modification_list)
 }
 
 int
-yylex (YYSTYPE *s, YYLTYPE *loc, void *v)
+yylex (YYSTYPE *s, YYLTYPE *loc, Lily_parser *parser)
 {
-       Lily_parser *pars = (Lily_parser*) v;
-       Lily_lexer *lex = pars->lexer_;
+       Lily_lexer *lex = parser->lexer_;
 
-       lex->lexval_ = (void*) s;
+       lex->lexval_ = s;
        lex->lexloc_ = loc;
        lex->prepare_for_next_token ();
        return lex->yylex ();