Mercurial > octave
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!