changeset 16103:6434f70f0ee0

move input_line_number and current_input_column to lexical_feedback class * lex.h, lex.ll (input_line_number, current_input_column): Move global variables to lexical_feedback class. Change all uses. (reset_parser): Don't reset input_line_number or current_input_column. * oct-parse.yy (eval_string, parse_fcn_file): Don't protect input_line_number or current_input_column here. (parse_fcn_file): Protect lexer_flags prior to calling gobble_leading_whitespace. Use reset_parser to reset lexer_flags.
author John W. Eaton <jwe@octave.org>
date Mon, 25 Feb 2013 21:30:51 -0500
parents 679a54d274d9
children c8974e28da59
files libinterp/parse-tree/lex.h libinterp/parse-tree/lex.ll libinterp/parse-tree/oct-parse.yy libinterp/parse-tree/parse.h
diffstat 4 files changed, 110 insertions(+), 121 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/lex.h	Mon Feb 25 20:26:52 2013 -0500
+++ b/libinterp/parse-tree/lex.h	Mon Feb 25 21:30:51 2013 -0500
@@ -72,6 +72,7 @@
       looking_at_indirect_ref (false), parsing_class_method (false),
       maybe_classdef_get_set_method (false), parsing_classdef (false),
       quote_is_transpose (false), parser_end_of_input (false),
+      input_line_number (1), current_input_column (1),
       bracketflag (0), braceflag (0),
       looping (0), defining_func (0), looking_at_function_handle (0),
       looking_at_object_index (), parsed_function_name (),
@@ -97,6 +98,8 @@
       parsing_classdef (lf.parsing_classdef),
       quote_is_transpose (lf.quote_is_transpose),
       parser_end_of_input (lf.parser_end_of_input),
+      input_line_number (lf.input_line_number),
+      current_input_column (lf.current_input_column),
       bracketflag (lf.bracketflag),
       braceflag (lf.braceflag),
       looping (lf.looping),
@@ -127,6 +130,8 @@
         parsing_classdef = lf.parsing_classdef;
         quote_is_transpose = lf.quote_is_transpose;
         parser_end_of_input = lf.parser_end_of_input;
+        input_line_number = lf.input_line_number;
+        current_input_column = lf.current_input_column;
         bracketflag = lf.bracketflag;
         braceflag = lf.braceflag;
         looping = lf.looping;
@@ -205,6 +210,12 @@
   // TRUE means that we have encountered EOF on the input stream.
   bool parser_end_of_input;
 
+  // The current input line number.
+  int input_line_number;
+
+  // The column of the current token.
+  int current_input_column;
+
   // Square bracket level count.
   int bracketflag;
 
--- a/libinterp/parse-tree/lex.ll	Mon Feb 25 20:26:52 2013 -0500
+++ b/libinterp/parse-tree/lex.ll	Mon Feb 25 21:30:51 2013 -0500
@@ -148,7 +148,7 @@
 #define TOK_RETURN(tok) \
   do \
     { \
-      current_input_column += yyleng; \
+      lexer_flags.current_input_column += yyleng; \
       lexer_flags.quote_is_transpose = false; \
       lexer_flags.convert_spaces_to_comma = true; \
       COUNT_TOK_AND_RETURN (tok); \
@@ -158,8 +158,8 @@
 #define TOK_PUSH_AND_RETURN(name, tok) \
   do \
     { \
-      yylval.tok_val = new token (name, input_line_number, \
-                                  current_input_column); \
+      yylval.tok_val = new token (name, lexer_flags.input_line_number, \
+                                  lexer_flags.current_input_column); \
       token_stack.push (yylval.tok_val); \
       TOK_RETURN (tok); \
     } \
@@ -168,9 +168,10 @@
 #define BIN_OP_RETURN_INTERNAL(tok, convert, bos, qit) \
   do \
     { \
-      yylval.tok_val = new token (input_line_number, current_input_column); \
+      yylval.tok_val = new token (lexer_flags.input_line_number, \
+                                  lexer_flags.current_input_column); \
       token_stack.push (yylval.tok_val); \
-      current_input_column += yyleng; \
+      lexer_flags.current_input_column += yyleng; \
       lexer_flags.quote_is_transpose = qit; \
       lexer_flags.convert_spaces_to_comma = convert; \
       lexer_flags.looking_for_object_index = false; \
@@ -378,8 +379,8 @@
     LEXER_DEBUG ("<COMMAND_START>{NL}");
 
     BEGIN (INITIAL);
-    input_line_number++;
-    current_input_column = 1;
+    lexer_flags.input_line_number++;
+    lexer_flags.current_input_column = 1;
 
     lexer_flags.quote_is_transpose = false;
     lexer_flags.convert_spaces_to_comma = true;
@@ -408,7 +409,7 @@
 
     lexer_flags.at_beginning_of_statement = false;
 
-    current_input_column++;
+    lexer_flags.current_input_column++;
     int tok = handle_string (yytext[0]);
 
     COUNT_TOK_AND_RETURN (tok);
@@ -496,7 +497,7 @@
 <MATRIX_START>{S}*\,{S}* {
     LEXER_DEBUG ("<MATRIX_START>{S}*\\,{S}*");
 
-    current_input_column += yyleng;
+    lexer_flags.current_input_column += yyleng;
 
     int tmp = eat_continuation ();
 
@@ -528,7 +529,7 @@
 <MATRIX_START>{S}+ {
     LEXER_DEBUG ("<MATRIX_START>{S}+");
 
-    current_input_column += yyleng;
+    lexer_flags.current_input_column += yyleng;
 
     lexer_flags.at_beginning_of_statement = false;
 
@@ -624,7 +625,7 @@
 
     lexer_flags.looking_at_object_index.push_front (false);
 
-    current_input_column += yyleng;
+    lexer_flags.current_input_column += yyleng;
     lexer_flags.quote_is_transpose = false;
     lexer_flags.convert_spaces_to_comma = true;
     lexer_flags.looking_for_object_index = false;
@@ -686,7 +687,7 @@
 %}
 
 {S}* {
-    current_input_column += yyleng;
+    lexer_flags.current_input_column += yyleng;
   }
 
 %{
@@ -701,8 +702,8 @@
       gripe_matlab_incompatible_continuation ();
     scan_for_comments (yytext);
     promptflag--;
-    input_line_number++;
-    current_input_column = 1;
+    lexer_flags.input_line_number++;
+    lexer_flags.current_input_column = 1;
   }
 
 %{
@@ -719,7 +720,7 @@
         if ((reading_fcn_file || reading_script_file || reading_classdef_file)
             && ! curr_fcn_file_name.empty ())
           warning ("near line %d of file '%s.m'",
-                   input_line_number, curr_fcn_file_name.c_str ());
+                   lexer_flags.input_line_number, curr_fcn_file_name.c_str ());
       }
 
     TOK_RETURN (END_OF_INPUT);
@@ -782,7 +783,7 @@
 "@" {
     LEXER_DEBUG ("@");
 
-    current_input_column++;
+    lexer_flags.current_input_column++;
 
     lexer_flags.quote_is_transpose = false;
     lexer_flags.convert_spaces_to_comma = false;
@@ -803,8 +804,8 @@
 {NL} {
     LEXER_DEBUG ("{NL}");
 
-    input_line_number++;
-    current_input_column = 1;
+    lexer_flags.input_line_number++;
+    lexer_flags.current_input_column = 1;
 
     lexer_flags.quote_is_transpose = false;
     lexer_flags.convert_spaces_to_comma = true;
@@ -831,7 +832,7 @@
 "'" {
     LEXER_DEBUG ("'");
 
-    current_input_column++;
+    lexer_flags.current_input_column++;
     lexer_flags.convert_spaces_to_comma = true;
 
     if (lexer_flags.quote_is_transpose)
@@ -853,7 +854,7 @@
 \" {
     LEXER_DEBUG ("\"");
 
-    current_input_column++;
+    lexer_flags.current_input_column++;
     int tok = handle_string ('"');
 
     COUNT_TOK_AND_RETURN (tok);
@@ -888,8 +889,8 @@
 
     lexer_flags.looking_for_object_index = false;
 
-    input_line_number++;
-    current_input_column = 1;
+    lexer_flags.input_line_number++;
+    lexer_flags.current_input_column = 1;
     block_comment_nesting_level++;
     promptflag--;
 
@@ -971,7 +972,7 @@
     LEXER_DEBUG (")");
 
     nesting_level.remove ();
-    current_input_column++;
+    lexer_flags.current_input_column++;
 
     lexer_flags.looking_at_object_index.pop_front ();
 
@@ -1024,7 +1025,7 @@
     lexer_flags.looking_at_object_index.push_front
       (lexer_flags.looking_for_object_index);
 
-    current_input_column += yyleng;
+    lexer_flags.current_input_column += yyleng;
     lexer_flags.quote_is_transpose = false;
     lexer_flags.convert_spaces_to_comma = true;
     lexer_flags.looking_for_object_index = false;
@@ -1064,11 +1065,11 @@
 
     if (c != EOF)
       {
-        current_input_column++;
+        lexer_flags.current_input_column++;
 
         error ("invalid character '%s' (ASCII %d) near line %d, column %d",
                undo_string_escape (static_cast<char> (c)), c,
-               input_line_number, current_input_column);
+               lexer_flags.input_line_number, lexer_flags.current_input_column);
 
         return LEXICAL_ERROR;
       }
@@ -1128,13 +1129,6 @@
       token_stack.pop ();
     }
 
-  // Can be reset by defining a function.
-  if (! (reading_script_file || reading_fcn_file || reading_classdef_file))
-    {
-      current_input_column = 1;
-      input_line_number = command_editor::current_command_number ();
-    }
-
   // Only ask for input from stdin if we are expecting interactive
   // input.
 
@@ -1334,7 +1328,7 @@
     }
 
   if (c == '\n')
-    input_line_number++;
+    lexer_flags.input_line_number++;
 
   return c;
 }
@@ -1350,7 +1344,7 @@
     }
 
   if (c == '\n')
-    input_line_number--;
+    lexer_flags.input_line_number--;
 
   yyunput (c, buf);
 }
@@ -1366,11 +1360,11 @@
     {
       if (c == '\n')
         {
-          input_line_number++;
-          current_input_column = 1;
+          lexer_flags.input_line_number++;
+          lexer_flags.current_input_column = 1;
         }
       else
-        current_input_column++;
+        lexer_flags.current_input_column++;
     }
 }
 
@@ -1473,8 +1467,8 @@
 static int
 is_keyword_token (const std::string& s)
 {
-  int l = input_line_number;
-  int c = current_input_column;
+  int l = lexer_flags.input_line_number;
+  int c = lexer_flags.current_input_column;
 
   int len = s.length ();
 
@@ -1502,12 +1496,12 @@
               && ! curr_fcn_file_full_name.empty ())
             warning_with_id ("Octave:deprecated-keyword",
                              "the 'static' keyword is obsolete and will be removed from a future version of Octave; please use 'persistent' instead; near line %d of file '%s'",
-                             input_line_number,
+                             lexer_flags.input_line_number,
                              curr_fcn_file_full_name.c_str ());
           else
             warning_with_id ("Octave:deprecated-keyword",
                              "the 'static' keyword is obsolete and will be removed from a future version of Octave; please use 'persistent' instead; near line %d",
-                             input_line_number);
+                             lexer_flags.input_line_number);
           // fall through ...
 
         case persistent_kw:
@@ -1652,7 +1646,7 @@
 
           if (! (reading_fcn_file || reading_script_file
                  || reading_classdef_file))
-            input_line_number = 1;
+            lexer_flags.input_line_number = 1;
           break;
 
         case magic_file_kw:
@@ -1707,7 +1701,7 @@
 
   while ((c = reader.getc ()) != EOF)
     {
-      current_input_column++;
+      lexer_flags.current_input_column++;
 
       if (look_for_marker)
         {
@@ -1724,7 +1718,7 @@
 
               while ((c = reader.getc ()) != EOF && ! done)
                 {
-                  current_input_column++;
+                  lexer_flags.current_input_column++;
 
                   switch (c)
                     {
@@ -1735,7 +1729,7 @@
 
                     case '\n':
                       {
-                        current_input_column = 0;
+                        lexer_flags.current_input_column = 0;
                         at_bol = true;
                         done = true;
 
@@ -1787,7 +1781,7 @@
 
           if (c == '\n')
             {
-              current_input_column = 0;
+              lexer_flags.current_input_column = 0;
               at_bol = true;
             }
         }
@@ -1817,7 +1811,7 @@
 
   while ((c = reader.getc ()) != EOF)
     {
-      current_input_column++;
+      lexer_flags.current_input_column++;
 
       if (begin_comment)
         {
@@ -1834,7 +1828,7 @@
 
               while ((c = reader.getc ()) != EOF && ! done)
                 {
-                  current_input_column++;
+                  lexer_flags.current_input_column++;
 
                   switch (c)
                     {
@@ -1845,7 +1839,7 @@
 
                     case '\n':
                       {
-                        current_input_column = 0;
+                        lexer_flags.current_input_column = 0;
                         at_bol = true;
                         done = true;
 
@@ -1884,7 +1878,7 @@
           if (c == '\n')
             {
               at_bol = true;
-              current_input_column = 0;
+              lexer_flags.current_input_column = 0;
               in_comment = false;
 
               // FIXME -- bailing out here prevents things like
@@ -1924,7 +1918,7 @@
               break;
 
             default:
-              current_input_column--;
+              lexer_flags.current_input_column--;
               reader.ungetc (c);
               goto done;
             }
@@ -1991,7 +1985,7 @@
 
   octave_comment_buffer::append (txt);
 
-  current_input_column = 1;
+  lexer_flags.current_input_column = 1;
   lexer_flags.quote_is_transpose = false;
   lexer_flags.convert_spaces_to_comma = true;
   lexer_flags.at_beginning_of_statement = true;
@@ -2302,7 +2296,7 @@
 
   while ((c = text_yyinput ()) != EOF)
     {
-      current_input_column++;
+      lexer_flags.current_input_column++;
 
       switch (c)
         {
@@ -2326,7 +2320,7 @@
               in_comment = false;
               beginning_of_comment = false;
             }
-          current_input_column = 0;
+          lexer_flags.current_input_column = 0;
           break;
 
         case '#':
@@ -2391,7 +2385,7 @@
 
  done:
   xunput (c, yytext);
-  current_input_column--;
+  lexer_flags.current_input_column--;
   return retval;
 }
 
@@ -2438,12 +2432,12 @@
   lexer_flags.looking_for_object_index = false;
   lexer_flags.at_beginning_of_statement = false;
 
-  yylval.tok_val = new token (value, yytext, input_line_number,
-                              current_input_column);
+  yylval.tok_val = new token (value, yytext, lexer_flags.input_line_number,
+                              lexer_flags.current_input_column);
 
   token_stack.push (yylval.tok_val);
 
-  current_input_column += yyleng;
+  lexer_flags.current_input_column += yyleng;
 
   do_comma_insert_check ();
 }
@@ -2512,7 +2506,7 @@
               comment_buf += static_cast<char> (c);
               octave_comment_buffer::append (comment_buf);
             }
-          current_input_column = 0;
+          lexer_flags.current_input_column = 0;
           promptflag--;
           gripe_matlab_incompatible_continuation ();
           return true;
@@ -2594,15 +2588,15 @@
 {
   std::ostringstream buf;
 
-  int bos_line = input_line_number;
-  int bos_col = current_input_column;
+  int bos_line = lexer_flags.input_line_number;
+  int bos_col = lexer_flags.current_input_column;
 
   int c;
   int escape_pending = 0;
 
   while ((c = text_yyinput ()) != EOF)
     {
-      current_input_column++;
+      lexer_flags.current_input_column++;
 
       if (c == '\\')
         {
@@ -3174,11 +3168,12 @@
     = new token (meth.empty () ? 0 : &(symbol_table::insert (meth)),
                  cls.empty () ? 0 : &(symbol_table::insert (cls)),
                  pkg.empty () ? 0 : &(symbol_table::insert (pkg)),
-                 input_line_number, current_input_column);
+                 lexer_flags.input_line_number,
+                 lexer_flags.current_input_column);
   token_stack.push (yylval.tok_val);
 
   lexer_flags.convert_spaces_to_comma = true;
-  current_input_column += yyleng;
+  lexer_flags.current_input_column += yyleng;
 
   return SUPERCLASSREF;
 }
@@ -3208,12 +3203,13 @@
   yylval.tok_val
     = new token (cls.empty () ? 0 : &(symbol_table::insert (cls)),
                  pkg.empty () ? 0 : &(symbol_table::insert (pkg)),
-                 input_line_number, current_input_column);
+                 lexer_flags.input_line_number,
+                 lexer_flags.current_input_column);
 
   token_stack.push (yylval.tok_val);
 
   lexer_flags.convert_spaces_to_comma = true;
-  current_input_column += yyleng;
+  lexer_flags.current_input_column += yyleng;
 
   return METAQUERY;
 }
@@ -3246,8 +3242,8 @@
 
       maybe_unput_comma (spc_gobbled);
 
-      yylval.tok_val = new token (tok, input_line_number,
-                                  current_input_column);
+      yylval.tok_val = new token (tok, lexer_flags.input_line_number,
+                                  lexer_flags.current_input_column);
 
       token_stack.push (yylval.tok_val);
 
@@ -3255,7 +3251,7 @@
       lexer_flags.convert_spaces_to_comma = true;
       lexer_flags.looking_for_object_index = true;
 
-      current_input_column += yyleng;
+      lexer_flags.current_input_column += yyleng;
 
       return STRUCT_ELT;
     }
@@ -3283,12 +3279,12 @@
         }
       else
         {
-          yylval.tok_val = new token (tok, input_line_number,
-                                      current_input_column);
+          yylval.tok_val = new token (tok, lexer_flags.input_line_number,
+                                      lexer_flags.current_input_column);
 
           token_stack.push (yylval.tok_val);
 
-          current_input_column += yyleng;
+          lexer_flags.current_input_column += yyleng;
           lexer_flags.quote_is_transpose = false;
           lexer_flags.convert_spaces_to_comma = true;
           lexer_flags.looking_for_object_index = true;
@@ -3304,7 +3300,7 @@
     {
       if (kw_token >= 0)
         {
-          current_input_column += yyleng;
+          lexer_flags.current_input_column += yyleng;
           lexer_flags.quote_is_transpose = false;
           lexer_flags.convert_spaces_to_comma = true;
           lexer_flags.looking_for_object_index = false;
@@ -3367,7 +3363,8 @@
     tok = "__end__";
 
   yylval.tok_val = new token (&(symbol_table::insert (tok)),
-                              input_line_number, current_input_column);
+                              lexer_flags.input_line_number,
+                              lexer_flags.current_input_column);
 
   token_stack.push (yylval.tok_val);
 
@@ -3385,7 +3382,7 @@
       maybe_unput_comma (spc_gobbled);
     }
 
-  current_input_column += yyleng;
+  lexer_flags.current_input_column += yyleng;
 
   if (tok != "__end__")
     lexer_flags.looking_for_object_index = true;
@@ -3547,11 +3544,11 @@
   if (nm.empty ())
     warning_with_id ("Octave:separator-insert",
                      "potential auto-insertion of '%c' near line %d",
-                     sep, input_line_number);
+                     sep, lexer_flags.input_line_number);
   else
     warning_with_id ("Octave:separator-insert",
                      "potential auto-insertion of '%c' near line %d of file %s",
-                     sep, input_line_number, nm.c_str ());
+                     sep, lexer_flags.input_line_number, nm.c_str ());
 }
 
 static void
@@ -3562,11 +3559,11 @@
   if (nm.empty ())
     warning_with_id ("Octave:single-quote-string",
                      "single quote delimited string near line %d",
-                     input_line_number);
+                     lexer_flags.input_line_number);
   else
     warning_with_id ("Octave:single-quote-string",
                      "single quote delimited string near line %d of file %s",
-                     input_line_number, nm.c_str ());
+                     lexer_flags.input_line_number, nm.c_str ());
 }
 
 static void
@@ -3581,7 +3578,7 @@
   else
     warning_with_id ("Octave:matlab-incompatible",
                      "potential Matlab compatibility problem: %s near line %d offile %s",
-                     msg.c_str (), input_line_number, nm.c_str ());
+                     msg.c_str (), lexer_flags.input_line_number, nm.c_str ());
 }
 
 static void
--- a/libinterp/parse-tree/oct-parse.yy	Mon Feb 25 20:26:52 2013 -0500
+++ b/libinterp/parse-tree/oct-parse.yy	Mon Feb 25 21:30:51 2013 -0500
@@ -86,12 +86,6 @@
 #define malloc GNULIB_NAMESPACE::malloc
 #endif
 
-// The current input line number.
-int input_line_number = 1;
-
-// The column of the current token.
-int current_input_column = 1;
-
 // Buffer for help text snagged from function files.
 std::stack<std::string> help_buf;
 
@@ -1345,8 +1339,8 @@
 script_file     : SCRIPT_FILE opt_list END_OF_INPUT
                   {
                     tree_statement *end_of_script
-                      = make_end ("endscript", input_line_number,
-                                  current_input_column);
+                      = make_end ("endscript", lexer_flags.input_line_number,
+                                  lexer_flags.current_input_column);
 
                     make_script ($2, end_of_script);
 
@@ -1469,8 +1463,8 @@
                         YYABORT;
                       }
 
-                    $$ = make_end ("endfunction", input_line_number,
-                                   current_input_column);
+                    $$ = make_end ("endfunction", lexer_flags.input_line_number,
+                                   lexer_flags.current_input_column);
                   }
                 ;
 
@@ -1693,12 +1687,12 @@
 static void
 yyerror (const char *s)
 {
-  int err_col = current_input_column - 1;
+  int err_col = lexer_flags.current_input_column - 1;
 
   std::ostringstream output_buf;
 
   if (reading_fcn_file || reading_script_file || reading_classdef_file)
-    output_buf << "parse error near line " << input_line_number
+    output_buf << "parse error near line " << lexer_flags.input_line_number
                << " of file " << curr_fcn_file_full_name;
   else
     output_buf << "parse error:";
@@ -2130,8 +2124,8 @@
 make_anon_fcn_handle (tree_parameter_list *param_list, tree_statement *stmt)
 {
   // FIXME -- need to get these from the location of the @ symbol.
-  int l = input_line_number;
-  int c = current_input_column;
+  int l = lexer_flags.input_line_number;
+  int c = lexer_flags.current_input_column;
 
   tree_parameter_list *ret_list = 0;
 
@@ -2909,7 +2903,8 @@
     }
 
   fcn->stash_function_name (id_name);
-  fcn->stash_fcn_location (input_line_number, current_input_column);
+  fcn->stash_fcn_location (lexer_flags.input_line_number,
+                           lexer_flags.current_input_column);
 
   if (! help_buf.empty () && current_function_depth == 1
       && ! parsing_subfunctions)
@@ -3318,7 +3313,7 @@
     }
 
   if (c == '\n')
-    input_line_number++;
+    lexer_flags.input_line_number++;
 
   return c;
 }
@@ -3333,7 +3328,7 @@
   int ungetc (int c)
   {
     if (c == '\n')
-      input_line_number--;
+      lexer_flags.input_line_number--;
 
     return ::ungetc (c, f);
   }
@@ -3359,11 +3354,11 @@
         {
         case ' ':
         case '\t':
-          current_input_column++;
+          lexer_flags.current_input_column++;
           break;
 
         case '\n':
-          current_input_column = 1;
+          lexer_flags.current_input_column = 1;
           break;
 
         default:
@@ -3473,8 +3468,6 @@
 
   frame.protect_var (ff_instream);
 
-  frame.protect_var (input_line_number);
-  frame.protect_var (current_input_column);
   frame.protect_var (reading_fcn_file);
   frame.protect_var (line_editing);
   frame.protect_var (current_class_name);
@@ -3484,8 +3477,6 @@
   frame.protect_var (parsing_subfunctions);
   frame.protect_var (endfunction_found);
 
-  input_line_number = 1;
-  current_input_column = 1;
   reading_fcn_file = true;
   line_editing = false;
   current_class_name = dispatch_type;
@@ -3508,6 +3499,11 @@
     {
       bool eof;
 
+      frame.protect_var (lexer_flags);
+
+      // Also resets lexer_flags.
+      reset_parser ();
+
       std::string help_txt = gobble_leading_white_space (ffile, eof);
 
       if (! help_txt.empty ())
@@ -3517,16 +3513,12 @@
         {
           std::string file_type;
 
-          frame.protect_var (lexer_flags);
-
           frame.protect_var (get_input_from_eval_string);
           frame.protect_var (reading_fcn_file);
           frame.protect_var (reading_script_file);
           frame.protect_var (reading_classdef_file);
           frame.protect_var (Vecho_executing_commands);
 
-          lexer_flags = lexical_feedback ();
-
           get_input_from_eval_string = false;
 
           if (! force_script && looking_at_function_keyword (ffile))
@@ -3575,8 +3567,6 @@
           frame.protect_var (primary_fcn_ptr);
           primary_fcn_ptr = 0;
 
-          reset_parser ();
-
           // Do this with an unwind-protect cleanup function so that
           // the forced variables will be unmarked in the event of an
           // interrupt.
@@ -3614,7 +3604,8 @@
       else
         {
           tree_statement *end_of_script
-            = make_end ("endscript", input_line_number, current_input_column);
+            = make_end ("endscript", lexer_flags.input_line_number,
+                        lexer_flags.current_input_column);
 
           make_script (0, end_of_script);
 
@@ -4315,8 +4306,6 @@
 
   frame.protect_var (lexer_flags);
 
-  frame.protect_var (input_line_number);
-  frame.protect_var (current_input_column);
   frame.protect_var (get_input_from_eval_string);
   frame.protect_var (line_editing);
   frame.protect_var (current_eval_string);
@@ -4331,8 +4320,6 @@
 
   lexer_flags = lexical_feedback ();
 
-  input_line_number = 1;
-  current_input_column = 1;
   get_input_from_eval_string = true;
   line_editing = false;
   current_function_depth = 0;
--- a/libinterp/parse-tree/parse.h	Mon Feb 25 20:26:52 2013 -0500
+++ b/libinterp/parse-tree/parse.h	Mon Feb 25 21:30:51 2013 -0500
@@ -44,12 +44,6 @@
 // Nonzero means print parser debugging info (-d).
 extern int octave_debug;
 
-// The current input line number.
-extern int input_line_number;
-
-// The column of the current token.
-extern int current_input_column;
-
 // Buffer for help text snagged from function files.
 extern std::stack<std::string> help_buf;