changeset 16194:b7ca669af528

reset lexical_feedback state before starting a new parse * lex.h, lex.cc (bbp_nesting_level::reset): New function. (lexical_feedback::reset, lexical_feedback::reset_token_stack): New functions. (lexical_feedback::~lexical_feedback): Call reset_token_stack to do the job. (octave_lexer::reset): Call lexical_feedback::reset.
author John W. Eaton <jwe@octave.org>
date Tue, 05 Mar 2013 10:19:47 -0500
parents d7392bf42fd1
children b52d2f9294b6
files libinterp/parse-tree/lex.h libinterp/parse-tree/lex.ll
diffstat 2 files changed, 68 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/lex.h
+++ b/libinterp/parse-tree/lex.h
@@ -106,6 +106,12 @@
 
     ~bbp_nesting_level (void) { }
 
+    void reset (void)
+    {
+      while (! context.empty ())
+        context.pop ();
+    }
+
     void bracket (void) { context.push (BRACKET); }
 
     bool is_bracket (void)
@@ -176,7 +182,9 @@
   ~lexical_feedback (void);
 
   void init (void);
-  
+
+  void reset (void);
+
   // true means that we have encountered eof on the input stream.
   bool end_of_input;
 
@@ -280,6 +288,8 @@
 
 private:
 
+  void reset_token_stack (void);
+
   // No copying!
 
   lexical_feedback (const lexical_feedback&);
--- a/libinterp/parse-tree/lex.ll
+++ b/libinterp/parse-tree/lex.ll
@@ -1294,6 +1294,61 @@
 
 lexical_feedback::~lexical_feedback (void)
 {
+  reset_token_stack ();
+}
+
+void
+lexical_feedback::init (void)
+{
+  // The closest paren, brace, or bracket nesting is not an object
+  // index.
+  looking_at_object_index.push_front (false);
+}
+
+void
+lexical_feedback::reset (void)
+{
+  end_of_input = false;
+  convert_spaces_to_comma = true;
+  do_comma_insert = false;
+  at_beginning_of_statement = true;
+  looking_at_anon_fcn_args = false;
+  looking_at_return_list = false;
+  looking_at_parameter_list = false;
+  looking_at_decl_list = false;
+  looking_at_initializer_expression = false;
+  looking_at_matrix_or_assign_lhs = false;
+  looking_for_object_index = false; 
+  looking_at_indirect_ref = false;
+  parsing_class_method = false;
+  maybe_classdef_get_set_method = false;
+  parsing_classdef = false;
+  quote_is_transpose = false;
+  input_line_number = 1;
+  current_input_column = 1;
+  bracketflag = 0;
+  braceflag = 0;
+  looping = 0;
+  defining_func = 0;
+  looking_at_function_handle = 0;
+  block_comment_nesting_level = 0;
+
+  looking_at_object_index.clear ();
+  looking_at_object_index.push_front (false);
+
+  while (! parsed_function_name.empty ())
+    parsed_function_name.pop ();
+
+  pending_local_variables.clear ();
+
+  nesting_level.reset ();
+
+  reset_token_stack ();
+}
+
+void
+lexical_feedback::reset_token_stack (void)
+{
   // Clear out the stack of token info used to track line and
   // column numbers.
 
@@ -1305,14 +1360,6 @@
 }
 
 void
-lexical_feedback::init (void)
-{
-  // The closest paren, brace, or bracket nesting is not an object
-  // index.
-  looking_at_object_index.push_front (false);
-}
-
-void
 octave_lexer::input_buffer::read (void)
 {
   buffer = get_user_input (eof);
@@ -1407,6 +1454,8 @@
   // Clear the buffer for help text.
   while (! help_buf.empty ())
     help_buf.pop ();
+
+  lexical_feedback::reset ();
 }
 
 void