]> git.donarmstrong.com Git - lilypond.git/commitdiff
Add location data to extra_tokens_ stack in lexer.
authorDavid Kastrup <dak@gnu.org>
Mon, 25 Nov 2013 16:29:23 +0000 (17:29 +0100)
committerDavid Kastrup <dak@gnu.org>
Thu, 19 Dec 2013 11:18:31 +0000 (12:18 +0100)
lily/include/lily-lexer.hh
lily/lexer.ll
lily/lily-parser.cc
lily/parser.yy

index ce428603cb2dce8cd24efc69ace8751194612ff3..9659abbd198634a29efa25be19e9c8ac51ba858c 100644 (file)
@@ -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 ();
index a360de48c137515ad5fd98251921e1e8caf983be..51a33fbb4b2a57b446ef954c4af9c1b962f27003 100644 (file)
@@ -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;
                                }
                        }
index cd7819e9c8d5f6823592e310783025ed15933280..65906beeef4d52cf85ff62652ceed84d8a8c100d 100644 (file)
@@ -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);
index 216ca3b225f7bf359189507b88f11ecd0d7adede..e0019a23c6743ddad7d6b5fed880720a09ab1d4d 100644 (file)
@@ -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));
                }
        }