lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: precise input location


From: Nicolas Sceaux
Subject: Re: precise input location
Date: Sun, 09 Jan 2005 17:58:47 +0100
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.3 (gnu/linux)

Nicolas Sceaux <address@hidden> writes:

> Han-Wen Nienhuys <address@hidden> writes:
>
>> I believe bison has builtin support for handling locations (check out
>> the bison manual under Locations). Maybe you could run some experiments
>> whether it's usable for us.

Here is a patch.
The (modest) benefit is that parser errors are more accurate, quoting
the beginning of the faulty expression iso the end.
Point and click may also be more exact.

make web is being running now.

nicolas

Index: ChangeLog
===================================================================
RCS file: /cvsroot/lilypond/lilypond/ChangeLog,v
retrieving revision 1.3042
diff -u -r1.3042 ChangeLog
--- ChangeLog   9 Jan 2005 11:32:52 -0000       1.3042
+++ ChangeLog   9 Jan 2005 15:43:22 -0000
@@ -1,3 +1,44 @@
+2005-01-09  Nicolas Sceaux  <address@hidden>
+
+       * lily/include/input.hh (class Input): new slots for first and
+       last lines and columns.
+
+       * lily/input.cc (Input): Add Input::Input (Input const &) and
+       remove Input::Input (Source_file*, char const *). Init the new
+       slots (first|last)_(line|column)_ in constructors.
+       (set_location): method used by bison to propagate input
+       locations (YYLLOC_DEFAULT).
+
+       * lily/input-smob.cc (ly:input-all-locations): new function,
+       similar to ly:input-location, but also return the end line and
+       column.
+
+       * lily/include/includable-lexer.hh: 
+       * lily/includable-lexer.cc: 
+       * lily/include/lily-lexer.hh (class Lily_lexer): 
+       * lily/lily-lexer.cc (add_lexed_char): Move add_lexed_char from
+       Includable_lexer to Lily_lexer, in order to update lexloc (the
+       yylloc), a new slot of Lily_lexer.
+       (here_input):
+       (LexerError): simplify by using the lexloc slot (aka yylloc)
+
+       * lily/lexer.ll: #define yylloc to use input locations (it may
+       be useless here?). Fixed the #embedded_scm rule (step the location
+       forward in order to skip the sharp sign before parsing the scheme
+       expression)
+
+       * lily/include/lily-parser.hh (class Lily_parser): 
+       * lily/lily-parser.cc: Remove push_spot(), pop_spot() and
+       here_input()
+       (parser_error): overload for more precise locations of errors.
+
+       * lily/parser.yy (YYLTYPE): set location type to Input
+       (YYLLOC_DEFAULT): use Input::set_location()
+       (yylex): add the YYLTYPE* location parameter.
+       Clean push_spot()/pop_spot()/here_input(), and use @$, @1, etc.
+       Give an Input parameter to THIS->parser-error() for more accurate
+       messages.
+       
 2005-01-09  Jan Nieuwenhuizen  <address@hidden>
 
        * scm/output-gnome.scm (utf8-string): New function.
Index: lily/includable-lexer.cc
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/includable-lexer.cc,v
retrieving revision 1.42
diff -u -r1.42 includable-lexer.cc
--- lily/includable-lexer.cc    7 Jan 2005 14:29:58 -0000       1.42
+++ lily/includable-lexer.cc    9 Jan 2005 15:43:23 -0000
@@ -138,15 +138,6 @@
       close_input ();
     }
 }
-/**
-  Since we don't create the buffer state from the bytes directly, we
-  don't know about the location of the lexer. Add this as a
-  YY_USER_ACTION */
-void
-Includable_lexer::add_lexed_char (int count)
-{
-  char_count_stack_.top () += count;
-}
 
 Source_file*
 Includable_lexer::get_source_file () const
Index: lily/input-smob.cc
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/input-smob.cc,v
retrieving revision 1.32
diff -u -r1.32 input-smob.cc
--- lily/input-smob.cc  7 Jan 2005 13:32:54 -0000       1.32
+++ lily/input-smob.cc  9 Jan 2005 15:43:23 -0000
@@ -72,5 +72,17 @@
 }
 
 
+LY_DEFINE (ly_input_all_locations, "ly:input-all-locations", 1, 0, 0, (SCM 
sip),
+         "Return input location in @var{sip} as (file-name first-line 
first-column last-line last-column).")
+{
+  Input *ip = unsmob_input (sip);
+  SCM_ASSERT_TYPE (ip, sip, SCM_ARG1, __FUNCTION__, "input location");
+  return scm_list_5 (scm_makfrom0str (ip->file_string ().to_str0 ()),
+                    scm_int2num (ip->first_line_),
+                    scm_int2num (ip->first_column_),
+                    scm_int2num (ip->last_line_),
+                    scm_int2num (ip->last_column_));
+}
+
 ADD_SCM_INIT_FUNC (input, start_input_smobs);
 
Index: lily/input.cc
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/input.cc,v
retrieving revision 1.8
diff -u -r1.8 input.cc
--- lily/input.cc       9 Dec 2004 00:16:44 -0000       1.8
+++ lily/input.cc       9 Jan 2005 15:43:23 -0000
@@ -13,16 +13,24 @@
 #include "source.hh"
 #include "source-file.hh"
 
-Input::Input (Source_file*s, char const *cl)
+Input::Input (Input const &i)
 {
-  source_file_ = s;
-  defined_str0_ = cl;
+  first_line_ = i.first_line_;
+  first_column_ = i.first_column_;
+  last_line_ = i.last_line_;
+  last_column_ = i.last_column_;
+  source_file_ = i.source_file_;
+  defined_str0_ = i.defined_str0_;
 }
 
 Input::Input ()
 {
   source_file_ = 0;
   defined_str0_ = 0;
+  first_line_ = 0;
+  first_column_ = 0;
+  last_line_ = 0;
+  last_column_ = 0;
 }
 
 Input
@@ -37,6 +45,17 @@
   *this = i;
 }
 
+void
+Input::set_location (Input const &i_start, Input const &i_end)
+{
+  first_line_ = i_start.first_line_;
+  first_column_ = i_start.first_column_;
+  last_line_ = i_end.last_line_;
+  last_column_ = i_end.last_column_;
+  source_file_ = i_start.source_file_;
+  defined_str0_ = i_start.defined_str0_;
+}
+
 /*
   Produce GNU-compliant error message.  Correcting lilypond source is
   such a breeze if you ('re edidor) know (s) the error column too
Index: lily/lexer.ll
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/lexer.ll,v
retrieving revision 1.162
diff -u -r1.162 lexer.ll
--- lily/lexer.ll       7 Jan 2005 14:29:58 -0000       1.162
+++ lily/lexer.ll       9 Jan 2005 15:43:23 -0000
@@ -76,6 +76,9 @@
 #define yylval \
        (*(YYSTYPE*)lexval)
 
+#define yylloc \
+       (*(YYLTYPE*)lexloc)
+
 #define YY_USER_ACTION add_lexed_char (YYLeng ());
 /*
 
@@ -273,9 +276,11 @@
 }
 <INITIAL,markup,chords,lyrics,notes,figures>#  { //embedded scm
        //char const* s = YYText () + 1;
-       char const* s = here_str0 ();
+       char const* s = here_str0 () + 1;
        int n = 0;
-       SCM sval = ly_parse_scm (s, &n, here_input (),
+       Input hi = here_input();
+       hi.defined_str0_ ++;
+       SCM sval = ly_parse_scm (s, &n, hi,
                be_safe_global && main_input_b_);
 
        if (sval == SCM_UNDEFINED)
Index: lily/lily-lexer.cc
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/lily-lexer.cc,v
retrieving revision 1.20
diff -u -r1.20 lily-lexer.cc
--- lily/lily-lexer.cc  7 Jan 2005 14:29:58 -0000       1.20
+++ lily/lily-lexer.cc  9 Jan 2005 15:43:24 -0000
@@ -134,8 +134,6 @@
   delete keytable_;
 }
 
-
-
 void
 Lily_lexer::add_scope (SCM module)
 {
@@ -231,7 +229,7 @@
   else
     {
       error_level_ |= 1;
-      Input spot (get_source_file (), here_str0 ());
+      Input spot (*lexloc);
       spot.error (s);
     }
 }
@@ -256,8 +254,7 @@
 Input
 Lily_lexer::here_input () const
 {
-  Source_file * f = get_source_file ();
-  return Input (f, (char*)here_str0 ());
+  return Input(*lexloc);
 }
 
 void
@@ -266,6 +263,43 @@
   last_input_ = here_input ();
 }
 
+/**
+  Since we don't create the buffer state from the bytes directly, we
+  don't know about the location of the lexer. Add this as a
+  YY_USER_ACTION */
+void
+Lily_lexer::add_lexed_char (int count)
+{
+  lexloc->source_file_ = get_source_file ();
+  lexloc->defined_str0_ = here_str0 ();
+  if (char_count_stack_.top () == 0)
+    {
+      lexloc->first_line_ = 0;
+      lexloc->first_column_ = 0;
+      lexloc->last_line_ = 0;
+      lexloc->last_column_ = 0;
+    }
+  else
+    {
+      lexloc->first_line_ = lexloc->last_line_;
+      lexloc->first_column_ = lexloc->last_column_;
+    }
+  for (int i = 0 ; i < count ; i ++)
+    {
+      if (lexloc->defined_str0_[i] == '\n')
+        {
+          lexloc->last_line_ ++;
+          lexloc->last_column_ = 0;
+        }
+      else
+        {
+          lexloc->last_column_ ++;
+        }
+    }
+  char_count_stack_.top () += count;
+}
+
+
 #include "ly-smobs.icc"
 
 IMPLEMENT_SMOBS (Lily_lexer);
Index: lily/lily-parser.cc
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/lily-parser.cc,v
retrieving revision 1.32
diff -u -r1.32 lily-parser.cc
--- lily/lily-parser.cc 7 Jan 2005 12:49:04 -0000       1.32
+++ lily/lily-parser.cc 9 Jan 2005 15:43:24 -0000
@@ -161,12 +161,6 @@
   lexer_ = 0;
 }
 
-void
-Lily_parser::push_spot ()
-{
-  define_spots_.push (here_input ());
-}
-
 char const *
 Lily_parser::here_str0 () const
 {
@@ -176,42 +170,17 @@
 void
 Lily_parser::parser_error (String s)
 {
-  here_input ().error (s);
+  lexer_->here_input ().error (s);
   error_level_ = 1;
 }
 
-Input
-Lily_parser::pop_spot ()
-{
-  return define_spots_.pop ();
-}
-
-Input
-Lily_parser::here_input () const
+void
+Lily_parser::parser_error (Input const& i, String s)
 {
-  /*
-    Parsing looks ahead , so we really want the previous location of the
-    lexer, not lexer_->here_input ().
-  */
-  
-  /*
-    Actually, that gets very icky when there are white space, because
-    the line-numbers are all wrong.  Let's try the character before
-    the current token. That gets the right result for note/duration
-    stuff, but doesn't mess up for errors in the 1st token of the
-    line.
-  */
-  Input hi (lexer_->here_input ());
-
-  char const * bla = hi.defined_str0_;
-  if (hi.line_number () > 1
-      || hi.column_number () > 1)
-    bla --;
-  
-  return Input (hi.source_file_, bla);
+  i.error (s);
+  error_level_ = 1;
 }
 
-
 /****************************************************************/
 
 
Index: lily/parser.yy
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/parser.yy,v
retrieving revision 1.450
diff -u -r1.450 parser.yy
--- lily/parser.yy      7 Jan 2005 14:29:58 -0000       1.450
+++ lily/parser.yy      9 Jan 2005 15:43:25 -0000
@@ -64,6 +64,12 @@
 
 #define yyerror THIS->parser_error
 
+/* We use custom location type: Input objects */
+#define YYLTYPE Input
+#define YYLLOC_DEFAULT(Current,Rhs,N) \
+       ((Current).set_location ((Rhs)[1], (Rhs)[N]))
+
+
 /* Add symbols to the TAGS field of a music object.  */
 
 void
@@ -213,12 +219,13 @@
 %{
 
 int
-yylex (YYSTYPE *s, void *v)
+yylex (YYSTYPE *s, YYLTYPE *l, void *v)
 {
        Lily_parser *pars = (Lily_parser*) v;
        Lily_lexer *lex = pars->lexer_;
 
        lex->lexval = (void*) s;
+       lex->lexloc = l;
        lex->prepare_for_next_token ();
        return lex->yylex ();
 }
@@ -255,6 +262,7 @@
 
 
 %pure_parser
+%locations
 
 %token ACCEPTS
 %token ADDQUOTE
@@ -549,22 +557,13 @@
        DECLARATIONS
 */
 assignment:
-       STRING {
-               THIS->push_spot ();
-       }
-       /* cont */ '=' identifier_init  {
-
-       /*
-               Should find generic way of associating input with objects.
-       */
-               Input ip = THIS->pop_spot ();
-
+       STRING '=' identifier_init  {
                if (! is_regular_identifier ($1))
                {
-                       ip.warning (_ ("Identifier should have alphabetic 
characters only"));
+                       @1.warning (_ ("Identifier should have alphabetic 
characters only"));
                }
 
-               THIS->lexer_->set_identifier ($1, $4);
+               THIS->lexer_->set_identifier ($1, $3);
 
 /*
  TODO: devise standard for protection in parser.
@@ -625,11 +624,11 @@
 context_def_spec_body:
        /**/ {
                $$ = Context_def::make_scm ();
-               unsmob_context_def ($$)->set_spot (THIS->here_input ());
+               unsmob_context_def ($$)->set_spot (@$);
        }
        | CONTEXT_DEF_IDENTIFIER {
                $$ = $1;
-               unsmob_context_def ($$)->set_spot (THIS->here_input ());
+               unsmob_context_def ($$)->set_spot (@$);
        }
        | context_def_spec_body GROBDESCRIPTIONS embedded_scm {
                Context_def*td = unsmob_context_def ($$);
@@ -650,12 +649,8 @@
 
 
 book_block:
-       BOOK {
-               THIS->push_spot ();
-       }
-       /*cont*/ '{' book_body '}'      {
-               THIS->pop_spot ();
-               $$ = $4;
+       BOOK '{' book_body '}'  {
+               $$ = $3;
        }
        ;
 
@@ -665,7 +660,7 @@
 book_body:
        {
                $$ = new Book;
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
                $$->paper_ = dynamic_cast<Output_def*> (unsmob_output_def 
(THIS->lexer_->lookup_identifier ("$defaultpaper"))->clone ());
                scm_gc_unprotect_object ($$->paper_->self_scm ());
                $$->header_ = THIS->lexer_->lookup_identifier 
("$globalheader"); 
@@ -691,24 +686,19 @@
        ;
 
 score_block:
-       SCORE {
-               THIS->push_spot ();
-       }
-       /*cont*/ '{' score_body '}'     {
-               THIS->pop_spot ();
-               $$ = $4;
+       SCORE '{' score_body '}'        {
+               $$ = $3;
        }
        ;
 
 score_body:
        /**/    {
                $$ = new Score;
-       
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        | SCORE_IDENTIFIER {
                $$ = new Score ( *unsmob_score ($1));
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        | score_body object_id_setting {
                $$->user_key_ = ly_scm2string ($2);
@@ -724,7 +714,7 @@
        | score_body output_def {
                if ($2->lookup_variable (ly_symbol2scm ("is-paper")) == 
SCM_BOOL_T)
                {
-                       THIS->parser_error (_("\\paper cannot be in \\score. 
Use \\layout instead"));
+                       THIS->parser_error (@2, _("\\paper cannot be in 
\\score. Use \\layout instead"));
                
                }
                else
@@ -748,7 +738,7 @@
                $$ = $1;
                if ($$->lookup_variable (ly_symbol2scm ("is-paper")) != 
SCM_BOOL_T)
                {
-                       THIS->parser_error (_("Need \\paper for paper block."));
+                       THIS->parser_error (@1, _("Need \\paper for paper 
block."));
                        $$ = get_paper (THIS);
                }
        }
@@ -767,7 +757,7 @@
 output_def_head:
        PAPER {
                $$ = get_paper (THIS);
-               $$->input_origin_ = THIS->here_input ();
+               $$->input_origin_ = @$;
                THIS->lexer_->add_scope ($$->scope_);
        }
        | MIDI    {
@@ -787,13 +777,13 @@
 output_def_body:
        output_def_head '{' {
                $$ = $1;
-               $$->input_origin_.set_spot (THIS->here_input ());
+               $$->input_origin_.set_spot (@$);
                THIS->lexer_->push_initial_state ();
        }
        | output_def_head '{' OUTPUT_DEF_IDENTIFIER     {
                scm_gc_unprotect_object ($1->self_scm ());
                Output_def *o = unsmob_output_def ($3);
-               o->input_origin_.set_spot (THIS->here_input ());
+               o->input_origin_.set_spot (@$);
                $$ = o;
                THIS->lexer_->remove_scope ();
                THIS->lexer_->add_scope (o->scope_);
@@ -947,12 +937,12 @@
        SEQUENTIAL '{' Music_list '}'           {
                $$ = MY_MAKE_MUSIC ("SequentialMusic");
                $$->set_property ("elements", scm_car ($3));
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        | '{' Music_list '}'            {
                $$ = MY_MAKE_MUSIC ("SequentialMusic");
                $$->set_property ("elements", scm_car ($2));
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        ;
 
@@ -960,13 +950,13 @@
        SIMULTANEOUS '{' Music_list '}'{
                $$ = MY_MAKE_MUSIC ("SimultaneousMusic");
                $$->set_property ("elements", scm_car ($3));
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
 
        }
        | simul_open Music_list simul_close     {
                $$ = MY_MAKE_MUSIC ("SimultaneousMusic");
                $$->set_property ("elements", scm_car ($2));
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        ;
 
@@ -1010,72 +1000,48 @@
 
 Generic_prefix_music_scm:
        MUSIC_FUNCTION {
-               $$ = scm_list_2 ($1, make_input (THIS->here_input ()));
+               $$ = scm_list_2 ($1, make_input (@$));
+       }
+       | MUSIC_FUNCTION_SCM embedded_scm {
+               $$ = scm_list_3 ($1, make_input (@$), $2);
        }
-       | MUSIC_FUNCTION_SCM {
-               THIS->push_spot ();
-       } embedded_scm {
-               $$ = scm_list_3 ($1, make_input (THIS->pop_spot ()), $3);
-       }
-       | MUSIC_FUNCTION_MARKUP {
-               THIS->push_spot ();
-       } full_markup {
-               $$ = scm_list_3 ($1, make_input (THIS->pop_spot ()), $3);
-       }
-       | MUSIC_FUNCTION_MUSIC {
-               THIS->push_spot (); 
-       } Music {
-               $$ = scm_list_3 ($1, make_input (THIS->pop_spot ()), 
$3->self_scm ());
+       | MUSIC_FUNCTION_MARKUP full_markup {
+               $$ = scm_list_3 ($1, make_input (@$), $2);
+       }
+       | MUSIC_FUNCTION_MUSIC Music {
+               $$ = scm_list_3 ($1, make_input (@$), $2->self_scm ());
+               scm_gc_unprotect_object ($2->self_scm ());
+       }
+       | MUSIC_FUNCTION_SCM_MUSIC embedded_scm Music {
+               $$ = scm_list_4 ($1, make_input (@$), $2, $3->self_scm ());
                scm_gc_unprotect_object ($3->self_scm ());
        }
-       | MUSIC_FUNCTION_SCM_MUSIC {
-               THIS->push_spot (); 
-       }  embedded_scm Music {
-               $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, 
$4->self_scm ());
-               scm_gc_unprotect_object ($4->self_scm ());
+       | MUSIC_FUNCTION_SCM_SCM embedded_scm embedded_scm {
+               $$ = scm_list_4 ($1, make_input (@$), $2, $3);
        }
-       | MUSIC_FUNCTION_SCM_SCM {
-               THIS->push_spot (); 
-       }  embedded_scm embedded_scm {
-               $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, $4);
-       }
-       | MUSIC_FUNCTION_SCM_SCM_MUSIC {
-               THIS->push_spot (); 
-       }  embedded_scm embedded_scm Music {
-               $$ = scm_list_5 ($1, make_input (THIS->pop_spot ()), $3, $4, 
$5->self_scm ());
-       }
-       | MUSIC_FUNCTION_MARKUP_MUSIC {
-               THIS->push_spot (); 
-       }  full_markup Music {
-               $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, 
$4->self_scm ());
-               scm_gc_unprotect_object ($4->self_scm ());
+       | MUSIC_FUNCTION_SCM_SCM_MUSIC embedded_scm embedded_scm Music {
+               $$ = scm_list_5 ($1, make_input (@$), $2, $3, $4->self_scm ());
        }
-       | MUSIC_FUNCTION_MARKUP_MARKUP {
-               THIS->push_spot (); 
-       }  full_markup full_markup {
-               $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), $3, $4);
-       }
-       | MUSIC_FUNCTION_MUSIC_MUSIC {
-               THIS->push_spot (); 
-       }  Music  Music {
-               $$ = scm_list_4 ($1, make_input (THIS->pop_spot ()), 
$3->self_scm (), $4->self_scm ());
+       | MUSIC_FUNCTION_MARKUP_MUSIC full_markup Music {
+               $$ = scm_list_4 ($1, make_input (@$), $2, $3->self_scm ());
                scm_gc_unprotect_object ($3->self_scm ());
-               scm_gc_unprotect_object ($4->self_scm ());
        }
-       | MUSIC_FUNCTION_SCM_MUSIC_MUSIC {
-               THIS->push_spot (); 
-       } embedded_scm Music Music {
-               $$ = scm_list_5 ($1, make_input (THIS->pop_spot ()),
-                       $3, $4->self_scm (), $5->self_scm ());
-               scm_gc_unprotect_object ($5->self_scm ());
+       | MUSIC_FUNCTION_MARKUP_MARKUP full_markup full_markup {
+               $$ = scm_list_4 ($1, make_input (@$), $2, $3);
+       }
+       | MUSIC_FUNCTION_MUSIC_MUSIC Music Music {
+               $$ = scm_list_4 ($1, make_input (@$), $2->self_scm (), 
$3->self_scm ());
+               scm_gc_unprotect_object ($2->self_scm ());
+               scm_gc_unprotect_object ($3->self_scm ());
+       }
+       | MUSIC_FUNCTION_SCM_MUSIC_MUSIC embedded_scm Music Music {
+               $$ = scm_list_5 ($1, make_input (@$), $2, $3->self_scm (), 
$4->self_scm ());
                scm_gc_unprotect_object ($4->self_scm ());
+               scm_gc_unprotect_object ($3->self_scm ());
        }
-       | MUSIC_FUNCTION_MARKUP_MUSIC_MUSIC {
-               THIS->push_spot (); 
-       } full_markup Music Music {
-               $$ = scm_list_5 ($1, make_input (THIS->pop_spot ()),
-                       $3, $4->self_scm (), $5->self_scm ());
-               scm_gc_unprotect_object ($5->self_scm ());
+       | MUSIC_FUNCTION_MARKUP_MUSIC_MUSIC full_markup Music Music {
+               $$ = scm_list_5 ($1, make_input (@$), $2, $3->self_scm (), 
$4->self_scm ());
+               scm_gc_unprotect_object ($3->self_scm ());
                scm_gc_unprotect_object ($4->self_scm ());
        }
        ;
@@ -1133,18 +1099,14 @@
                        $3);
        }
 
-       | TIMES {
-               THIS->push_spot ();
-       }
-       /* CONTINUED */
-               fraction Music  
+       | TIMES fraction Music  
 
        {
-               int n = scm_to_int (scm_car ($3)); int d = scm_to_int (scm_cdr 
($3));
-               Music *mp = $4;
+               int n = scm_to_int (scm_car ($2)); int d = scm_to_int (scm_cdr 
($2));
+               Music *mp = $3;
 
                $$= MY_MAKE_MUSIC ("TimeScaledMusic");
-               $$->set_spot (THIS->pop_spot ());
+               $$->set_spot (@$);
 
                $$->set_property ("element", mp->self_scm ());
                scm_gc_unprotect_object (mp->self_scm ());
@@ -1193,7 +1155,7 @@
        | relative_music        { $$ = $1; }
        | re_rhythmed_music     { $$ = $1; }
        | TAG embedded_scm Music {
-               tag_music ($3, $2, THIS->here_input ());
+               tag_music ($3, $2, @$);
                $$ = $3;
        }
        ;
@@ -1338,7 +1300,7 @@
                t-> set_property ("change-to-id", $4);
 
                $$ = t;
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        ;
 
@@ -1385,7 +1347,7 @@
        simple_string {
                if (!is_regular_identifier ($1))
                {
-                       THIS->here_input ().error (_("Grob name should be 
alphanumeric"));
+                       @$.error (_("Grob name should be alphanumeric"));
                }
 
                $$ = scm_list_2 (ly_symbol2scm ("Bottom"),
@@ -1494,9 +1456,7 @@
 solution.
 
 */
-pre_events: {
-               THIS->push_spot ();
-       }
+pre_events: /* empty */
        ;
 
 event_chord:
@@ -1525,6 +1485,7 @@
                es = ly_append2 (es, postevs);
 
                $1-> set_property ("elements", es);
+               $1->set_spot (@$);
                $$ = $1;
        }
        ;
@@ -1545,6 +1506,7 @@
        chord_open chord_body_elements chord_close
        {
                $$ = MY_MAKE_MUSIC ("EventChord");
+               $$->set_spot (@$);
                $$->set_property ("elements",
                        scm_reverse_x ($2, SCM_EOL));
        }
@@ -1559,7 +1521,7 @@
        ;
 
 chord_body_element:
-       pitch  exclamations questions octave_check post_events
+       pitch exclamations questions octave_check post_events
        {
                int q = $3;
                int ex = $2;
@@ -1568,6 +1530,7 @@
 
                Music *n = MY_MAKE_MUSIC ("NoteEvent");
                n->set_property ("pitch", $1);
+               n->set_spot (@$);
                if (q % 2)
                        n->set_property ("cautionary", SCM_BOOL_T);
                if (ex % 2 || q % 2)
@@ -1590,7 +1553,7 @@
                Music *n = MY_MAKE_MUSIC ("NoteEvent");
                n->set_property ("duration", $2);
                n->set_property ("drum-type", $1);
-               n->set_spot (THIS->here_input ());
+               n->set_spot (@$);
 
                if (scm_is_pair ($2)) {
                        SCM arts = scm_reverse_x ($2, SCM_EOL);
@@ -1615,45 +1578,44 @@
                $$->set_property ("elements", scm_cons ($1->self_scm (), 
SCM_EOL));
                scm_gc_unprotect_object ($1->self_scm ());
 
-               $$-> set_spot (THIS->here_input ());
-               $1-> set_spot (THIS->here_input ());
+               $$-> set_spot (@$);
+               $1-> set_spot (@$);
        }
        | SKIP duration_length {
                Music *skip = MY_MAKE_MUSIC ("SkipMusic");
                skip->set_property ("duration", $2);
-
+               skip->set_spot (@$);
                $$ = skip;
        }
-       | OCTAVE { THIS->push_spot (); }
-         pitch {
+       | OCTAVE pitch {
                Music *m = MY_MAKE_MUSIC ("RelativeOctaveCheck");
                $$ = m;
-               $$->set_spot (THIS->pop_spot ());
-               $$->set_property ("pitch", $3);
+               $$->set_spot (@$);
+               $$->set_property ("pitch", $2);
        }
        | E_LEFTSQUARE {
                Music *m = MY_MAKE_MUSIC ("LigatureEvent");
                m->set_property ("span-direction", scm_int2num (START));
-               m->set_spot (THIS->here_input ());
+               m->set_spot (@$);
 
                $$ = MY_MAKE_MUSIC ("EventChord");
                $$->set_property ("elements", scm_cons (m->self_scm (), 
SCM_EOL));
                scm_gc_unprotect_object (m->self_scm ());
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        | E_RIGHTSQUARE {
                Music *m = MY_MAKE_MUSIC ("LigatureEvent");
                m->set_property ("span-direction", scm_int2num (STOP));
-               m->set_spot (THIS->here_input ());
+               m->set_spot (@$);
 
                $$ = MY_MAKE_MUSIC ("EventChord");
                $$->set_property ("elements", scm_cons (m->self_scm (), 
SCM_EOL));
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
                scm_gc_unprotect_object (m->self_scm ());
        }
        | E_BACKSLASH {
                $$ = MY_MAKE_MUSIC ("VoiceSeparator");
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        | '|'      {
                SCM pipe = THIS->lexer_->lookup_identifier ("pipeSymbol");
@@ -1663,14 +1625,14 @@
                else
                        $$ = MY_MAKE_MUSIC ("BarCheck");
 
-               $$->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
        }
        | TRANSPOSITION pitch {
                Pitch middle_c;
                Pitch sounds_as_c = pitch_interval (*unsmob_pitch ($2), 
middle_c);
                $$ = set_property_music (ly_symbol2scm 
("instrumentTransposition"),
                                         sounds_as_c.smobbed_copy());
-               $$->set_spot (THIS-> here_input ());
+               $$->set_spot (@$);
                $$ = context_spec_music (ly_symbol2scm ("Staff"), SCM_UNDEFINED,
                        $$, SCM_EOL);
        }
@@ -1680,13 +1642,13 @@
                Music *csm = context_spec_music (ly_symbol2scm ("Timing"), 
SCM_UNDEFINED,
                                        t, SCM_EOL);
                $$ = context_spec_music (ly_symbol2scm ("Score"), 
SCM_UNDEFINED, csm, SCM_EOL);
-               $$->set_spot (THIS->here_input ());
-               t->set_spot (THIS->here_input ());
+               $$->set_spot (@$);
+               t->set_spot (@$);
        }
        | PARTIAL duration_length       {
                Moment m = - unsmob_duration ($2)->get_length ();
                Music *p = set_property_music (ly_symbol2scm ( 
"measurePosition"),m.smobbed_copy ());
-               p->set_spot (THIS->here_input ());
+               p->set_spot (@$);
                p = context_spec_music (ly_symbol2scm ("Timing"), SCM_UNDEFINED,
                                        p, SCM_EOL);
                p = context_spec_music (ly_symbol2scm ("Score"), SCM_UNDEFINED,
@@ -1740,24 +1702,25 @@
                        key->set_property ("tonic", Pitch (0,0,0).smobbed_copy 
());
                        key->transpose (* unsmob_pitch ($2));
                } else {
-                       THIS->parser_error (_ ("Second argument must be pitch 
list."));
+                       THIS->parser_error (@3, _ ("Second argument must be 
pitch list."));
                }
 
                $$ = key;
        }
        ;
 
+
 post_events:
        /* empty */ {
                $$ = SCM_EOL;
        }
        | post_events post_event {
-               $2->set_spot (THIS->here_input ());
+               $2->set_spot (@2);
                $$ = scm_cons ($2->self_scm (), $$);
                scm_gc_unprotect_object ($2->self_scm ());
        }
        | post_events tagged_post_event {
-               $2 -> set_spot (THIS->here_input ());
+               $2 -> set_spot (@2);
                $$ = scm_cons ($2->self_scm (), $$);
                scm_gc_unprotect_object ($2->self_scm ());
        }
@@ -1766,23 +1729,24 @@
 
 tagged_post_event:
        '-' TAG embedded_scm post_event {
-               tag_music ($4, $3, THIS->here_input ());
+               tag_music ($4, $3, @$);
                $$ = $4;
        }
        ;
 
+
 post_event:
        direction_less_event {
                $$ = $1;
        }
        | HYPHEN {
                if (!THIS->lexer_->is_lyric_state ())
-                       THIS->parser_error (_ ("Have to be in Lyric mode for 
lyrics"));
+                       THIS->parser_error (@1, _ ("Have to be in Lyric mode 
for lyrics"));
                $$ = MY_MAKE_MUSIC ("HyphenEvent");
        }
        | EXTENDER {
                if (!THIS->lexer_->is_lyric_state ())
-                       THIS->parser_error (_ ("Have to be in Lyric mode for 
lyrics"));
+                       THIS->parser_error (@1, _ ("Have to be in Lyric mode 
for lyrics"));
                $$ = MY_MAKE_MUSIC ("ExtenderEvent");
        }
        | script_dir direction_reqd_event {
@@ -1802,7 +1766,7 @@
        E_UNSIGNED {
                Music *s = MY_MAKE_MUSIC ("StringNumberEvent");
                s->set_property ("string-number", scm_int2num ($1));
-               s->set_spot (THIS->here_input ());
+               s->set_spot (@$);
                $$ = s;
        }
        ;
@@ -1852,7 +1816,7 @@
                {
                        m = MY_MAKE_MUSIC ("Music");
                }
-               m->set_spot (THIS->here_input ());
+               m->set_spot (@$);
                $$ = m;         
        }
        | EVENT_IDENTIFIER      {
@@ -1860,7 +1824,7 @@
        }
        | tremolo_type  {
                Music *a = MY_MAKE_MUSIC ("TremoloEvent");
-               a->set_spot (THIS->here_input ());
+               a->set_spot (@$);
                a->set_property ("tremolo-type", scm_int2num ($1));
                $$ = a;
         }
@@ -1875,7 +1839,7 @@
                Music *a = MY_MAKE_MUSIC ("ArticulationEvent");
                if (scm_is_string (s))
                        a->set_property ("articulation-type", s);
-               else THIS->parser_error (_ ("Expecting string as script 
definition"));
+               else THIS->parser_error (@1, _ ("Expecting string as script 
definition"));
                $$ = a;
        }
        ;
@@ -1957,21 +1921,21 @@
        full_markup {
                Music *t = MY_MAKE_MUSIC ("TextScriptEvent");
                t->set_property ("text", $1);
-               t->set_spot (THIS->here_input ());
+               t->set_spot (@$);
                $$ = t; 
        }
        | string {
                Music *t = MY_MAKE_MUSIC ("TextScriptEvent");
                t->set_property ("text",
                        make_simple_markup ($1));
-               t->set_spot (THIS->here_input ());
+               t->set_spot (@$);
                $$ = t;
        
        }
        | DIGIT {
                Music *t = MY_MAKE_MUSIC ("FingerEvent");
                t->set_property ("digit", scm_int2num ($1));
-               t->set_spot (THIS->here_input ());
+               t->set_spot (@$);
                $$ = t;
        }
        ;
@@ -2038,7 +2002,7 @@
        bare_unsigned dots              {
                int len = 0;
                if (!is_duration ($1))
-                       THIS->parser_error (_f ("not a duration: %d", $1));
+                       THIS->parser_error (@1, _f ("not a duration: %d", $1));
                else
                        len = intlog2 ($1);
 
@@ -2088,7 +2052,7 @@
        }
        | ':' bare_unsigned {
                if (!is_duration ($2))
-                       THIS->parser_error (_f ("not a duration: %d", $2));
+                       THIS->parser_error (@2, _f ("not a duration: %d", $2));
                $$ = $2;
        }
        ;
@@ -2180,10 +2144,8 @@
 
 simple_element:
        pitch exclamations questions octave_check optional_notemode_duration 
optional_rest {
-
-               Input i = THIS->pop_spot ();
                if (!THIS->lexer_->is_note_state ())
-                       THIS->parser_error (_ ("Have to be in Note mode for 
notes"));
+                       THIS->parser_error (@1, _ ("Have to be in Note mode for 
notes"));
 
                Music *n = 0;
                if ($6)
@@ -2209,13 +2171,11 @@
                v->set_property ("elements", scm_list_1 (n->self_scm ()));
                scm_gc_unprotect_object (n->self_scm ());
 
-               v->set_spot (i);
-               n->set_spot (i);
+               v->set_spot (@$);
+               n->set_spot (@$);
                $$ = v;
        }
        | DRUM_PITCH optional_notemode_duration {
-               Input i = THIS->pop_spot ();
-
                Music *n = MY_MAKE_MUSIC ("NoteEvent");
                n->set_property ("duration", $2);
                n->set_property ("drum-type", $1);
@@ -2223,15 +2183,14 @@
                Music *v = MY_MAKE_MUSIC ("EventChord");
                v->set_property ("elements", scm_list_1 (n->self_scm ()));
                scm_gc_unprotect_object (n->self_scm ());
-               v->set_spot (i);
-               n->set_spot (i);
+               v->set_spot (@$);
+               n->set_spot (@$);
                $$ = v;
                
        }
        | figure_spec optional_notemode_duration {
                Music *m = unsmob_music ($1);
-               Input i = THIS->pop_spot ();
-               m->set_spot (i);
+               m->set_spot (@$);
                for (SCM s = m->get_property ("elements"); scm_is_pair (s); s = 
scm_cdr (s))
                {
                        unsmob_music (scm_car (s))->set_property ("duration", 
$2);
@@ -2239,8 +2198,6 @@
                $$ = m;
        }       
        | RESTNAME optional_notemode_duration           {
-
-               Input i = THIS->pop_spot ();
                Music *ev = 0;
                if (ly_scm2string ($1) == "s") {
                        /* Space */
@@ -2251,44 +2208,38 @@
                
                    }
                ev->set_property ("duration", $2);
-               ev->set_spot (i);
+               ev->set_spot (@$);
                Music *velt = MY_MAKE_MUSIC ("EventChord");
                velt->set_property ("elements", scm_list_1 (ev->self_scm ()));
-               velt->set_spot (i);
+               velt->set_spot (@$);
 
                scm_gc_unprotect_object (ev->self_scm ());
 
                $$ = velt;
        }
        | MULTI_MEASURE_REST optional_notemode_duration         {
-               THIS->pop_spot ();
-
                SCM proc = ly_lily_module_constant ("make-multi-measure-rest");
-               SCM mus = scm_call_2 (proc, $2,
-                       make_input (THIS->here_input ()));      
+               SCM mus = scm_call_2 (proc, $2, make_input (@$));
                scm_gc_protect_object (mus);
                $$ = unsmob_music (mus);
        }
        
        | lyric_element optional_notemode_duration      {
-               Input i = THIS->pop_spot ();
                if (!THIS->lexer_->is_lyric_state ())
-                       THIS->parser_error (_ ("Have to be in Lyric mode for 
lyrics"));
+                       THIS->parser_error (@1, _ ("Have to be in Lyric mode 
for lyrics"));
 
                Music *lreq = MY_MAKE_MUSIC ("LyricEvent");
-                lreq->set_property ("text", $1);
+               lreq->set_property ("text", $1);
                lreq->set_property ("duration",$2);
-               lreq->set_spot (i);
+               lreq->set_spot (@$);
                Music *velt = MY_MAKE_MUSIC ("EventChord");
                velt->set_property ("elements", scm_list_1 (lreq->self_scm ()));
 
                $$= velt;
        }
        | new_chord {
-               THIS->pop_spot ();
-
                 if (!THIS->lexer_->is_chord_state ())
-                        THIS->parser_error (_ ("Have to be in Chord mode for 
chords"));
+                        THIS->parser_error (@1, _ ("Have to be in Chord mode 
for chords"));
                 $$ = unsmob_music ($1);
        }
        ;
@@ -2440,7 +2391,7 @@
                        $$ = k;
                } else
                {
-                       THIS->parser_error (_ ("need integer number arg"));
+                       THIS->parser_error (@1, _ ("need integer number arg"));
                        $$ = 0;
                }
        }
Index: lily/source-file.cc
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/source-file.cc,v
retrieving revision 1.20
diff -u -r1.20 source-file.cc
--- lily/source-file.cc 9 Dec 2004 00:16:44 -0000       1.20
+++ lily/source-file.cc 9 Jan 2005 15:43:25 -0000
@@ -72,6 +72,10 @@
   length_ = data.length ();
   pos_str0_ = to_str0 ();
   init_port ();
+
+  for (int i = 0; i < length_; i++)
+    if (contents_str0_[i] == '\n')
+      newline_locations_.push (contents_str0_ + i);
 }
 
 Source_file::Source_file (String filename_string)
Index: lily/include/includable-lexer.hh
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/include/includable-lexer.hh,v
retrieving revision 1.17
diff -u -r1.17 includable-lexer.hh
--- lily/include/includable-lexer.hh    16 Nov 2004 22:45:49 -0000      1.17
+++ lily/include/includable-lexer.hh    9 Jan 2005 15:43:25 -0000
@@ -46,7 +46,6 @@
   void new_input (String s, Sources*);
   void new_input (String name, String data, Sources*);
 
-  void add_lexed_char (int);
   char const * here_str0 () const;
 };
 
Index: lily/include/input.hh
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/include/input.hh,v
retrieving revision 1.6
diff -u -r1.6 input.hh
--- lily/include/input.hh       5 Feb 2004 14:55:37 -0000       1.6
+++ lily/include/input.hh       9 Jan 2005 15:43:25 -0000
@@ -17,6 +17,10 @@
 class Input {
 public:
   char const *defined_str0_ ;
+  int first_line_;
+  int first_column_;
+  int last_line_;
+  int last_column_;
   Source_file * source_file_;
     
   void warning (String) const; // should use member func?
@@ -24,6 +28,7 @@
   void error (String) const;
   void message (String) const;
   void set_spot (Input const &);
+  void set_location (Input const &, Input const &);
   Input spot () const;
   String location_string () const;
   String line_number_string () const;
@@ -34,7 +39,7 @@
   int column_number ()const;
 
   
-  Input (Source_file*, char const*);
+  Input (Input const &i);
   Input ();
 };
 
Index: lily/include/lily-lexer.hh
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/include/lily-lexer.hh,v
retrieving revision 1.5
diff -u -r1.5 lily-lexer.hh
--- lily/include/lily-lexer.hh  1 Jan 2005 19:46:55 -0000       1.5
+++ lily/include/lily-lexer.hh  9 Jan 2005 15:43:25 -0000
@@ -34,9 +34,11 @@
   char escaped_char (char) const;
 
   Keyword_table *keytable_;
+
 public:
   String main_input_name_;
   void *lexval;
+  Input *lexloc;
   bool main_input_b_;
   
   Sources *sources_; 
@@ -52,6 +54,8 @@
   Lily_lexer (Lily_lexer const&);
   int yylex ();
 
+  void add_lexed_char (int);
+
   void prepare_for_next_token ();
   int try_special_identifiers (SCM* ,SCM);
   Input here_input () const;
Index: lily/include/lily-parser.hh
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/include/lily-parser.hh,v
retrieving revision 1.3
diff -u -r1.3 lily-parser.hh
--- lily/include/lily-parser.hh 18 Nov 2004 23:02:20 -0000      1.3
+++ lily/include/lily-parser.hh 9 Jan 2005 15:43:26 -0000
@@ -54,15 +54,13 @@
 
   DECLARE_SCHEME_CALLBACK (layout_description, ());
 
-  Input here_input () const;
-  Input pop_spot ();
   void beam_check (SCM); 
   void do_init_file ();
   void do_yyparse ();
   void parse_file (String init, String name, String out_name);
   void parse_string (String ly_code);
   void parser_error (String);
-  void push_spot ();
+  void parser_error (Input const&, String);
   void set_yydebug (bool);
 };
 
Index: lily/include/music.hh
===================================================================
RCS file: /cvsroot/lilypond/lilypond/lily/include/music.hh,v
retrieving revision 1.57
diff -u -r1.57 music.hh
--- lily/include/music.hh       18 Nov 2004 23:02:20 -0000      1.57
+++ lily/include/music.hh       9 Jan 2005 15:43:26 -0000
@@ -36,7 +36,7 @@
   VIRTUAL_COPY_CONSTRUCTOR (Music, Music);
 
   Input *origin () const; 
-  void set_spot (Input);  
+  void set_spot (Input);
 
   SCM internal_get_property (SCM) const;
   void internal_set_property (SCM , SCM val);

reply via email to

[Prev in Thread] Current Thread [Next in Thread]