]> git.donarmstrong.com Git - lilypond.git/commitdiff
Tie LilyPond, lexer and parser together more type-safely.
authorDavid Kastrup <dak@gnu.org>
Wed, 21 Dec 2011 16:36:45 +0000 (17:36 +0100)
committerDavid Kastrup <dak@gnu.org>
Sat, 24 Dec 2011 14:12:47 +0000 (15:12 +0100)
lily/GNUmakefile
lily/include/lily-lexer.hh
lily/include/lily-parser.hh
lily/lexer.ll
lily/parser.yy

index 71073ce6af644851910f36d130f2cde46e6e9e15..d784760d9c0315dece3669cd71985f28661b88cf 100644 (file)
@@ -66,6 +66,7 @@ endif
 $(outdir)/lily-parser.o $(outdir)/parser.o: $(outdir)/parser.hh
 $(outdir)/lily-lexer.o: $(outdir)/parser.hh $(outdir)/FlexLexer.h
 $(outdir)/lexer.o: $(outdir)/parser.hh $(outdir)/version.hh
+$(outdir)/lily-lexer-scheme.o $(outdir)/lily-parser-scheme.o: $(outdir)/parser.hh
 
 ifneq ($(FLEXLEXER_FILE),)
 $(outdir)/FlexLexer.h: $(FLEXLEXER_FILE) $(config_h)
index 79aee379fe4cd16de5e9c2a635128c69616dddbe..098dfe833e5aed5fd0a96927d6387e88519315cc 100644 (file)
@@ -25,6 +25,7 @@
 #include "input.hh"
 #include "duration.hh"
 #include "pitch.hh"
+#include "parser.hh"
 
 bool busy_parsing ();
 void kill_lexer ();
@@ -65,7 +66,7 @@ private:
 public:
   SCM eval_scm (SCM);
   SCM extra_tokens_;
-  void *lexval_;
+  YYSTYPE *lexval_;
   Input *lexloc_;
   bool is_main_input_;
 
index 5d414c4602943f7a644b8a509ff280dfd6b9e613..0281da55fdeed6f1045eaa30920574c2af14e3e3 100644 (file)
@@ -33,7 +33,6 @@
 class Lily_parser
 {
   DECLARE_SMOBS (Lily_parser);
-  friend int yyparse (void *);
 
   char const *here_str0 () const;
   Simultaneous_music *get_chord (Pitch tonic,
@@ -68,6 +67,8 @@ public:
   SCM parse_string_expression (string ly_code, string filename, int line);
   void parser_error (string);
   void parser_error (Input const &, string);
+  // The following is called as yyerror
+  static void parser_error (Input const *i, Lily_parser *parser, string s);
   void set_yydebug (bool);
 
   SCM make_scope () const;
index 2ef59f43f5243618951de8eb6d4c0ea90b23b03f..c4ba231c5138927c60be086b4e2ceb9159d35ee2 100644 (file)
@@ -86,11 +86,9 @@ bool is_valid_version (string s);
        yy_push_state (lyric_quote);\
        yylval.string = new string
 
-#define yylval \
-       (*(YYSTYPE*)lexval_)
+#define yylval (*lexval_)
 
-#define yylloc \
-       (*(YYLTYPE*)lexloc_)
+#define yylloc (*lexloc_)
 
 #define YY_USER_ACTION add_lexed_char (YYLeng ());
 
index 86973f3ae1971137259473873da25d79196ea2c7..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);
 
 %}
@@ -3160,7 +3167,7 @@ Lily_parser::set_yydebug (bool x)
 void
 Lily_parser::do_yyparse ()
 {
-       yyparse ((void*)this);
+       yyparse (this);
 }
 
 
@@ -3258,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);
@@ -3349,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 ();