summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kastrup <dak@gnu.org>2011-12-21 17:36:45 +0100
committerDavid Kastrup <dak@gnu.org>2011-12-24 15:12:47 +0100
commitf7437fd4f26ab6ca5b2814f08938d66c80544ed2 (patch)
treeab81f93e4456a282dcdcb5e2d56addc928b82742
parentae9b8d637bae923bf8069f5e0f9bdb327bb98559 (diff)
Tie LilyPond, lexer and parser together more type-safely.
-rw-r--r--lily/GNUmakefile1
-rw-r--r--lily/include/lily-lexer.hh3
-rw-r--r--lily/include/lily-parser.hh3
-rw-r--r--lily/lexer.ll6
-rw-r--r--lily/parser.yy28
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 ();