struct block;
struct language_defn;
struct internalvar;
+class innermost_block_tracker;
extern int parser_debug;
size_t expout_ptr;
};
+/* This is used for expression completion. */
+
+struct expr_completion_state
+{
+ /* The index of the last struct expression directly before a '.' or
+ '->'. This is set when parsing and is only used when completing a
+ field name. It is -1 if no dereference operation was found. */
+ int expout_last_struct = -1;
+
+ /* If we are completing a tagged type name, this will be nonzero. */
+ enum type_code expout_tag_completion_type = TYPE_CODE_UNDEF;
+
+ /* The token for tagged type name completion. */
+ gdb::unique_xmalloc_ptr<char> expout_completion_name;
+};
+
/* An instance of this type is instantiated during expression parsing,
and passed to the appropriate parser. It holds both inputs to the
parser, and result. */
const struct block *context_block,
CORE_ADDR context_pc,
int comma,
- const char *input)
+ const char *input,
+ int completion,
+ innermost_block_tracker *tracker)
: expr_builder (lang, gdbarch),
expression_context_block (context_block),
expression_context_pc (context_pc),
comma_terminates (comma),
- lexptr (input)
+ lexptr (input),
+ parse_completion (completion),
+ block_tracker (tracker)
{
}
DISABLE_COPY_AND_ASSIGN (parser_state);
+ /* Begin counting arguments for a function call,
+ saving the data about any containing call. */
+
+ void start_arglist ()
+ {
+ m_funcall_chain.push_back (arglist_len);
+ arglist_len = 0;
+ }
+
+ /* Return the number of arguments in a function call just terminated,
+ and restore the data for the containing function call. */
+
+ int end_arglist ()
+ {
+ int val = arglist_len;
+ arglist_len = m_funcall_chain.back ();
+ m_funcall_chain.pop_back ();
+ return val;
+ }
+
+ /* Mark the current index as the starting location of a structure
+ expression. This is used when completing on field names. */
+
+ void mark_struct_expression ();
+
+ /* Indicate that the current parser invocation is completing a tag.
+ TAG is the type code of the tag, and PTR and LENGTH represent the
+ start of the tag name. */
+
+ void mark_completion_tag (enum type_code tag, const char *ptr, int length);
+
+
/* If this is nonzero, this block is used as the lexical context for
symbol names. */
/* After a token has been recognized, this variable points to it.
Currently used only for error reporting. */
const char *prev_lexptr = nullptr;
+
+ /* Number of arguments seen so far in innermost function call. */
+
+ int arglist_len = 0;
+
+ /* True if parsing an expression to attempt completion. */
+ int parse_completion;
+
+ /* Completion state is updated here. */
+ expr_completion_state m_completion_state;
+
+ /* The innermost block tracker. */
+ innermost_block_tracker *block_tracker;
+
+private:
+
+ /* Data structure for saving values of arglist_len for function calls whose
+ arguments contain other function calls. */
+
+ std::vector<int> m_funcall_chain;
};
/* When parsing expressions we track the innermost block that was
class innermost_block_tracker
{
public:
- innermost_block_tracker ()
- : m_types (INNERMOST_BLOCK_FOR_SYMBOLS),
+ innermost_block_tracker (innermost_block_tracker_types types
+ = INNERMOST_BLOCK_FOR_SYMBOLS)
+ : m_types (types),
m_innermost_block (NULL)
{ /* Nothing. */ }
- /* Reset the currently stored innermost block. Usually called before
- parsing a new expression. As the most common case is that we only
- want to gather the innermost block for symbols in an expression, this
- becomes the default block tracker type. */
- void reset (innermost_block_tracker_types t = INNERMOST_BLOCK_FOR_SYMBOLS)
- {
- m_types = t;
- m_innermost_block = NULL;
- }
-
/* Update the stored innermost block if the new block B is more inner
than the currently stored block, or if no block is stored yet. The
type T tells us whether the block B was for a symbol or for a
const struct block *m_innermost_block;
};
-/* The innermost context required by the stack and register variables
- we've encountered so far. This is cleared by the expression
- parsing functions before parsing an expression, and can queried
- once the parse is complete. */
-extern innermost_block_tracker innermost_block;
-
-/* Number of arguments seen so far in innermost function call. */
-extern int arglist_len;
-
/* A string token, either a char-string or bit-string. Char-strings are
used, for example, for the names of symbols. */
int theclass;
};
-/* For parsing of complicated types.
- An array should be preceded in the list by the size of the array. */
-enum type_pieces
- {
- tp_end = -1,
- tp_pointer,
- tp_reference,
- tp_rvalue_reference,
- tp_array,
- tp_function,
- tp_function_with_arguments,
- tp_const,
- tp_volatile,
- tp_space_identifier,
- tp_type_stack,
- tp_kind
- };
-/* The stack can contain either an enum type_pieces or an int. */
-union type_stack_elt
- {
- enum type_pieces piece;
- int int_val;
- struct type_stack *stack_val;
- std::vector<struct type *> *typelist_val;
- };
-
-/* The type stack is an instance of this structure. */
-
-struct type_stack
-{
- /* Elements on the stack. */
- std::vector<union type_stack_elt> elements;
-};
-
/* Reverse an expression from suffix form (in which it is constructed)
to prefix form (in which we can conveniently print or execute it).
- Ordinarily this always returns -1. However, if EXPOUT_LAST_STRUCT
+ Ordinarily this always returns -1. However, if LAST_STRUCT
is not -1 (i.e., we are trying to complete a field name), it will
return the index of the subexpression which is the left-hand-side
- of the struct operation at EXPOUT_LAST_STRUCT. */
+ of the struct operation at LAST_STRUCT. */
-extern int prefixify_expression (struct expression *expr);
+extern int prefixify_expression (struct expression *expr,
+ int last_struct = -1);
extern void write_exp_elt_opcode (struct expr_builder *, enum exp_opcode);
extern void write_dollar_variable (struct parser_state *, struct stoken str);
-extern void mark_struct_expression (struct expr_builder *);
-
extern const char *find_template_name_end (const char *);
-extern void start_arglist (void);
-
-extern int end_arglist (void);
-
-extern char *copy_name (struct stoken);
-
-extern void insert_type (enum type_pieces);
-
-extern void push_type (enum type_pieces);
-
-extern void push_type_int (int);
-
-extern void insert_type_address_space (struct expr_builder *, char *);
-
-extern enum type_pieces pop_type (void);
-
-extern int pop_type_int (void);
-
-extern struct type_stack *get_type_stack (void);
-
-extern struct type_stack *append_type_stack (struct type_stack *to,
- struct type_stack *from);
-
-extern void push_type_stack (struct type_stack *stack);
-
-extern void push_typelist (std::vector<struct type *> *typelist);
+extern std::string copy_name (struct stoken);
extern int dump_subexp (struct expression *, struct ui_file *, int);
extern const char *op_name_standard (enum exp_opcode);
-extern struct type *follow_types (struct type *);
-
-extern type_instance_flags follow_type_instance_flags ();
-
-extern void null_post_parser (expression_up *, int);
+extern void null_post_parser (expression_up *, int, int,
+ innermost_block_tracker *);
extern bool parse_float (const char *p, int len,
const struct type *type, gdb_byte *data);
extern int exp_uses_objfile (struct expression *exp, struct objfile *objfile);
-extern void mark_completion_tag (enum type_code, const char *ptr,
- int length);
-
#endif /* PARSER_DEFS_H */