SCM keyword_list () const;
SCM lookup_identifier (const string &s);
SCM lookup_identifier_symbol (SCM s);
- void push_extra_token (int token_type, SCM scm = SCM_UNSPECIFIED);
+ void push_extra_token (Input const &where,
+ int token_type, SCM scm = SCM_UNSPECIFIED);
int pop_extra_token ();
void push_chord_state (SCM alist);
void push_figuredbass_state ();
// value (for token type MARKUP_FUNCTION or
// MARKUP_LIST_FUNCTION).
- push_extra_token(EXPECT_NO_MORE_ARGS);
+ push_extra_token (here_input (), EXPECT_NO_MORE_ARGS);
s = scm_cdr(s);
for (; scm_is_pair(s); s = scm_cdr(s)) {
SCM predicate = scm_car(s);
if (predicate == ly_lily_module_constant ("markup-list?"))
- push_extra_token(EXPECT_MARKUP_LIST);
+ push_extra_token (here_input (), EXPECT_MARKUP_LIST);
else if (predicate == ly_lily_module_constant ("markup?"))
- push_extra_token(EXPECT_MARKUP);
+ push_extra_token (here_input (), EXPECT_MARKUP);
else
- push_extra_token(EXPECT_SCM, predicate);
+ push_extra_token (here_input (), EXPECT_SCM, predicate);
}
return token_type;
}
/* Make the lexer generate a token of the given type as the next token.
TODO: make it possible to define a value for the token as well */
void
-Lily_lexer::push_extra_token (int token_type, SCM scm)
+Lily_lexer::push_extra_token (Input const &where, int token_type, SCM scm)
{
- extra_tokens_ = scm_acons (scm_from_int (token_type), scm, extra_tokens_);
+ extra_tokens_ = scm_cons (scm_cons2 (make_input (where),
+ scm_from_int (token_type),
+ scm), extra_tokens_);
}
int
return -1;
/* produce requested token */
- int type = scm_to_int (scm_caar (extra_tokens_));
- yylval = scm_cdar (extra_tokens_);
+ yylloc = *unsmob_input (scm_caar (extra_tokens_));
+ int type = scm_to_int (scm_cadar (extra_tokens_));
+ yylval = scm_cddar (extra_tokens_);
extra_tokens_ = scm_cdr (extra_tokens_);
return type;
}
funtype = SCM_FUNCTION;
else programming_error ("Bad syntax function predicate");
- push_extra_token (EXPECT_NO_MORE_ARGS);
+ push_extra_token (here_input (), EXPECT_NO_MORE_ARGS);
for (s = scm_cdr (s); scm_is_pair (s); s = scm_cdr (s))
{
SCM optional = SCM_UNDEFINED;
}
if (ly_is_procedure (cs))
- push_extra_token (EXPECT_SCM, cs);
+ push_extra_token (here_input (), EXPECT_SCM, cs);
else
{
programming_error ("Function parameter without type-checking predicate");
continue;
}
if (!scm_is_eq (optional, SCM_UNDEFINED))
- push_extra_token (EXPECT_OPTIONAL, optional);
+ push_extra_token (here_input (), EXPECT_OPTIONAL, optional);
}
return funtype;
}
case '$':
token = scan_scm_id (v);
if (!scm_is_eq (yylval, SCM_UNSPECIFIED))
- push_extra_token (token, yylval);
+ push_extra_token (here_input (),
+ token, yylval);
break;
case '#':
- push_extra_token (SCM_IDENTIFIER, v);
+ push_extra_token (here_input (),
+ SCM_IDENTIFIER, v);
break;
}
}
SCM mod = lexer_->set_current_scope ();
SCM parser = lexer_->lookup_identifier_symbol (ly_symbol2scm ("parser"));
lexer_->set_identifier (ly_symbol2scm ("parser"), self_scm ());
- lexer_->push_extra_token (EMBEDDED_LILY);
+ lexer_->push_extra_token (Input (), EMBEDDED_LILY);
SCM result = do_yyparse ();
lexer_->set_identifier (ly_symbol2scm ("parser"), parser);
#define MYBACKUP(Token, Value, Location) \
do { \
if (yychar != YYEMPTY) \
- parser->lexer_->push_extra_token (yychar, yylval); \
+ parser->lexer_->push_extra_token \
+ (yylloc, yychar, yylval); \
if (Token) \
- parser->lexer_->push_extra_token (Token, Value); \
- parser->lexer_->push_extra_token (BACKUP); \
+ parser->lexer_->push_extra_token \
+ (Location, Token, Value); \
+ parser->lexer_->push_extra_token (Location, BACKUP); \
yychar = YYEMPTY; \
} while (0)
#define MYREPARSE(Location, Pred, Token, Value) \
do { \
if (yychar != YYEMPTY) \
- parser->lexer_->push_extra_token (yychar, yylval); \
- parser->lexer_->push_extra_token (Token, Value); \
- parser->lexer_->push_extra_token (REPARSE, Pred); \
+ parser->lexer_->push_extra_token \
+ (yylloc, yychar, yylval); \
+ parser->lexer_->push_extra_token \
+ (Location, Token, Value); \
+ parser->lexer_->push_extra_token \
+ (Location, REPARSE, Pred); \
yychar = YYEMPTY; \
} while (0)
else {
$$ = scm_cons (loc_on_music (@3, $1), $3);
MYBACKUP (UNSIGNED, $5, @5);
- parser->lexer_->push_extra_token ('-');
+ parser->lexer_->push_extra_token (@4, '-');
}
}
(scm_object_property (scm_car ($1),
ly_symbol2scm ("is-grob?")))) {
$$ = ly_symbol2scm ("Bottom");
- parser->lexer_->push_extra_token (SCM_IDENTIFIER, $1);
+ parser->lexer_->push_extra_token (@1, SCM_IDENTIFIER, $1);
} else {
$$ = scm_car ($1);
- parser->lexer_->push_extra_token (SCM_IDENTIFIER,
+ parser->lexer_->push_extra_token (@1, SCM_IDENTIFIER,
scm_cdr ($1));
}
}