26 #if ! defined (octave_lex_h)
27 #define octave_lex_h 1
29 #include "octave-config.h"
47 extern bool iskeyword (
const std::string& s);
63 : m_interpreter (interp), m_frame_stack () { }
69 bool empty (
void)
const {
return m_frame_stack.empty (); }
71 size_t size (
void)
const {
return m_frame_stack.size (); }
77 m_frame_stack.push_front (scope);
109 : m_context (nl.m_context)
125 void bracket (
void) { m_context.push (BRACKET); }
129 return ! m_context.empty () && m_context.top () == BRACKET;
132 void brace (
void) { m_context.push (BRACE); }
136 return ! m_context.empty () && m_context.top () == BRACE;
139 void paren (
void) { m_context.push (PAREN); }
143 return ! m_context.empty () && m_context.top () == PAREN;
150 return ! m_context.empty () && m_context.top () == ANON_FCN_BODY;
155 return (! m_context.empty ()
156 && (m_context.top () == BRACKET || m_context.top () == BRACE));
159 bool none (
void) {
return m_context.empty (); }
163 if (! m_context.empty ())
169 while (! m_context.empty ())
206 m_buffer.push_front (tok);
213 delete m_buffer.back ();
214 m_buffer.pop_back ();
221 return empty () ? nullptr : m_buffer.at (
n);
226 return empty () ? nullptr : m_buffer.at (
n);
232 return empty () ? nullptr : m_buffer.front ();
237 return empty () ? nullptr : m_buffer.front ();
242 return empty () ? nullptr : m_buffer.back ();
247 return empty () ? nullptr : m_buffer.back ();
251 size_t size (
void)
const {
return m_buffer.size (); }
253 bool empty (
void)
const {
return m_buffer.empty (); }
267 : m_interpreter (interp),
268 m_end_of_input (false),
269 m_allow_command_syntax (true),
270 m_at_beginning_of_statement (true),
271 m_looking_at_anon_fcn_args (false),
272 m_looking_at_return_list (false),
273 m_looking_at_parameter_list (false),
274 m_looking_at_decl_list (false),
275 m_looking_at_initializer_expression (false),
276 m_looking_at_matrix_or_assign_lhs (false),
277 m_looking_for_object_index (false),
278 m_looking_at_indirect_ref (false),
279 m_parsing_anon_fcn_body (false),
280 m_parsing_class_method (false),
281 m_parsing_classdef (false),
282 m_parsing_classdef_decl (false),
283 m_parsing_classdef_superclass (false),
284 m_maybe_classdef_get_set_method (false),
285 m_parsing_classdef_get_method (false),
286 m_parsing_classdef_set_method (false),
287 m_quote_is_transpose (false),
288 m_force_script (false),
289 m_reading_fcn_file (false),
290 m_reading_script_file (false),
291 m_reading_classdef_file (false),
292 m_buffer_function_text (false),
297 m_looking_at_function_handle (0),
298 m_block_comment_nesting_level (0),
299 m_command_arg_paren_count (0),
305 m_current_input_line (),
310 m_fcn_file_full_name (),
313 m_looking_at_object_index (),
314 m_parsed_function_name (),
315 m_pending_local_variables (),
316 m_symtab_context (interp),
335 int previous_token_value (
void)
const;
337 bool previous_token_value_is (
int tok_val)
const;
339 void mark_previous_token_trailing_space (
void);
341 bool space_follows_previous_token (
void)
const;
343 bool previous_token_is_binop (
void)
const;
345 bool previous_token_is_keyword (
void)
const;
347 bool previous_token_may_be_command (
void)
const;
349 void maybe_mark_previous_token_as_variable (
void);
352 void mark_as_variables (
const std::list<std::string>& lst);
545 : m_buffer (), m_offset (0), m_chars_left (0), m_eof (false)
548 void fill (
const std::string&
input,
bool eof_arg);
551 int copy_chunk (
char *buf,
size_t max_size,
bool by_lines =
false);
553 bool empty (
void)
const {
return m_chars_left == 0; }
555 bool at_eof (
void)
const {
return m_eof; }
578 if (! m_comment_list)
581 m_comment_list->append (s, t);
590 m_comment_list =
nullptr;
597 delete m_comment_list;
599 m_comment_list =
nullptr;
626 virtual void reset (
void);
628 void prep_for_file (
void);
630 void begin_string (
int state);
638 int handle_end_of_input (
void);
640 char * flex_yytext (
void);
642 int flex_yyleng (
void);
644 int text_yyinput (
void);
646 void xunput (
char c,
char *buf);
648 void xunput (
char c);
650 void update_token_positions (
int tok_len);
652 bool looking_at_space (
void);
654 bool inside_any_object_index (
void);
658 int make_keyword_token (
const std::string& s);
660 bool fq_identifier_contains_keyword (
const std::string& s);
662 bool whitespace_is_significant (
void);
664 void handle_number (
void);
666 void handle_continuation (
void);
672 int handle_close_bracket (
int bracket_type);
674 bool looks_like_command_arg (
void);
676 int handle_superclass_identifier (
void);
678 int handle_meta_identifier (
void);
680 int handle_fq_identifier (
void);
682 int handle_identifier (
void);
684 void maybe_warn_separator_insert (
char sep);
686 void warn_single_quote_string (
void);
688 void warn_language_extension (
const std::string& msg);
690 void maybe_warn_language_extension_comment (
char c);
692 void warn_language_extension_continuation (
void);
694 void warn_language_extension_operator (
const std::string& op);
696 void push_token (
token *);
698 token * current_token (
void);
700 size_t pending_token_count (
void)
const;
702 void display_token (
int tok);
704 void fatal_error (
const char *msg);
706 bool debug_flag (
void)
const;
708 bool display_tokens (
void)
const;
710 void increment_token_count (
void);
712 void lexer_debug (
const char *pattern);
731 bool input_from_tmp_history_file (
void);
733 void push_start_state (
int state);
735 void pop_start_state (
void);
737 void clear_start_state (
void);
741 void display_start_state (
void)
const;
743 bool maybe_unput_comma_before_unary_op (
int tok);
745 int handle_op (
int tok,
bool bos =
false,
bool compat =
true);
747 int finish_command_arg (
void);
749 int handle_token (
int tok,
token *tok_val =
nullptr);
751 int count_token (
int tok);
753 int count_token_internal (
int tok);
755 int show_token (
int tok);
768 :
base_lexer (interp), m_reader (interp), m_initial_input (true)
772 :
base_lexer (interp), m_reader (interp, file), m_initial_input (true)
777 m_initial_input (true)
788 m_initial_input =
true;
795 return m_reader.input_source ();
800 return m_reader.input_from_terminal ();
805 return m_reader.input_from_file ();
810 return m_reader.input_from_eval_string ();
813 int fill_flex_buffer (
char *buf,
unsigned int max_size);
833 append_input (
"",
false);
839 append_input (
input,
false);
845 append_input (
"", eof);
851 append_input (
input, eof);
862 void append_input (
const std::string&
input,
bool eof);
866 int fill_flex_buffer (
char *buf,
unsigned int max_size);
virtual bool input_from_eval_string(void) const
virtual int fill_flex_buffer(char *buf, unsigned int max_size)=0
int start_state(void) const
comment_buffer m_comment_buf
std::stack< int > start_state_stack
virtual bool input_from_terminal(void) const
bool at_end_of_buffer(void) const
base_lexer(const base_lexer &)=delete
bool at_end_of_file(void) const
virtual std::string input_source(void) const
virtual bool is_push_lexer(void) const
virtual bool input_from_file(void) const
base_lexer(interpreter &interp)
comment_list * get_comment(void)
bool input_from_terminal(void) const
bool input_from_eval_string(void) const
lexer(FILE *file, interpreter &interp)
std::string input_source(void) const
bool input_from_file(void) const
lexer(const std::string &eval_string, interpreter &interp)
lexer(interpreter &interp)
lexer(const lexer &)=delete
bbp_nesting_level(const bbp_nesting_level &nl)
bool is_bracket_or_brace(void)
std::stack< int > m_context
~bbp_nesting_level(void)=default
bool is_anon_fcn_body(void)
interpreter & m_interpreter
void push(const symbol_scope &scope)
~symbol_table_context(void)
std::deque< symbol_scope > m_frame_stack
symbol_table_context(interpreter &interp)
token_cache(const token_cache &)=delete
const token * at(size_t n) const
const token * front(void) const
const token * back(void) const
std::deque< token * > m_buffer
std::string m_comment_text
void mark_as_variable(const std::string &nm)
bool m_looking_at_matrix_or_assign_lhs
std::stack< bool > m_parsed_function_name
int m_command_arg_paren_count
std::string m_current_input_line
bbp_nesting_level m_nesting_level
lexical_feedback(const lexical_feedback &)=delete
bool m_looking_at_return_list
int m_block_comment_nesting_level
bool m_looking_at_decl_list
bool m_looking_at_anon_fcn_args
bool m_reading_classdef_file
bool m_parsing_classdef_superclass
bool m_parsing_classdef_decl
interpreter & m_interpreter
bool m_allow_command_syntax
bool m_looking_at_parameter_list
bool m_parsing_anon_fcn_body
bool m_parsing_classdef_get_method
bool m_parsing_classdef_set_method
bool m_reading_script_file
symbol_table_context m_symtab_context
std::string m_string_text
bool m_buffer_function_text
bool m_looking_at_initializer_expression
std::string m_fcn_file_full_name
bool m_maybe_classdef_get_set_method
std::list< bool > m_looking_at_object_index
std::string m_package_name
bool m_quote_is_transpose
int m_looking_at_function_handle
bool m_parsing_class_method
std::set< std::string > m_pending_local_variables
bool m_looking_for_object_index
bool m_looking_at_indirect_ref
lexical_feedback(interpreter &interp)
bool m_at_beginning_of_statement
std::string m_function_text
std::string m_fcn_file_name
push_lexer(const std::string &input, interpreter &interp)
push_lexer(const std::string &input, bool eof, interpreter &interp)
bool is_push_lexer(void) const
push_lexer(interpreter &interp)
std::string input_source(void) const
push_lexer(bool eof, interpreter &interp)
push_lexer(const push_lexer &)=delete
static uint32_t state[624]
octave_value_list eval_string(const std::string &eval_str, bool silent, int &parse_status, int nargout)
bool iskeyword(const std::string &s)
static int input(yyscan_t yyscanner)
octave_value::octave_value(const Array< char > &chm, char type) return retval