changeset 27513:28ed77ca1e4a

allow input reader to be associated with push lexer * lex.h, lex.ll (base_lexer::m_pflag, base_lexer::m_reader): New data members, moved here and combined from lexer and push_lexer classes. The m_reader variable is now a pointer. If null, manage promptflag state locally, otherwise use reader object to manage it. Accept pointer to reader in base_lexer constructor. Change all uses that need to associate a reader object with the lexer. * parse.h (push_parser::push_parser): Accept pointer to input_reader object as argument.
author John W. Eaton <jwe@octave.org>
date Wed, 16 Oct 2019 10:16:17 -0400
parents 549273db93e4
children cc023f049dbf
files libinterp/parse-tree/lex.h libinterp/parse-tree/lex.ll libinterp/parse-tree/parse.h
diffstat 3 files changed, 68 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/lex.h	Fri Oct 11 12:29:18 2019 -0400
+++ b/libinterp/parse-tree/lex.h	Wed Oct 16 10:16:17 2019 -0400
@@ -597,9 +597,9 @@
       comment_list *m_comment_list;
     };
 
-    base_lexer (interpreter& interp)
-      : lexical_feedback (interp), m_scanner (nullptr), m_input_buf (),
-        m_comment_buf ()
+    base_lexer (interpreter& interp, input_reader *reader = nullptr)
+      : lexical_feedback (interp), m_pflag (1), m_reader (reader),
+        m_scanner (nullptr), m_input_buf (), m_comment_buf ()
     {
       init ();
     }
@@ -700,6 +700,13 @@
 
     void lexer_debug (const char *pattern);
 
+    // Manage promptflag info locally if no input reader object is
+    // associated with this lexer.
+    int m_pflag;
+
+    // Allows the reader prompt level to be managed automatically.
+    input_reader *m_reader;
+
     // Internal state of the flex-generated lexer.
     void *m_scanner;
 
@@ -709,13 +716,38 @@
     // Object that collects comment text.
     comment_buffer m_comment_buf;
 
-    virtual void increment_promptflag (void) = 0;
+    void increment_promptflag (void)
+    {
+      if (m_reader)
+        m_reader->increment_promptflag ();
+      else
+        m_pflag++;
+    }
 
-    virtual void decrement_promptflag (void) = 0;
+    void decrement_promptflag (void)
+    {
+      if (m_reader)
+        m_reader->decrement_promptflag ();
+      else
+        m_pflag--;
+    }
 
-    virtual int promptflag (void) const = 0;
+    int promptflag (void) const
+    {
+      return m_reader ? m_reader->promptflag () : m_pflag;
+    }
 
-    virtual int promptflag (int) = 0;
+    int promptflag (int n)
+    {
+      if (m_reader)
+        return m_reader->promptflag (n);
+      else
+        {
+          int retval = m_pflag;
+          m_pflag = n;
+          return retval;
+        }
+    }
 
     virtual std::string input_source (void) const { return "unknown"; }
 
@@ -775,15 +807,15 @@
   public:
 
     lexer (interpreter& interp)
-      : base_lexer (interp), m_reader (interp)
+      : base_lexer (interp, new input_reader (interp))
     { }
 
     lexer (FILE *file, interpreter& interp)
-      : base_lexer (interp), m_reader (interp, file)
+      : base_lexer (interp, new input_reader (interp, file))
     { }
 
     lexer (const std::string& eval_string, interpreter& interp)
-      : base_lexer (interp), m_reader (interp, eval_string)
+      : base_lexer (interp, new input_reader (interp, eval_string))
     { }
 
     // No copying!
@@ -794,42 +826,32 @@
 
     void reset (void)
     {
-      m_reader.reset ();
+      m_reader->reset ();
 
       base_lexer::reset ();
     }
 
-    void increment_promptflag (void) { m_reader.increment_promptflag (); }
-
-    void decrement_promptflag (void) { m_reader.decrement_promptflag (); }
-
-    int promptflag (void) const { return m_reader.promptflag (); }
-
-    int promptflag (int n) { return m_reader.promptflag (n); }
-
     std::string input_source (void) const
     {
-      return m_reader.input_source ();
+      return m_reader->input_source ();
     }
 
     bool input_from_terminal (void) const
     {
-      return m_reader.input_from_terminal ();
+      return m_reader->input_from_terminal ();
     }
 
     bool input_from_file (void) const
     {
-      return m_reader.input_from_file ();
+      return m_reader->input_from_file ();
     }
 
     bool input_from_eval_string (void) const
     {
-      return m_reader.input_from_eval_string ();
+      return m_reader->input_from_eval_string ();
     }
 
     int fill_flex_buffer (char *buf, unsigned int max_size);
-
-    input_reader m_reader;
   };
 
   class
@@ -837,26 +859,32 @@
   {
   public:
 
-    push_lexer (interpreter& interp)
-      : base_lexer (interp), m_pflag (1)
+    // Allow the input_reader object to be attached to the lexer so that
+    // the prompt flag can be adjusted automatically when we are parsing
+    // multi-line commands.
+
+    push_lexer (interpreter& interp, input_reader *reader = nullptr)
+      : base_lexer (interp, reader)
     {
       append_input ("", false);
     }
 
-    push_lexer (const std::string& input, interpreter& interp)
-      : base_lexer (interp), m_pflag (1)
+    push_lexer (const std::string& input, interpreter& interp,
+                input_reader *reader = nullptr)
+      : base_lexer (interp, reader)
     {
       append_input (input, false);
     }
 
-    push_lexer (bool eof, interpreter& interp)
-      : base_lexer (interp), m_pflag (1)
+    push_lexer (bool eof, interpreter& interp, input_reader *reader = nullptr)
+      : base_lexer (interp, reader)
     {
       append_input ("", eof);
     }
 
-    push_lexer (const std::string& input, bool eof, interpreter& interp)
-      : base_lexer (interp), m_pflag (1)
+    push_lexer (const std::string& input, bool eof, interpreter& interp,
+                input_reader *reader = nullptr)
+      : base_lexer (interp, reader)
     {
       append_input (input, eof);
     }
@@ -878,26 +906,9 @@
 
     void append_input (const std::string& input, bool eof);
 
-    void increment_promptflag (void) { m_pflag++; }
-
-    void decrement_promptflag (void) { m_pflag--; }
-
-    int promptflag (void) const { return m_pflag; }
-
-    int promptflag (int n)
-    {
-      int retval = m_pflag;
-      m_pflag = n;
-      return retval;
-    }
-
     std::string input_source (void) const { return "push buffer"; }
 
     int fill_flex_buffer (char *buf, unsigned int max_size);
-
-  protected:
-
-    int m_pflag;
   };
 }
 
--- a/libinterp/parse-tree/lex.ll	Fri Oct 11 12:29:18 2019 -0400
+++ b/libinterp/parse-tree/lex.ll	Wed Oct 16 10:16:17 2019 -0400
@@ -3712,7 +3712,7 @@
     if (m_input_buf.empty ())
       {
         bool eof = false;
-        m_current_input_line = m_reader.get_input (eof);
+        m_current_input_line = m_reader->get_input (eof);
 
         m_input_buf.fill (m_current_input_line, eof);
 
--- a/libinterp/parse-tree/parse.h	Fri Oct 11 12:29:18 2019 -0400
+++ b/libinterp/parse-tree/parse.h	Wed Oct 16 10:16:17 2019 -0400
@@ -589,8 +589,12 @@
   {
   public:
 
-    push_parser (interpreter& interp)
-      : base_parser (*(new push_lexer (interp)))
+    // Allow the input_reader object to be attached to the lexer so that
+    // the prompt flag can be adjusted automatically when we are parsing
+    // multi-line commands.
+
+    push_parser (interpreter& interp, input_reader *reader = nullptr)
+      : base_parser (*(new push_lexer (interp, reader)))
     { }
 
     // No copying!