26#if ! defined (octave_lex_h)
29#include "octave-config.h"
47extern bool iskeyword (
const std::string& s);
62 : m_interpreter (interp), m_frame_stack () { }
70 bool empty ()
const {
return m_frame_stack.empty (); }
72 std::size_t
size ()
const {
return m_frame_stack.size (); }
78 m_frame_stack.push_front (scope);
88 std::deque<symbol_scope> m_frame_stack;
110 : m_context (nl.m_context)
116 m_context = nl.m_context;
130 return ! m_context.empty () && m_context.top () == BRACKET;
133 void brace () { m_context.push (BRACE); }
137 return ! m_context.empty () && m_context.top () == BRACE;
140 void paren () { m_context.push (PAREN); }
144 return ! m_context.empty () && m_context.top () == PAREN;
151 return ! m_context.empty () && m_context.top () == ANON_FCN_BODY;
156 return (! m_context.empty ()
157 && (m_context.top () == BRACKET || m_context.top () == BRACE));
160 bool none () {
return m_context.empty (); }
164 if (! m_context.empty ())
170 while (! m_context.empty ())
176 std::stack<int> m_context;
203 m_buffer.push_front (tok);
210 delete m_buffer.back ();
211 m_buffer.pop_back ();
218 return empty () ? nullptr : m_buffer.at (n);
223 return empty () ? nullptr : m_buffer.at (n);
229 return empty () ? nullptr : m_buffer.front ();
234 return empty () ? nullptr : m_buffer.front ();
239 return empty () ? nullptr : m_buffer.back ();
244 return empty () ? nullptr : m_buffer.back ();
248 std::size_t
size ()
const {
return m_buffer.size (); }
250 bool empty ()
const {
return m_buffer.empty (); }
260 std::deque<token *> m_buffer;
264 : m_interpreter (interp),
265 m_end_of_input (false),
266 m_allow_command_syntax (true),
267 m_at_beginning_of_statement (true),
268 m_looking_at_anon_fcn_args (false),
269 m_looking_at_return_list (false),
270 m_looking_at_parameter_list (false),
271 m_looking_at_decl_list (false),
272 m_looking_at_matrix_or_assign_lhs (false),
273 m_looking_for_object_index (false),
274 m_looking_at_indirect_ref (false),
275 m_arguments_is_keyword (false),
276 m_classdef_element_names_are_keywords (false),
277 m_parsing_anon_fcn_body (false),
278 m_parsing_class_method (false),
279 m_parsing_classdef (false),
280 m_parsing_classdef_decl (false),
281 m_parsing_classdef_superclass (false),
282 m_maybe_classdef_get_set_method (false),
283 m_parsing_classdef_get_method (false),
284 m_parsing_classdef_set_method (false),
285 m_quote_is_transpose (false),
286 m_force_script (false),
287 m_reading_fcn_file (false),
288 m_reading_script_file (false),
289 m_reading_classdef_file (false),
290 m_buffer_function_text (false),
291 m_comment_uses_hash_char (false),
296 m_looking_at_function_handle (0),
297 m_block_comment_nesting_level (0),
298 m_command_arg_paren_count (0),
304 m_current_input_line (),
308 m_fcn_file_full_name (),
311 m_looking_at_object_index (),
312 m_parsed_function_name (),
313 m_symtab_context (interp),
328 int previous_token_id ()
const;
329 token * previous_token ();
330 const token * previous_token ()
const;
332 bool previous_token_is (
int tok_id)
const;
333 bool previous_token_is (
const token *tok)
const;
335 void mark_previous_token_trailing_space ();
337 bool space_follows_previous_token ()
const;
339 bool previous_token_is_binop ()
const;
341 bool previous_token_is_keyword ()
const;
343 bool previous_token_may_be_command ()
const;
345 void mark_as_variable (
const std::string& nm);
346 void mark_as_variables (
const std::list<std::string>& lst);
542 : m_buffer (), m_offset (0), m_chars_left (0), m_eof (false)
547 void fill (
const std::string& input,
bool eof_arg);
550 int copy_chunk (
char *buf, std::size_t max_size,
bool by_lines =
false);
552 bool empty ()
const {
return m_chars_left == 0; }
558 std::string m_buffer;
559 std::size_t m_offset;
560 std::size_t m_chars_left;
570 OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (
base_lexer)
578 virtual void reset ();
580 void prep_for_file ();
582 void begin_string (
int state);
590 int handle_end_of_input ();
592 char * flex_yytext ();
598 void xunput (
char c,
char *buf);
600 void xunput (
char c);
602 void update_token_positions (
int tok_len);
604 bool looking_at_space ();
606 bool inside_any_object_index ();
608 token * make_keyword_token (
const std::string& s);
610 bool fq_identifier_contains_keyword (
const std::string& s);
612 bool whitespace_is_significant ();
618 void handle_continuation ();
625 m_comment_list.
clear ();
629 int handle_close_bracket (
int bracket_type);
631 bool looks_like_command_arg ();
633 int handle_superclass_identifier ();
635 token * make_meta_identifier_token (
const std::string& cls);
637 token * make_fq_identifier_token (
const std::string& ident);
639 int handle_identifier ();
641 void check_comment_for_hash_char (
const char *txt, std::size_t
len);
643 void maybe_warn_separator_insert (
char sep);
645 void warn_language_extension (
const std::string& msg);
647 void maybe_warn_language_extension_comment (
char c);
649 void warn_language_extension_continuation ();
651 void warn_language_extension_operator (
const std::string& op);
653 void warn_deprecated_syntax (
const std::string& msg);
655 int syntax_error (
const std::string& msg);
656 int syntax_error (
const std::string& msg,
const filepos& pos);
657 int syntax_error (
const std::string& msg,
const filepos& beg_pos,
const filepos& end_pos);
659 void push_token (
token *);
661 token * current_token ();
663 std::size_t pending_token_count ()
const;
667 void fatal_error (
const char *msg);
673 void increment_token_count ();
675 void lexer_debug (
const char *pattern);
694 bool input_from_tmp_history_file ();
696 void push_start_state (
int state);
698 void pop_start_state ();
700 void clear_start_state ();
706 bool maybe_unput_comma_before_unary_op (
int tok_id);
708 int handle_op (
int tok_id,
const std::string& tok_txt,
int tok_len,
bool bos =
false,
bool compat =
true);
710 int finish_command_arg ();
712 int handle_token (
int tok_id);
713 int handle_token (
token *tok);
715 int count_token_internal (
int tok_id);
717 int show_token (
int tok_id);
729 :
base_lexer (interp), m_reader (interp), m_initial_input (true)
733 :
base_lexer (interp), m_reader (interp, file), m_initial_input (true)
737 :
base_lexer (interp), m_reader (interp, file, encoding),
738 m_initial_input (true)
742 :
base_lexer (interp), m_reader (interp, eval_string),
743 m_initial_input (true)
746 OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (
lexer)
752 m_initial_input =
true;
759 return m_reader.input_source ();
764 return m_reader.input_from_terminal ();
769 return m_reader.input_from_file ();
774 return m_reader.input_from_eval_string ();
777 int fill_flex_buffer (
char *buf,
unsigned int max_size);
791template <> OCTINTERP_API
int base_lexer::handle_number<2> ();
792template <> OCTINTERP_API
int base_lexer::handle_number<10> ();
793template <> OCTINTERP_API
int base_lexer::handle_number<16> ();
802 append_input (
"",
false);
808 append_input (input,
false);
814 append_input (
"", eof);
820 append_input (input, eof);
823 OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (
push_lexer)
829 void append_input (
const std::string& input,
bool eof);
833 int fill_flex_buffer (
char *buf,
unsigned int max_size);
836OCTAVE_END_NAMESPACE(octave)
base_lexer(interpreter &interp)
comment_list get_comment_list()
bool at_end_of_buffer() const
std::stack< int > start_state_stack
virtual bool is_push_lexer() const
bool at_end_of_file() const
virtual int fill_flex_buffer(char *buf, unsigned int max_size)=0
virtual bool input_from_terminal() const
void display_start_state() const
virtual bool input_from_file() const
virtual std::string input_source() const
void display_token(int tok_id)
virtual bool input_from_eval_string() const
bool display_tokens() const
comment_list m_comment_list
bool input_from_eval_string() const
lexer(FILE *file, interpreter &interp)
bool input_from_file() const
std::string input_source() const
lexer(interpreter &interp)
lexer(FILE *file, interpreter &interp, const std::string &encoding)
lexer(const std::string &eval_string, interpreter &interp)
bool input_from_terminal() const
bool is_bracket_or_brace()
bbp_nesting_level(const bbp_nesting_level &nl)
~bbp_nesting_level()=default
symbol_table_context(interpreter &interp)
void push(const symbol_scope &scope)
const token * back() const
const token * front() const
token * at(std::size_t n)
const token * at(std::size_t n) const
bool m_looking_at_parameter_list
bool m_reading_classdef_file
bool m_looking_at_anon_fcn_args
std::string m_package_name
bool m_arguments_is_keyword
std::string m_current_input_line
bool m_allow_command_syntax
bool m_parsing_classdef_set_method
bool m_parsing_anon_fcn_body
std::string m_comment_text
std::stack< bool > m_parsed_function_name
bool m_at_beginning_of_statement
int m_block_comment_nesting_level
int m_command_arg_paren_count
std::string m_fcn_file_full_name
bool m_looking_at_return_list
bool m_parsing_classdef_get_method
std::string m_string_text
std::list< bool > m_looking_at_object_index
bool m_parsing_classdef_decl
bool m_looking_at_matrix_or_assign_lhs
bool m_parsing_classdef_superclass
lexical_feedback(interpreter &interp)
bool m_looking_for_object_index
interpreter & m_interpreter
bbp_nesting_level m_nesting_level
bool m_reading_script_file
bool m_classdef_element_names_are_keywords
std::size_t m_token_count
std::string m_function_text
bool m_comment_uses_hash_char
std::string m_fcn_file_name
bool m_looking_at_decl_list
symbol_table_context m_symtab_context
bool m_quote_is_transpose
bool m_parsing_class_method
bool m_buffer_function_text
bool m_maybe_classdef_get_set_method
bool m_looking_at_indirect_ref
int m_looking_at_function_handle
push_lexer(const std::string &input, bool eof, interpreter &interp)
push_lexer(interpreter &interp)
push_lexer(bool eof, interpreter &interp)
bool is_push_lexer() const
std::string input_source() const
push_lexer(const std::string &input, interpreter &interp)
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
bool iskeyword(const std::string &s)