X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ff-exp.y;h=b9004264eec69d25a9447bab97ebfaa9467ea77d;hb=54c2a1e69352852e0cd74552e8560321e29b787e;hp=6270fc74a6ac7af65b5e79155d61eba498015354;hpb=22d7f91e32bda141f2d866c3e7dd967141dcf696;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/f-exp.y b/gdb/f-exp.y index 6270fc74a6..b9004264ee 100644 --- a/gdb/f-exp.y +++ b/gdb/f-exp.y @@ -1,6 +1,7 @@ /* YACC parser for Fortran expressions, for GDB. - Copyright 1986, 1989, 1990, 1991, 1993, 1994 - Free Software Foundation, Inc. + Copyright 1986, 1989, 1990, 1991, 1993, 1994, 1995, 1996, 2000, 2001 + Free Software Foundation, Inc. + Contributed by Motorola. Adapted from the C parser by Farooq Butt (fmbutt@engage.sps.mot.com). @@ -18,7 +19,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* This was blantantly ripped off the C expression parser, please be aware of that as you look at its basic structure -FMB */ @@ -43,7 +44,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ %{ #include "defs.h" -#include +#include "gdb_string.h" #include "expression.h" #include "value.h" #include "parser-defs.h" @@ -52,6 +53,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "bfd.h" /* Required by objfiles.h. */ #include "symfile.h" /* Required by objfiles.h. */ #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */ +#include /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), as well as gratuitiously global symbol names, so we can have multiple @@ -89,16 +91,33 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define yylloc f_lloc #define yyreds f_reds /* With YYDEBUG defined */ #define yytoks f_toks /* With YYDEBUG defined */ +#define yyname f_name /* With YYDEBUG defined */ +#define yyrule f_rule /* With YYDEBUG defined */ +#define yylhs f_yylhs +#define yylen f_yylen +#define yydefred f_yydefred +#define yydgoto f_yydgoto +#define yysindex f_yysindex +#define yyrindex f_yyrindex +#define yygindex f_yygindex +#define yytable f_yytable +#define yycheck f_yycheck #ifndef YYDEBUG -#define YYDEBUG 1 /* Default to no yydebug support */ +#define YYDEBUG 1 /* Default to yydebug support */ #endif -int yyparse PARAMS ((void)); +#define YYFPRINTF parser_fprintf + +int yyparse (void); + +static int yylex (void); -static int yylex PARAMS ((void)); +void yyerror (char *); -void yyerror PARAMS ((char *)); +static void growbuf_by_size (int); + +static int match_string_literal (void); %} @@ -113,7 +132,7 @@ void yyerror PARAMS ((char *)); LONGEST val; struct type *type; } typed_val; - double dval; + DOUBLEST dval; struct symbol *sym; struct type *tval; struct stoken sval; @@ -130,7 +149,7 @@ void yyerror PARAMS ((char *)); %{ /* YYSTYPE gets defined by %union */ -static int parse_number PARAMS ((char *, int, int, YYSTYPE *)); +static int parse_number (char *, int, int, YYSTYPE *); %} %type exp type_exp start variable @@ -177,9 +196,9 @@ static int parse_number PARAMS ((char *, int, int, YYSTYPE *)); %token LOGICAL_KEYWORD REAL_KEYWORD REAL_S8_KEYWORD REAL_S16_KEYWORD %token COMPLEX_S8_KEYWORD COMPLEX_S16_KEYWORD COMPLEX_S32_KEYWORD %token BOOL_AND BOOL_OR BOOL_NOT -%token LAST REGNAME CHARACTER +%token CHARACTER -%token VARIABLE +%token VARIABLE %token ASSIGN_MODIFY @@ -279,7 +298,7 @@ complexnum: exp ',' exp ; exp : '(' complexnum ')' - { write_exp_elt_opcode(OP_F77_LITERAL_COMPLEX); } + { write_exp_elt_opcode(OP_COMPLEX); } ; exp : '(' type ')' exp %prec UNARY @@ -403,27 +422,13 @@ exp : FLOAT exp : variable ; -exp : LAST - { write_exp_elt_opcode (OP_LAST); - write_exp_elt_longcst ((LONGEST) $1); - write_exp_elt_opcode (OP_LAST); } - ; - -exp : REGNAME - { write_exp_elt_opcode (OP_REGISTER); - write_exp_elt_longcst ((LONGEST) $1); - write_exp_elt_opcode (OP_REGISTER); } - ; - exp : VARIABLE - { write_exp_elt_opcode (OP_INTERNALVAR); - write_exp_elt_intern ($1); - write_exp_elt_opcode (OP_INTERNALVAR); } ; exp : SIZEOF '(' type ')' %prec UNARY { write_exp_elt_opcode (OP_LONG); write_exp_elt_type (builtin_type_f_integer); + CHECK_TYPEDEF ($3); write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3)); write_exp_elt_opcode (OP_LONG); } ; @@ -436,32 +441,11 @@ exp : BOOLEAN_LITERAL ; exp : STRING_LITERAL - { /* In F77, we encounter string literals - basically in only one place: - when we are setting up manual parameter - lists to functions we call by hand or - when setting string vars to manual values. - These are character*N type variables. - They are treated specially behind the - scenes. Remember that the literal strings's - OPs are being emitted in reverse order, thus - we first have the elements and then - the array descriptor itself. */ - char *sp = $1.ptr; int count = $1.length; - - while (count-- > 0) - { - write_exp_elt_opcode (OP_LONG); - write_exp_elt_type (builtin_type_f_character); - write_exp_elt_longcst ((LONGEST)(*sp++)); - write_exp_elt_opcode (OP_LONG); - } - write_exp_elt_opcode (OP_ARRAY); - write_exp_elt_longcst ((LONGEST) 1); - write_exp_elt_longcst ((LONGEST) ($1.length)); - write_exp_elt_opcode (OP_ARRAY); + { + write_exp_elt_opcode (OP_STRING); + write_exp_string ($1); + write_exp_elt_opcode (OP_STRING); } - ; variable: name_not_typename @@ -477,6 +461,10 @@ variable: name_not_typename innermost_block = block_found; } write_exp_elt_opcode (OP_VAR_VALUE); + /* We want to use the selected frame, not + another more inner frame which happens to + be in the same block. */ + write_exp_elt_block (NULL); write_exp_elt_sym (sym); write_exp_elt_opcode (OP_VAR_VALUE); break; @@ -486,7 +474,8 @@ variable: name_not_typename struct minimal_symbol *msymbol; register char *arg = copy_name ($1.stoken); - msymbol = lookup_minimal_symbol (arg, NULL); + msymbol = + lookup_minimal_symbol (arg, NULL, NULL); if (msymbol != NULL) { write_exp_msymbol (msymbol, @@ -655,12 +644,11 @@ parse_number (p, len, parsed_float, putithere) { register LONGEST n = 0; register LONGEST prevn = 0; - register int i; register int c; register int base = input_radix; int unsigned_p = 0; int long_p = 0; - unsigned LONGEST high_bit; + ULONGEST high_bit; struct type *signed_type; struct type *unsigned_type; @@ -670,7 +658,7 @@ parse_number (p, len, parsed_float, putithere) /* [dD] is not understood as an exponent by atof, change it to 'e'. */ char *tmp, *tmp2; - tmp = strsave (p); + tmp = xstrdup (p); for (tmp2 = tmp; *tmp2; ++tmp2) if (*tmp2 == 'd' || *tmp2 == 'D') *tmp2 = 'e'; @@ -713,26 +701,26 @@ parse_number (p, len, parsed_float, putithere) while (len-- > 0) { c = *p++; - if (c >= 'A' && c <= 'Z') - c += 'a' - 'A'; - if (c != 'l' && c != 'u') - n *= base; - if (c >= '0' && c <= '9') - n += i = c - '0'; + if (isupper (c)) + c = tolower (c); + if (len == 0 && c == 'l') + long_p = 1; + else if (len == 0 && c == 'u') + unsigned_p = 1; else { - if (base > 10 && c >= 'a' && c <= 'f') - n += i = c - 'a' + 10; - else if (len == 0 && c == 'l') - long_p = 1; - else if (len == 0 && c == 'u') - unsigned_p = 1; + int i; + if (c >= '0' && c <= '9') + i = c - '0'; + else if (c >= 'a' && c <= 'f') + i = c - 'a' + 10; else return ERROR; /* Char not a digit */ + if (i >= base) + return ERROR; /* Invalid digit in this base */ + n *= base; + n += i; } - if (i >= base) - return ERROR; /* Invalid digit in this base */ - /* Portably test for overflow (only works for nonzero values, so make a second check for zero). */ if ((prevn >= n) && n != 0) @@ -762,13 +750,13 @@ parse_number (p, len, parsed_float, putithere) && ((n >> 2) >> (TARGET_INT_BIT-2))) /* Avoid shift warning */ || long_p) { - high_bit = ((unsigned LONGEST)1) << (TARGET_LONG_BIT-1); + high_bit = ((ULONGEST)1) << (TARGET_LONG_BIT-1); unsigned_type = builtin_type_unsigned_long; signed_type = builtin_type_long; } else { - high_bit = ((unsigned LONGEST)1) << (TARGET_INT_BIT-1); + high_bit = ((ULONGEST)1) << (TARGET_INT_BIT-1); unsigned_type = builtin_type_unsigned_int; signed_type = builtin_type_int; } @@ -940,7 +928,9 @@ yylex () char *tokstart; retry: - + + prev_lexptr = lexptr; + tokstart = lexptr; /* First of all, let us make sure we are not dealing with the @@ -1046,8 +1036,8 @@ yylex () got_dot = got_d = 1; else if (!hex && !got_dot && *p == '.') got_dot = 1; - else if ((got_e && (p[-1] == 'e' || p[-1] == 'E')) - || (got_d && (p[-1] == 'd' || p[-1] == 'D')) + else if (((got_e && (p[-1] == 'e' || p[-1] == 'E')) + || (got_d && (p[-1] == 'd' || p[-1] == 'D'))) && (*p == '-' || *p == '+')) /* This is the sign of the exponent, not the end of the number. */ @@ -1117,61 +1107,6 @@ yylex () lexptr += namelen; - /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1) - and $$digits (equivalent to $<-digits> if you could type that). - Make token type LAST, and put the number (the digits) in yylval. */ - - tryname: - if (*tokstart == '$') - { - register int negate = 0; - - c = 1; - /* Double dollar means negate the number and add -1 as well. - Thus $$ alone means -1. */ - if (namelen >= 2 && tokstart[1] == '$') - { - negate = 1; - c = 2; - } - if (c == namelen) - { - /* Just dollars (one or two) */ - yylval.lval = - negate; - return LAST; - } - /* Is the rest of the token digits? */ - for (; c < namelen; c++) - if (!(tokstart[c] >= '0' && tokstart[c] <= '9')) - break; - if (c == namelen) - { - yylval.lval = atoi (tokstart + 1 + negate); - if (negate) - yylval.lval = - yylval.lval; - return LAST; - } - } - - /* Handle tokens that refer to machine registers: - $ followed by a register name. */ - - if (*tokstart == '$') { - for (c = 0; c < NUM_REGS; c++) - if (namelen - 1 == strlen (reg_names[c]) - && STREQN (tokstart + 1, reg_names[c], namelen - 1)) - { - yylval.lval = c; - return REGNAME; - } - for (c = 0; c < num_std_regs; c++) - if (namelen - 1 == strlen (std_regs[c].name) - && STREQN (tokstart + 1, std_regs[c].name, namelen - 1)) - { - yylval.lval = std_regs[c].regnum; - return REGNAME; - } - } /* Catch specific keywords. */ for (i = 0; f77_keywords[i].operator != NULL; i++) @@ -1186,11 +1121,9 @@ yylex () yylval.sval.ptr = tokstart; yylval.sval.length = namelen; - /* Any other names starting in $ are debugger internal variables. */ - if (*tokstart == '$') { - yylval.ivar = lookup_internalvar (copy_name (yylval.sval) + 1); + write_dollar_variable (yylval.sval); return VARIABLE; } @@ -1244,5 +1177,8 @@ void yyerror (msg) char *msg; { + if (prev_lexptr) + lexptr = prev_lexptr; + error ("A %s in expression, near `%s'.", (msg ? msg : "error"), lexptr); }