From f7437fd4f26ab6ca5b2814f08938d66c80544ed2 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Wed, 21 Dec 2011 17:36:45 +0100 Subject: [PATCH] Tie LilyPond, lexer and parser together more type-safely. --- lily/GNUmakefile | 1 + lily/include/lily-lexer.hh | 3 ++- lily/include/lily-parser.hh | 3 ++- lily/lexer.ll | 6 ++---- lily/parser.yy | 28 +++++++++++++++++----------- 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lily/GNUmakefile b/lily/GNUmakefile index 71073ce6af..d784760d9c 100644 --- a/lily/GNUmakefile +++ b/lily/GNUmakefile @@ -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) diff --git a/lily/include/lily-lexer.hh b/lily/include/lily-lexer.hh index 79aee379fe..098dfe833e 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -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_; diff --git a/lily/include/lily-parser.hh b/lily/include/lily-parser.hh index 5d414c4602..0281da55fd 100644 --- a/lily/include/lily-parser.hh +++ b/lily/include/lily-parser.hh @@ -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; diff --git a/lily/lexer.ll b/lily/lexer.ll index 2ef59f43f5..c4ba231c51 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -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 ()); diff --git a/lily/parser.yy b/lily/parser.yy index 86973f3ae1..8ddf0c7afd 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -22,11 +22,9 @@ #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 (); -- 2.39.2