/* YACC parser for C expressions, for GDB.
- Copyright (C) 1986-2014 Free Software Foundation, Inc.
+ Copyright (C) 1986-2015 Free Software Foundation, Inc.
This file is part of GDB.
with include files (<malloc.h> and <stdlib.h> for example) just became
too messy, particularly when such includes can be inserted at random
times by the parser generator. */
-
+
%{
#include "defs.h"
struct type_stack *type_stack;
- struct objc_class_str class;
+ struct objc_class_str theclass;
}
%{
%token <ssym> UNKNOWN_CPP_NAME
%token <voidval> COMPLETE
%token <tsym> TYPENAME
-%token <class> CLASSNAME /* ObjC Class name */
+%token <theclass> CLASSNAME /* ObjC Class name */
%type <sval> name
%type <svec> string_exp
%type <ssym> name_not_typename
-%type <tsym> typename
+%type <tsym> type_name
/* This is like a '[' token, but is only generated when parsing
Objective C. This lets us reuse the same parser without
E.g. "c" when input_radix==16. Depending on the parse, it will be
turned into a name or into a number. */
-%token <ssym> NAME_OR_INT
+%token <ssym> NAME_OR_INT
%token OPERATOR
%token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON
%token TEMPLATE
%token ERROR
%token NEW DELETE
-%type <sval> operator
+%type <sval> oper
%token REINTERPRET_CAST DYNAMIC_CAST STATIC_CAST CONST_CAST
%token ENTRY
%token TYPEOF
%left '*' '/' '%'
%right UNARY INCREMENT DECREMENT
%right ARROW ARROW_STAR '.' DOT_STAR '[' OBJC_LBRAC '('
-%token <ssym> BLOCKNAME
+%token <ssym> BLOCKNAME
%token <bval> FILENAME
%type <bval> block
%left COLONCOLON
exp : OBJC_LBRAC TYPENAME
{
- CORE_ADDR class;
+ CORE_ADDR theclass;
- class = lookup_objc_class (parse_gdbarch (pstate),
+ theclass = lookup_objc_class (parse_gdbarch (pstate),
copy_name ($2.stoken));
- if (class == 0)
+ if (theclass == 0)
error (_("%s is not an ObjC Class"),
copy_name ($2.stoken));
write_exp_elt_opcode (pstate, OP_LONG);
write_exp_elt_type (pstate,
parse_type (pstate)->builtin_int);
- write_exp_elt_longcst (pstate, (LONGEST) class);
+ write_exp_elt_longcst (pstate, (LONGEST) theclass);
write_exp_elt_opcode (pstate, OP_LONG);
start_msglist();
}
write_exp_elt_opcode (pstate, OP_LONG);
write_exp_elt_type (pstate,
parse_type (pstate)->builtin_int);
- write_exp_elt_longcst (pstate, (LONGEST) $2.class);
+ write_exp_elt_longcst (pstate, (LONGEST) $2.theclass);
write_exp_elt_opcode (pstate, OP_LONG);
start_msglist();
}
{ add_msglist(0, 0); }
;
-exp : exp '('
+exp : exp '('
/* This is to save the value of arglist_len
being accumulated by an outer function call. */
{ start_arglist (); }
exp : exp '?' exp ':' exp %prec '?'
{ write_exp_elt_opcode (pstate, TERNOP_COND); }
;
-
+
exp : exp '=' exp
{ write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
;
(parse_language (pstate),
parse_gdbarch (pstate),
"int"));
- CHECK_TYPEDEF (type);
+ type = check_typedef (type);
/* $5.3.3/2 of the C++ Standard (n3290 draft)
says of sizeof: "When applied to a reference
;
/* C++. */
-exp : TRUEKEYWORD
+exp : TRUEKEYWORD
{ write_exp_elt_opcode (pstate, OP_LONG);
write_exp_elt_type (pstate,
parse_type (pstate)->builtin_bool);
write_exp_elt_opcode (pstate, OP_LONG); }
;
-exp : FALSEKEYWORD
+exp : FALSEKEYWORD
{ write_exp_elt_opcode (pstate, OP_LONG);
write_exp_elt_type (pstate,
parse_type (pstate)->builtin_bool);
qualified_name: TYPENAME COLONCOLON name
{
struct type *type = $1.type;
- CHECK_TYPEDEF (type);
+ type = check_typedef (type);
if (!type_aggregate_p (type))
error (_("`%s' is not defined as an aggregate type."),
TYPE_SAFE_NAME (type));
struct stoken tmp_token;
char *buf;
- CHECK_TYPEDEF (type);
+ type = check_typedef (type);
if (!type_aggregate_p (type))
error (_("`%s' is not defined as an aggregate type."),
TYPE_SAFE_NAME (type));
if (symbol_read_needs_frame (sym))
{
if (innermost_block == 0
- || contained_in (block_found,
+ || contained_in (block_found,
innermost_block))
innermost_block = block_found;
}
;
const_or_volatile_or_space_identifier_noopt: cv_with_space_id
- | const_or_volatile_noopt
+ | const_or_volatile_noopt
;
-const_or_volatile_or_space_identifier:
+const_or_volatile_or_space_identifier:
const_or_volatile_or_space_identifier_noopt
|
;
ptr_operator '*'
{ insert_type (tp_pointer); }
const_or_volatile_or_space_identifier
- | '*'
+ | '*'
{ insert_type (tp_pointer); }
const_or_volatile_or_space_identifier
| '&'
abs_decl: ptr_operator_ts direct_abs_decl
{ $$ = append_type_stack ($2, $1); }
- | ptr_operator_ts
+ | ptr_operator_ts
| direct_abs_decl
;
{ $$ = lookup_unsigned_typename (parse_language (pstate),
parse_gdbarch (pstate),
"short"); }
- | SHORT UNSIGNED
+ | SHORT UNSIGNED
{ $$ = lookup_unsigned_typename (parse_language (pstate),
parse_gdbarch (pstate),
"short"); }
$2.length);
$$ = NULL;
}
- | UNSIGNED typename
+ | UNSIGNED type_name
{ $$ = lookup_unsigned_typename (parse_language (pstate),
parse_gdbarch (pstate),
TYPE_NAME($2.type)); }
{ $$ = lookup_unsigned_typename (parse_language (pstate),
parse_gdbarch (pstate),
"int"); }
- | SIGNED_KEYWORD typename
+ | SIGNED_KEYWORD type_name
{ $$ = lookup_signed_typename (parse_language (pstate),
parse_gdbarch (pstate),
TYPE_NAME($2.type)); }
"int"); }
/* It appears that this rule for templates is never
reduced; template recognition happens by lookahead
- in the token processing code in yylex. */
+ in the token processing code in yylex. */
| TEMPLATE name '<' type '>'
{ $$ = lookup_template_type(copy_name($2), $4,
expression_context_block);
}
- | const_or_volatile_or_space_identifier_noopt typebase
+ | const_or_volatile_or_space_identifier_noopt typebase
{ $$ = follow_types ($2); }
- | typebase const_or_volatile_or_space_identifier_noopt
+ | typebase const_or_volatile_or_space_identifier_noopt
{ $$ = follow_types ($1); }
;
-typename: TYPENAME
+type_name: TYPENAME
| INT_KEYWORD
{
$$.stoken.ptr = "int";
| VOLATILE_KEYWORD CONST_KEYWORD
;
-const_or_volatile_noopt: const_and_volatile
+const_or_volatile_noopt: const_and_volatile
{ insert_type (tp_const);
- insert_type (tp_volatile);
+ insert_type (tp_volatile);
}
| CONST_KEYWORD
{ insert_type (tp_const); }
{ insert_type (tp_volatile); }
;
-operator: OPERATOR NEW
+oper: OPERATOR NEW
{ $$ = operator_stoken (" new"); }
| OPERATOR DELETE
{ $$ = operator_stoken (" delete"); }
| TYPENAME { $$ = $1.stoken; }
| NAME_OR_INT { $$ = $1.stoken; }
| UNKNOWN_CPP_NAME { $$ = $1.stoken; }
- | operator { $$ = $1; }
+ | oper { $$ = $1; }
;
name_not_typename : NAME
context where only a name could occur, this might be useful.
| NAME_OR_INT
*/
- | operator
+ | oper
{
struct field_of_this_result is_a_field_of_this;
}
/* Returns a stoken of the operator name given by OP (which does not
- include the string "operator"). */
+ include the string "operator"). */
+
static struct stoken
operator_stoken (const char *op)
{
else
{
int shift;
- if (sizeof (ULONGEST) * HOST_CHAR_BIT
+ if (sizeof (ULONGEST) * HOST_CHAR_BIT
< gdbarch_long_long_bit (parse_gdbarch (par_state)))
/* A long long does not fit in a LONGEST. */
shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
/* If the high bit of the worked out type is set then this number
has to be unsigned. */
- if (unsigned_p || (n & high_bit))
+ if (unsigned_p || (n & high_bit))
{
putithere->typed_val_int.type = unsigned_type;
}
- else
+ else
{
putithere->typed_val_int.type = signed_type;
}
stored in VALUE. This returns a token value, either STRING or
CHAR, depending on what was parsed. *HOST_CHARS is set to the
number of host characters in the literal. */
+
static int
parse_string_or_char (const char *tokptr, const char **outptr,
struct typed_stoken *value, int *host_chars)
struct token
{
- char *operator;
+ char *oper;
int token;
enum exp_opcode opcode;
enum token_flags flags;
lexptr = copy;
}
-
static int
scanning_macro_expansion (void)
{
return macro_original_text != 0;
}
-
-static void
+static void
finished_macro_expansion (void)
{
/* There'd better be something to pop back to. */
macro_original_text = 0;
}
-
static void
scan_macro_cleanup (void *dummy)
{
tokstart = lexptr;
/* See if it is a special token of length 3. */
for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
- if (strncmp (tokstart, tokentab3[i].operator, 3) == 0)
+ if (strncmp (tokstart, tokentab3[i].oper, 3) == 0)
{
if ((tokentab3[i].flags & FLAG_CXX) != 0
&& parse_language (par_state)->la_language != language_cplus)
/* See if it is a special token of length 2. */
for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
- if (strncmp (tokstart, tokentab2[i].operator, 2) == 0)
+ if (strncmp (tokstart, tokentab2[i].oper, 2) == 0)
{
if ((tokentab2[i].flags & FLAG_CXX) != 0
&& parse_language (par_state)->la_language != language_cplus)
that we look ahead only when the '<' adjoins non-whitespace
characters; for comparison expressions, e.g. "a < b > c",
there must be spaces before the '<', etc. */
-
const char *p = find_template_name_end (tokstart + namelen);
if (p)
/* Catch specific keywords. */
copy = copy_name (yylval.sval);
for (i = 0; i < sizeof ident_tokens / sizeof ident_tokens[0]; i++)
- if (strcmp (copy, ident_tokens[i].operator) == 0)
+ if (strcmp (copy, ident_tokens[i].oper) == 0)
{
if ((ident_tokens[i].flags & FLAG_CXX) != 0
&& parse_language (par_state)->la_language != language_cplus)
in which lookups start; this can be NULL to mean the global scope.
IS_QUOTED_NAME is non-zero if the name token was originally quoted
in single quotes. */
+
static int
classify_name (struct parser_state *par_state, const struct block *block,
int is_quoted_name)
we can refer to it unconditionally below. */
memset (&is_a_field_of_this, 0, sizeof (is_a_field_of_this));
- sym = lookup_symbol (copy, block, VAR_DOMAIN,
+ sym = lookup_symbol (copy, block, VAR_DOMAIN,
parse_language (par_state)->la_name_of_this
? &is_a_field_of_this : NULL);
return TYPENAME;
}
- yylval.tsym.type
- = language_lookup_primitive_type_by_name (parse_language (par_state),
- parse_gdbarch (par_state),
- copy);
- if (yylval.tsym.type != NULL)
- return TYPENAME;
-
/* See if it's an ObjC classname. */
if (parse_language (par_state)->la_language == language_objc && !sym)
{
CORE_ADDR Class = lookup_objc_class (parse_gdbarch (par_state), copy);
if (Class)
{
- yylval.class.class = Class;
+ yylval.theclass.theclass = Class;
sym = lookup_struct_typedef (copy, expression_context_block, 1);
if (sym)
- yylval.class.type = SYMBOL_TYPE (sym);
+ yylval.theclass.type = SYMBOL_TYPE (sym);
return CLASSNAME;
}
}
return ERROR;
copy = copy_name (yylval.ssym.stoken);
- yylval.ssym.sym = cp_lookup_nested_symbol (type, copy, block);
+ /* N.B. We assume the symbol can only be in VAR_DOMAIN. */
+ yylval.ssym.sym = cp_lookup_nested_symbol (type, copy, block, VAR_DOMAIN);
/* If no symbol was found, search for a matching base class named
COPY. This will allow users to enter qualified names of class members
relative to the `this' pointer. */
if (yylval.ssym.sym == NULL)
{
- struct type *base_type = find_type_baseclass_by_name (type, copy);
+ struct type *base_type = cp_find_type_baseclass_by_name (type, copy);
if (base_type != NULL)
{
named COPY when we really wanted a base class of the same name.
Double-check this case by looking for a base class. */
{
- struct type *base_type = find_type_baseclass_by_name (type, copy);
+ struct type *base_type = cp_find_type_baseclass_by_name (type, copy);
if (base_type != NULL)
{
return ERROR;
case LOC_TYPEDEF:
- yylval.tsym.type = SYMBOL_TYPE (yylval.ssym.sym);;
+ yylval.tsym.type = SYMBOL_TYPE (yylval.ssym.sym);
return TYPENAME;
default:
problem in our parsing approach, where the parser could not
distinguish between qualified names and qualified types at the
right point.
-
+
This approach is still not ideal, because it mishandles template
types. See the comment in lex_one_token for an example. However,
this is still an improvement over the earlier approach, and will
suffice until we move to better parsing technology. */
+
static int
yylex (void)
{
current.token = classification;
last_was_coloncolon = 0;
-
+
if (classification == NAME)
break;