26#if ! defined (octave_parse_h)
27#define octave_parse_h 1
29#include "octave-config.h"
54 class tree_anon_fcn_handle;
55 class tree_arg_size_spec;
56 class tree_arg_validation;
57 class tree_arg_validation_fcns;
58 class tree_args_block_attribute_list;
59 class tree_args_block_validation_list;
60 class tree_argument_list;
61 class tree_arguments_block;
62 class tree_array_list;
65 class tree_classdef_attribute_list;
66 class tree_classdef_body;
67 class tree_classdef_enum_block;
68 class tree_classdef_enum_list;
69 class tree_classdef_events_block;
70 class tree_classdef_events_list;
71 class tree_classdef_methods_block;
72 class tree_classdef_methods_list;
73 class tree_classdef_properties_block;
74 class tree_classdef_property_list;
75 class tree_classdef_superclass_list;
76 class tree_colon_expression;
79 class tree_decl_command;
80 class tree_decl_init_list;
81 class tree_expression;
82 class tree_fcn_handle;
83 class tree_function_def;
84 class tree_identifier;
86 class tree_if_command;
87 class tree_if_command_list;
88 class tree_index_expression;
91 class tree_parameter_list;
92 class tree_spmd_command;
94 class tree_statement_list;
95 class tree_statement_listtree_statement;
96 class tree_switch_case;
97 class tree_switch_case_list;
98 class tree_switch_command;
138 OCTINTERP_API std::size_t
size (
void)
const;
144 OCTINTERP_API
void pop (
void);
146 OCTINTERP_API
bool name_ok (
const std::string&
name);
152 OCTINTERP_API std::string
parent_name (
void)
const;
154 OCTINTERP_API
void clear (
void);
179 OCTINTERP_API
void reset (
void);
191 OCTINTERP_API
void statement_list (std::shared_ptr<tree_statement_list>& lst);
404 make_end (
const std::string& type,
bool eof,
662 template <
typename T>
704 OCTINTERP_API
void bison_error (
const std::string& s,
int line,
int column);
705 OCTINTERP_API
void bison_error (
const std::list<parse_exception>& pe);
710 const std::string& file,
const std::string& dir_name,
711 const std::string& dispatch_type,
712 const std::string& package_name,
bool require_file,
713 bool force_script,
bool autoload,
bool relative_lookup);
721 virtual int run (
void) = 0;
728 bool at_eof =
false);
818 const std::string& file,
const std::string& dir_name,
819 const std::string& dispatch_type,
820 const std::string& package_name,
bool require_file,
821 bool force_script,
bool autoload,
bool relative_lookup);
859 OCTINTERP_API
int run (
void);
891 OCTINTERP_API
int run (
void);
896 OCTINTERP_API
int run (
const std::string&
input,
bool eof);
905 extern OCTINTERP_API std::string
909 extern OCTINTERP_API std::string
914 const std::string& dir_name =
"",
915 const std::string& dispatch_type =
"",
916 const std::string& package_name =
"",
917 const std::string& fcn_name =
"",
918 bool autoload =
false);
920 extern OCTINTERP_API
void
922 const std::string& context =
"",
923 bool verbose =
false,
bool require_file =
true);
948 extern OCTINTERP_API
void
OCTINTERP_API void clear(void)
parent_scope_info(const parent_scope_info &)=delete
parent_scope_info(void)=delete
std::deque< value_type >::iterator iterator
OCTINTERP_API bool name_ok(const std::string &name)
OCTINTERP_API void push(const symbol_scope &id)
parent_scope_info & operator=(const parent_scope_info &)=delete
OCTINTERP_API bool name_current_scope(const std::string &name)
std::deque< value_type >::const_iterator const_iterator
std::deque< value_type >::reverse_iterator reverse_iterator
OCTINTERP_API std::string parent_name(void) const
std::pair< symbol_scope, std::string > value_type
OCTINTERP_API std::size_t size(void) const
OCTINTERP_API symbol_scope parent_scope(void) const
std::deque< value_type >::const_reverse_iterator const_reverse_iterator
OCTINTERP_API void pop(void)
OCTINTERP_API void push(const value_type &elt)
std::set< std::string > m_all_names
~parent_scope_info(void)=default
std::deque< value_type > m_info
parent_scope_info(base_parser &parser)
OCTINTERP_API tree_argument_list * append_argument_list(tree_argument_list *list, tree_expression *expr)
OCTINTERP_API tree_arg_validation * make_arg_validation(tree_arg_size_spec *size_spec, tree_identifier *class_name, tree_arg_validation_fcns *validation_fcns, tree_expression *default_value)
OCTINTERP_API void bison_error(const std::list< parse_exception > &pe)
OCTINTERP_API tree_decl_command * make_decl_command(int tok, token *tok_val, tree_decl_init_list *lst)
OCTINTERP_API bool validate_primary_fcn(void)
OCTINTERP_API tree_classdef_attribute_list * append_classdef_attribute(tree_classdef_attribute_list *list, tree_classdef_attribute *elt)
std::shared_ptr< tree_statement_list > statement_list(void) const
OCTINTERP_API void disallow_command_syntax(void)
OCTINTERP_API tree_command * make_unwind_command(token *unwind_tok, tree_statement_list *body, tree_statement_list *cleanup, token *end_tok, comment_list *lc, comment_list *mc)
OCTINTERP_API octave_user_function * frob_function(tree_identifier *id, octave_user_function *fcn)
OCTINTERP_API tree_cell * make_cell(tree_argument_list *row)
OCTINTERP_API tree_index_expression * make_indirect_ref(tree_expression *expr, const std::string &)
OCTINTERP_API tree_fcn_handle * make_fcn_handle(token *tok_val)
bool m_parsing_local_functions
OCTINTERP_API tree_switch_command * finish_switch_command(token *switch_tok, tree_expression *expr, tree_switch_case_list *list, token *end_tok, comment_list *lc)
octave_value m_primary_fcn
OCTINTERP_API tree_switch_case_list * make_switch_case_list(tree_switch_case *switch_case)
OCTINTERP_API void recover_from_parsing_function(void)
OCTINTERP_API tree_argument_list * validate_matrix_for_assignment(tree_expression *e)
OCTINTERP_API tree_classdef_attribute_list * make_classdef_attribute_list(tree_classdef_attribute *attr)
OCTINTERP_API tree_classdef_body * make_classdef_body(tree_classdef_properties_block *pb)
OCTINTERP_API tree_expression * make_assign_op(int op, tree_argument_list *lhs, token *eq_tok, tree_expression *rhs)
OCTINTERP_API tree_if_command * finish_if_command(token *if_tok, tree_if_command_list *list, token *end_tok, comment_list *lc)
OCTINTERP_API tree_classdef_properties_block * make_classdef_properties_block(token *tok_val, tree_classdef_attribute_list *a, tree_classdef_property_list *plist, token *end_tok, comment_list *lc, comment_list *tc)
OCTINTERP_API bool validate_array_list(tree_expression *e)
OCTINTERP_API tree_function_def * finish_classdef_external_method(octave_user_function *fcn, tree_parameter_list *ret_list, comment_list *cl)
OCTINTERP_API base_parser(base_lexer &lxr)
OCTINTERP_API tree_identifier * make_identifier(token *ident)
OCTINTERP_API tree_classdef_events_list * make_classdef_events_list(tree_classdef_event *e)
OCTINTERP_API tree_index_expression * make_indirect_ref(tree_expression *expr, tree_expression *field)
OCTINTERP_API tree_matrix * append_matrix_row(tree_matrix *matrix, tree_argument_list *row)
OCTINTERP_API bool finish_input(tree_statement_list *lst, bool at_eof=false)
OCTINTERP_API tree_classdef * make_classdef(token *tok_val, tree_classdef_attribute_list *a, tree_identifier *id, tree_classdef_superclass_list *sc, tree_classdef_body *body, token *end_tok, comment_list *lc, comment_list *tc)
OCTINTERP_API tree_parameter_list * make_parameter_list(tree_parameter_list::in_or_out io)
OCTINTERP_API tree_parameter_list * append_parameter_list(tree_parameter_list *list, tree_decl_elt *t)
OCTINTERP_API tree_classdef_property * make_classdef_property(comment_list *lc, tree_identifier *id, tree_arg_validation *av)
OCTINTERP_API tree_classdef_superclass_list * make_classdef_superclass_list(tree_classdef_superclass *sc)
base_parser(const base_parser &)=delete
bool parsing_subfunctions(void) const
std::shared_ptr< tree_classdef > m_classdef_object
OCTINTERP_API tree_if_command_list * append_if_clause(tree_if_command_list *list, tree_if_clause *clause)
parent_scope_info m_function_scopes
OCTINTERP_API tree_command * make_return_command(token *return_tok)
virtual ~base_parser(void)
int curr_fcn_depth(void) const
OCTINTERP_API tree_identifier * make_fcn_name(tree_identifier *id)
symbol_scope m_primary_fcn_scope
OCTINTERP_API tree_cell * append_cell_row(tree_cell *cell, tree_argument_list *row)
OCTINTERP_API tree_matrix * make_matrix(tree_argument_list *row)
OCTINTERP_API void reset(void)
OCTINTERP_API tree_command * make_for_command(int tok_id, token *for_tok, tree_argument_list *lhs, tree_expression *expr, tree_expression *maxproc, tree_statement_list *body, token *end_tok, comment_list *lc)
OCTINTERP_API tree_expression * make_binary_op(int op, tree_expression *op1, token *tok_val, tree_expression *op2)
OCTINTERP_API void bison_error(const std::string &s, const filepos &pos)
OCTINTERP_API tree_decl_elt * make_decl_elt(tree_identifier *id, token *eq_op=nullptr, tree_expression *expr=nullptr)
OCTINTERP_API tree_command * make_do_until_command(token *until_tok, tree_statement_list *body, tree_expression *expr, comment_list *lc)
OCTINTERP_API tree_command * make_continue_command(token *continue_tok)
OCTINTERP_API void bison_error(const std::string &s)
OCTINTERP_API tree_if_clause * make_else_clause(token *else_tok, comment_list *lc, tree_statement_list *list)
void endfunction_found(bool flag)
bool at_end_of_input(void) const
OCTINTERP_API tree_command * make_while_command(token *while_tok, tree_expression *expr, tree_statement_list *body, token *end_tok, comment_list *lc)
OCTINTERP_API tree_command * make_try_command(token *try_tok, tree_statement_list *body, char catch_sep, tree_statement_list *cleanup, token *end_tok, comment_list *lc, comment_list *mc)
bool endfunction_found(void) const
OCTINTERP_API tree_switch_case_list * append_switch_case(tree_switch_case_list *list, tree_switch_case *elt)
OCTINTERP_API tree_black_hole * make_black_hole(void)
OCTINTERP_API void maybe_warn_variable_switch_label(tree_expression *expr)
OCTINTERP_API tree_classdef_property_list * append_classdef_property(tree_classdef_property_list *list, tree_classdef_property *elt)
OCTINTERP_API tree_classdef_attribute * make_not_classdef_attribute(tree_identifier *id)
bool m_fcn_file_from_relative_lookup
OCTINTERP_API tree_statement * make_end(const std::string &type, bool eof, const filepos &beg_pos, const filepos &end_pos)
std::string m_curr_class_name
OCTINTERP_API tree_classdef_body * append_classdef_enum_block(tree_classdef_body *body, tree_classdef_enum_block *block)
OCTINTERP_API tree_args_block_attribute_list * make_args_attribute_list(tree_identifier *attribute_name)
OCTINTERP_API tree_function_def * make_function(token *fcn_tok, tree_parameter_list *ret_list, tree_identifier *id, tree_parameter_list *param_list, tree_statement_list *body, tree_statement *end_fcn_stmt, comment_list *lc)
OCTINTERP_API tree_statement_list * make_statement_list(tree_statement *stmt)
OCTINTERP_API octave_user_function * start_function(tree_identifier *id, tree_parameter_list *param_list, tree_statement_list *body, tree_statement *end_function)
std::string m_curr_package_name
void parsing_local_functions(bool flag)
std::list< std::string > m_subfunction_names
OCTINTERP_API tree_classdef_enum_list * append_classdef_enum(tree_classdef_enum_list *list, tree_classdef_enum *elt)
OCTINTERP_API tree_classdef_methods_block * make_classdef_methods_block(token *tok_val, tree_classdef_attribute_list *a, tree_classdef_methods_list *mlist, token *end_tok, comment_list *lc, comment_list *tc)
OCTINTERP_API void bison_error(const std::string &s, int line, int column)
OCTINTERP_API tree_constant * make_constant(token *tok_val)
OCTINTERP_API void end_token_error(token *tok, token::end_tok_type expected)
OCTINTERP_API bool finish_classdef_file(tree_classdef *cls, tree_statement_list *local_fcns)
OCTINTERP_API tree_metaclass_query * make_metaclass_query(token *metaquery)
OCTINTERP_API tree_classdef_events_block * make_classdef_events_block(token *tok_val, tree_classdef_attribute_list *a, tree_classdef_events_list *elist, token *end_tok, comment_list *lc, comment_list *tc)
OCTINTERP_API void maybe_warn_missing_semi(tree_statement_list *)
OCTINTERP_API tree_classdef_body * append_classdef_properties_block(tree_classdef_body *body, tree_classdef_properties_block *block)
OCTINTERP_API tree_switch_case * make_switch_case(token *case_tok, tree_expression *expr, tree_statement_list *list, comment_list *lc)
OCTINTERP_API tree_switch_case * make_default_switch_case(token *default_tok, comment_list *lc, tree_statement_list *list)
OCTINTERP_API tree_expression * finish_matrix(tree_matrix *m, token *open_delim, token *close_delim)
OCTINTERP_API tree_statement * make_statement(T *arg)
OCTINTERP_API tree_classdef_superclass * make_classdef_superclass(token *fqident)
OCTINTERP_API tree_anon_fcn_handle * make_anon_fcn_handle(tree_parameter_list *param_list, tree_expression *expr, const filepos &at_pos)
OCTINTERP_API tree_command * make_break_command(token *break_tok)
OCTINTERP_API tree_statement_list * append_statement_list(tree_statement_list *list, char sep, tree_statement *stmt, bool warn_missing_semi)
OCTINTERP_API bool push_fcn_symtab(void)
OCTINTERP_API tree_classdef_methods_list * make_classdef_methods_list(tree_function_def *fcn_def)
OCTINTERP_API tree_expression * make_prefix_op(int op, tree_expression *op1, token *tok_val)
OCTINTERP_API tree_statement_list * append_function_body(tree_statement_list *body, tree_statement_list *list)
OCTINTERP_API tree_classdef_enum * make_classdef_enum(tree_identifier *id, tree_expression *expr, comment_list *lc)
OCTINTERP_API bool validate_param_list(tree_parameter_list *lst, tree_parameter_list::in_or_out type)
OCTINTERP_API tree_spmd_command * make_spmd_command(token *spmd_tok, tree_statement_list *body, token *end_tok, comment_list *lc, comment_list *tc)
OCTINTERP_API tree_decl_init_list * make_decl_init_list(tree_decl_elt *elt)
OCTINTERP_API tree_classdef_enum_block * make_classdef_enum_block(token *tok_val, tree_classdef_attribute_list *a, tree_classdef_enum_list *elist, token *end_tok, comment_list *lc, comment_list *tc)
OCTINTERP_API octave_user_function * start_classdef_external_method(tree_identifier *id, tree_parameter_list *pl)
OCTINTERP_API tree_decl_init_list * append_decl_init_list(tree_decl_init_list *list, tree_decl_elt *elt)
OCTINTERP_API tree_classdef_body * append_classdef_events_block(tree_classdef_body *body, tree_classdef_events_block *block)
void classdef_object(const std::shared_ptr< tree_classdef > &obj)
base_parser & operator=(const base_parser &)=delete
OCTINTERP_API tree_index_expression * make_index_expression(tree_expression *expr, tree_argument_list *args, char type)
OCTINTERP_API tree_args_block_validation_list * append_args_validation_list(tree_args_block_validation_list *list, tree_arg_validation *arg_validation)
bool m_parsing_subfunctions
OCTINTERP_API tree_classdef_superclass_list * append_classdef_superclass(tree_classdef_superclass_list *list, tree_classdef_superclass *elt)
std::string m_parse_error_msg
OCTINTERP_API tree_if_command_list * start_if_command(tree_expression *expr, tree_statement_list *list)
OCTINTERP_API tree_arg_size_spec * make_arg_size_spec(tree_argument_list *size_args)
OCTINTERP_API tree_expression * make_postfix_op(int op, tree_expression *op1, token *tok_val)
OCTINTERP_API tree_expression * finish_array_list(tree_array_list *a, token *open_delim, token *close_delim)
OCTINTERP_API tree_classdef_events_list * append_classdef_event(tree_classdef_events_list *list, tree_classdef_event *elt)
friend OCTINTERP_API octave_value parse_fcn_file(interpreter &interp, const std::string &full_file, const std::string &file, const std::string &dir_name, const std::string &dispatch_type, const std::string &package_name, bool require_file, bool force_script, bool autoload, bool relative_lookup)
OCTINTERP_API tree_if_clause * make_elseif_clause(token *elseif_tok, tree_expression *expr, tree_statement_list *list, comment_list *lc)
OCTINTERP_API tree_statement_list * set_stmt_print_flag(tree_statement_list *, char, bool)
OCTINTERP_API tree_expression * finish_cell(tree_cell *c, token *open_delim, token *close_delim)
OCTINTERP_API tree_arguments_block * make_arguments_block(token *arguments_tok, tree_args_block_attribute_list *attr_list, tree_args_block_validation_list *validation_list, token *end_tok, comment_list *lc, comment_list *tc)
OCTINTERP_API tree_classdef_methods_list * append_classdef_method(tree_classdef_methods_list *list, tree_function_def *fcn_def)
bool parsing_local_functions(void) const
OCTINTERP_API tree_classdef_body * append_classdef_methods_block(tree_classdef_body *body, tree_classdef_methods_block *block)
OCTINTERP_API tree_expression * make_boolean_op(int op, tree_expression *op1, token *tok_val, tree_expression *op2)
OCTINTERP_API tree_expression * make_colon_expression(tree_expression *base, tree_expression *limit, tree_expression *incr=nullptr)
base_lexer & get_lexer(void) const
OCTINTERP_API tree_superclass_ref * make_superclass_ref(token *superclassref)
std::shared_ptr< tree_classdef > classdef_object(void) const
OCTINTERP_API tree_classdef_enum_list * make_classdef_enum_list(tree_classdef_enum *e)
OCTINTERP_API void make_script(tree_statement_list *cmds, tree_statement *end_script)
OCTINTERP_API tree_argument_list * make_argument_list(tree_expression *expr)
OCTINTERP_API tree_args_block_validation_list * make_args_validation_list(tree_arg_validation *arg_validation)
OCTINTERP_API tree_classdef_property_list * make_classdef_property_list(tree_classdef_property *prop)
OCTINTERP_API tree_classdef_attribute * make_classdef_attribute(tree_identifier *id, tree_expression *expr=nullptr)
OCTINTERP_API tree_classdef_event * make_classdef_event(comment_list *lc, tree_identifier *id)
OCTINTERP_API tree_arg_validation_fcns * make_arg_validation_fcns(tree_argument_list *fcn_args)
std::shared_ptr< tree_statement_list > m_stmt_list
OCTINTERP_API bool end_token_ok(token *tok, token::end_tok_type expected)
OCTINTERP_API void maybe_warn_assign_as_truth_value(tree_expression *expr)
void parsing_subfunctions(bool flag)
OCTINTERP_API tree_function_def * finish_function(tree_parameter_list *ret_list, octave_user_function *fcn, comment_list *lc, int l, int c)
parser(FILE *file, interpreter &interp)
parser & operator=(const parser &)=delete
parser(FILE *file, interpreter &interp, std::string encoding)
OCTINTERP_API int run(void)
parser(const parser &)=delete
parser(const std::string &eval_string, interpreter &interp)
parser(interpreter &interp)
push_parser(const push_parser &)=delete
OCTINTERP_API int run(void)
~push_parser(void)=default
push_parser(interpreter &interp)
push_parser(interpreter &interp, input_reader *reader)
std::shared_ptr< input_reader > m_reader
interpreter & m_interpreter
push_parser & operator=(const push_parser &)=delete
OCTINTERP_API void cleanup_statement_list(tree_statement_list **lst)
OCTINTERP_API octave_value_list feval(const char *name, const octave_value_list &args=octave_value_list(), int nargout=0)
OCTINTERP_API octave_value parse_fcn_file(interpreter &interp, const std::string &full_file, const std::string &file, const std::string &dir_name, const std::string &dispatch_type, const std::string &package_name, bool require_file, bool force_script, bool autoload, bool relative_lookup)
OCTINTERP_API octave_value load_fcn_from_file(const std::string &file_name, const std::string &dir_name="", const std::string &dispatch_type="", const std::string &package_name="", const std::string &fcn_name="", bool autoload=false)
OCTINTERP_API void source_file(const std::string &file_name, const std::string &context="", bool verbose=false, bool require_file=true)
OCTINTERP_API std::string get_help_from_file(const std::string &nm, bool &symbol_found, std::string &file)
static int input(yyscan_t yyscanner)