# HG changeset patch # User John W. Eaton # Date 1571398862 14400 # Node ID cb964b74d8a001e8cdeeb1ea58b4d123af6f1411 # Parent 09175c0e417de0b22bf6a5605ca157ee5ac25349 Backed out changeset 28ed77ca1e4a diff -r 09175c0e417d -r cb964b74d8a0 libinterp/corefcn/interpreter.cc --- a/libinterp/corefcn/interpreter.cc Sun Oct 20 08:55:16 2019 -0700 +++ b/libinterp/corefcn/interpreter.cc Fri Oct 18 07:41:02 2019 -0400 @@ -999,7 +999,7 @@ // be adjusted automatically when we are parsing multi-line // commands. - push_parser repl_parser (*this, &reader); + push_parser repl_parser (*this); #else diff -r 09175c0e417d -r cb964b74d8a0 libinterp/parse-tree/lex.h --- a/libinterp/parse-tree/lex.h Sun Oct 20 08:55:16 2019 -0700 +++ b/libinterp/parse-tree/lex.h Fri Oct 18 07:41:02 2019 -0400 @@ -597,9 +597,9 @@ comment_list *m_comment_list; }; - 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 () + base_lexer (interpreter& interp) + : lexical_feedback (interp), m_scanner (nullptr), m_input_buf (), + m_comment_buf () { init (); } @@ -700,13 +700,6 @@ 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; @@ -716,38 +709,13 @@ // Object that collects comment text. comment_buffer m_comment_buf; - void increment_promptflag (void) - { - if (m_reader) - m_reader->increment_promptflag (); - else - m_pflag++; - } + virtual void increment_promptflag (void) = 0; - void decrement_promptflag (void) - { - if (m_reader) - m_reader->decrement_promptflag (); - else - m_pflag--; - } + virtual void decrement_promptflag (void) = 0; - int promptflag (void) const - { - return m_reader ? m_reader->promptflag () : m_pflag; - } + virtual int promptflag (void) const = 0; - int promptflag (int n) - { - if (m_reader) - return m_reader->promptflag (n); - else - { - int retval = m_pflag; - m_pflag = n; - return retval; - } - } + virtual int promptflag (int) = 0; virtual std::string input_source (void) const { return "unknown"; } @@ -807,15 +775,15 @@ public: lexer (interpreter& interp) - : base_lexer (interp, new input_reader (interp)) + : base_lexer (interp), m_reader (interp) { } lexer (FILE *file, interpreter& interp) - : base_lexer (interp, new input_reader (interp, file)) + : base_lexer (interp), m_reader (interp, file) { } lexer (const std::string& eval_string, interpreter& interp) - : base_lexer (interp, new input_reader (interp, eval_string)) + : base_lexer (interp), m_reader (interp, eval_string) { } // No copying! @@ -826,32 +794,42 @@ 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 @@ -859,32 +837,26 @@ { public: - // 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) + push_lexer (interpreter& interp) + : base_lexer (interp), m_pflag (1) { append_input ("", false); } - push_lexer (const std::string& input, interpreter& interp, - input_reader *reader = nullptr) - : base_lexer (interp, reader) + push_lexer (const std::string& input, interpreter& interp) + : base_lexer (interp), m_pflag (1) { append_input (input, false); } - push_lexer (bool eof, interpreter& interp, input_reader *reader = nullptr) - : base_lexer (interp, reader) + push_lexer (bool eof, interpreter& interp) + : base_lexer (interp), m_pflag (1) { append_input ("", eof); } - push_lexer (const std::string& input, bool eof, interpreter& interp, - input_reader *reader = nullptr) - : base_lexer (interp, reader) + push_lexer (const std::string& input, bool eof, interpreter& interp) + : base_lexer (interp), m_pflag (1) { append_input (input, eof); } @@ -906,9 +878,26 @@ 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; }; } diff -r 09175c0e417d -r cb964b74d8a0 libinterp/parse-tree/lex.ll --- a/libinterp/parse-tree/lex.ll Sun Oct 20 08:55:16 2019 -0700 +++ b/libinterp/parse-tree/lex.ll Fri Oct 18 07:41:02 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); diff -r 09175c0e417d -r cb964b74d8a0 libinterp/parse-tree/parse.h --- a/libinterp/parse-tree/parse.h Sun Oct 20 08:55:16 2019 -0700 +++ b/libinterp/parse-tree/parse.h Fri Oct 18 07:41:02 2019 -0400 @@ -589,12 +589,8 @@ { public: - // 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))) + push_parser (interpreter& interp) + : base_parser (*(new push_lexer (interp))) { } // No copying!