From: David Kastrup Date: Mon, 25 Nov 2013 16:29:23 +0000 (+0100) Subject: Add location data to extra_tokens_ stack in lexer. X-Git-Tag: release/2.19.0-1~69^2~7 X-Git-Url: https://git.donarmstrong.com/?p=lilypond.git;a=commitdiff_plain;h=3360bbddd21fb58f9ad5ca6268f637f6ca15ae4a Add location data to extra_tokens_ stack in lexer. --- diff --git a/lily/include/lily-lexer.hh b/lily/include/lily-lexer.hh index ce428603cb..9659abbd19 100644 --- a/lily/include/lily-lexer.hh +++ b/lily/include/lily-lexer.hh @@ -93,7 +93,8 @@ public: 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 (); diff --git a/lily/lexer.ll b/lily/lexer.ll index a360de48c1..51a33fbb4b 100644 --- a/lily/lexer.ll +++ b/lily/lexer.ll @@ -686,17 +686,17 @@ BOM_UTF8 \357\273\277 // 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; } @@ -815,9 +815,11 @@ BOM_UTF8 \357\273\277 /* 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 @@ -827,8 +829,9 @@ Lily_lexer::pop_extra_token () 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; } @@ -974,7 +977,7 @@ Lily_lexer::scan_scm_id (SCM sid) 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; @@ -987,14 +990,14 @@ Lily_lexer::scan_scm_id (SCM sid) } 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; } @@ -1106,10 +1109,12 @@ Lily_lexer::eval_scm (SCM readerdata, char extra_token) 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; } } diff --git a/lily/lily-parser.cc b/lily/lily-parser.cc index cd7819e9c8..65906beeef 100644 --- a/lily/lily-parser.cc +++ b/lily/lily-parser.cc @@ -167,7 +167,7 @@ Lily_parser::parse_string_expression (const string &ly_code, const string &filen 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); diff --git a/lily/parser.yy b/lily/parser.yy index 216ca3b225..e0019a23c6 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -155,10 +155,12 @@ Lily_parser::parser_error (Input const *i, Lily_parser *parser, SCM *, const str #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) @@ -166,9 +168,12 @@ Lily_parser::parser_error (Input const *i, Lily_parser *parser, SCM *, const str #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) @@ -1716,7 +1721,7 @@ function_arglist_backup: else { $$ = scm_cons (loc_on_music (@3, $1), $3); MYBACKUP (UNSIGNED, $5, @5); - parser->lexer_->push_extra_token ('-'); + parser->lexer_->push_extra_token (@4, '-'); } } @@ -2515,10 +2520,10 @@ simple_revert_context: (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)); } }