X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fch-exp.y;h=ded20b5ca93735be3d84685ab0bbba2616b4b563;hb=db2302cb933984f307b2175d7ffaa86ccd41c2a0;hp=6788b551d4bccca185b4ea72f88d37b807f818de;hpb=8a177da6582bc176c0dd3b58583c8096674ea853;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ch-exp.y b/gdb/ch-exp.y index 6788b551d4..ded20b5ca9 100644 --- a/gdb/ch-exp.y +++ b/gdb/ch-exp.y @@ -1,5 +1,5 @@ /* YACC grammar for Chill expressions, for GDB. - Copyright (C) 1992 Free Software Foundation, Inc. + Copyright 1992, 1993, 1994 Free Software Foundation, Inc. This file is part of GDB. @@ -54,12 +54,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ %{ #include "defs.h" +#include #include #include "expression.h" #include "language.h" #include "value.h" #include "parser-defs.h" #include "ch-lang.h" +#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 */ /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), as well as gratuitiously global symbol names, so we can have multiple @@ -83,8 +87,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define yypgo chill_pgo #define yyact chill_act #define yyexca chill_exca -#define yyerrflag chill_errflag -#define yynerrs chill_nerrs +#define yyerrflag chill_errflag +#define yynerrs chill_nerrs #define yyps chill_ps #define yypv chill_pv #define yys chill_s @@ -95,8 +99,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define yy_yyv chill_yyv #define yyval chill_val #define yylloc chill_lloc -#define yyreds chill_reds /* With YYDEBUG defined */ -#define yytoks chill_toks /* With YYDEBUG defined */ +#define yyreds chill_reds /* With YYDEBUG defined */ +#define yytoks chill_toks /* With YYDEBUG defined */ #ifndef YYDEBUG #define YYDEBUG 0 /* Default to no yydebug support */ @@ -162,7 +166,6 @@ yyerror PARAMS ((char *)); %token FIXME_20 %token FIXME_21 %token FIXME_22 -%token FIXME_23 %token FIXME_24 %token FIXME_25 %token FIXME_26 @@ -228,8 +231,8 @@ yyerror PARAMS ((char *)); %token SUCC %token ABS %token CARD -%token MAX -%token MIN +%token MAX_TOKEN +%token MIN_TOKEN %token SIZE %token UPPER %token LOWER @@ -292,8 +295,7 @@ yyerror PARAMS ((char *)); %type lower_element %type upper_element %type first_element -%type structure_primitive_value -%type mode_argument +%type mode_argument %type upper_lower_argument %type length_argument %type array_mode_name @@ -311,7 +313,7 @@ yyerror PARAMS ((char *)); /* Z.200, 5.3.1 */ -start : value +start : value { } | mode_name { write_exp_elt_opcode(OP_TYPE); write_exp_elt_type($1.type); @@ -337,9 +339,6 @@ undefined_value : FIXME_01 /* Z.200, 4.2.1 */ location : access_name - { - $$ = 0; /* FIXME */ - } | primitive_value POINTER { write_exp_elt_opcode (UNOP_IND); @@ -351,6 +350,7 @@ location : access_name access_name : LOCATION_NAME { write_exp_elt_opcode (OP_VAR_VALUE); + write_exp_elt_block (NULL); write_exp_elt_sym ($1.sym); write_exp_elt_opcode (OP_VAR_VALUE); } @@ -482,6 +482,7 @@ value_name : synonym_name | GENERAL_PROCEDURE_NAME { write_exp_elt_opcode (OP_VAR_VALUE); + write_exp_elt_block (NULL); write_exp_elt_sym ($1.sym); write_exp_elt_opcode (OP_VAR_VALUE); } @@ -774,7 +775,7 @@ operand_2 : operand_3 } | operand_2 IN operand_3 { - $$ = 0; /* FIXME */ + write_exp_elt_opcode (BINOP_IN); } ; @@ -837,7 +838,7 @@ operand_5 : operand_6 { write_exp_elt_opcode (UNOP_LOGICAL_NOT); } - | parenthesised_expression CHARACTER_STRING_LITERAL + | parenthesised_expression literal /* We require the string operand to be a literal, to avoid some nasty parsing ambiguities. */ { @@ -894,22 +895,21 @@ chill_value_built_in_routine_call : { $$ = 0; /* FIXME */ } - | MAX '(' expression ')' - { - $$ = 0; /* FIXME */ - } - | MIN '(' expression ')' + | MAX_TOKEN '(' expression ')' { $$ = 0; /* FIXME */ } - | SIZE '(' location ')' + | MIN_TOKEN '(' expression ')' { $$ = 0; /* FIXME */ } + | SIZE '(' expression ')' + { write_exp_elt_opcode (UNOP_SIZEOF); } | SIZE '(' mode_argument ')' - { - $$ = 0; /* FIXME */ - } + { write_exp_elt_opcode (OP_LONG); + write_exp_elt_type (builtin_type_int); + write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3)); + write_exp_elt_opcode (OP_LONG); } | UPPER '(' upper_lower_argument ')' { $$ = 0; /* FIXME */ @@ -926,7 +926,7 @@ chill_value_built_in_routine_call : mode_argument : mode_name { - $$ = 0; /* FIXME */ + $$ = $1.type; } | array_mode_name '(' expression ')' { @@ -987,7 +987,6 @@ slice_size : FIXME_19 { $$ = 0; } lower_element : FIXME_20 { $$ = 0; } upper_element : FIXME_21 { $$ = 0; } first_element : FIXME_22 { $$ = 0; } -structure_primitive_value: FIXME_23 { $$ = 0; } boolean_expression : FIXME_26 { $$ = 0; } case_selector_list : FIXME_27 { $$ = 0; } subexpression : FIXME_28 { $$ = 0; } @@ -1044,15 +1043,20 @@ match_simple_name_string () { char *tokptr = lexptr; - if (isalpha (*tokptr)) + if (isalpha (*tokptr) || *tokptr == '_') { + char *result; do { tokptr++; - } while (isalpha (*tokptr) || isdigit (*tokptr) || (*tokptr == '_')); + } while (isalnum (*tokptr) || (*tokptr == '_')); yylval.sval.ptr = lexptr; yylval.sval.length = tokptr - lexptr; lexptr = tokptr; - return (copy_name (yylval.sval)); + result = copy_name (yylval.sval); + for (tokptr = result; *tokptr; tokptr++) + if (isupper (*tokptr)) + *tokptr = tolower(*tokptr); + return result; } return (NULL); } @@ -1075,7 +1079,9 @@ decode_integer_value (base, tokptrptr, ivalptr) while (*tokptr != '\0') { - temp = tolower (*tokptr); + temp = *tokptr; + if (isupper (temp)) + temp = tolower (temp); tokptr++; switch (temp) { @@ -1213,7 +1219,6 @@ match_float_literal () char *tokptr = lexptr; char *buf; char *copy; - char ch; double dval; extern double strtod (); @@ -1332,7 +1337,7 @@ match_float_literal () return (0); } -/* Recognize a string literal. A string literal is a nonzero sequence +/* Recognize a string literal. A string literal is a sequence of characters enclosed in matching single or double quotes, except that a single character inside single quotes is a character literal, which we reject as a string literal. To embed the terminator character inside @@ -1360,7 +1365,6 @@ match_string_literal () tempbuf[tempbufindex++] = *tokptr; } if (*tokptr == '\0' /* no terminator */ - || tempbufindex == 0 /* no string */ || (tempbufindex == 1 && *tokptr == '\'')) /* char literal */ { return (0); @@ -1403,7 +1407,7 @@ match_character_literal () char *tokptr = lexptr; int ival = 0; - if ((tolower (*tokptr) == 'c') && (*(tokptr + 1) == '\'')) + if ((*tokptr == 'c' || *tokptr == 'C') && (*(tokptr + 1) == '\'')) { /* We have a GNU chill extension form, so skip the leading "C'", decode the hex value, and then ensure that we have a trailing @@ -1534,7 +1538,9 @@ match_bitstring_literal () while (*tokptr != '\0' && *tokptr != '\'') { - digit = tolower (*tokptr); + digit = *tokptr; + if (isupper (digit)) + digit = tolower (digit); tokptr++; switch (digit) { @@ -1654,7 +1660,7 @@ match_dollar_tokens () && !isalnum (tokptr[namelength])) { yylval.lval = regno; - lexptr += namelength + 1; + lexptr += namelength; return (GDB_REGNAME); } } @@ -1727,38 +1733,28 @@ struct token int token; }; -static const struct token tokentab6[] = +static const struct token idtokentab[] = { - { "LENGTH", LENGTH } -}; - -static const struct token tokentab5[] = -{ - { "LOWER", LOWER }, - { "UPPER", UPPER }, - { "ANDIF", ANDIF } -}; - -static const struct token tokentab4[] = -{ - { "PRED", PRED }, - { "SUCC", SUCC }, - { "CARD", CARD }, - { "SIZE", SIZE }, - { "ORIF", ORIF } -}; - -static const struct token tokentab3[] = -{ - { "NUM", NUM }, - { "ABS", ABS }, - { "MAX", MAX }, - { "MIN", MIN }, - { "MOD", MOD }, - { "REM", REM }, - { "NOT", NOT }, - { "XOR", LOGXOR }, - { "AND", LOGAND } + { "length", LENGTH }, + { "lower", LOWER }, + { "upper", UPPER }, + { "andif", ANDIF }, + { "pred", PRED }, + { "succ", SUCC }, + { "card", CARD }, + { "size", SIZE }, + { "orif", ORIF }, + { "num", NUM }, + { "abs", ABS }, + { "max", MAX_TOKEN }, + { "min", MIN_TOKEN }, + { "mod", MOD }, + { "rem", REM }, + { "not", NOT }, + { "xor", LOGXOR }, + { "and", LOGAND }, + { "in", IN }, + { "or", LOGIOR } }; static const struct token tokentab2[] = @@ -1768,9 +1764,7 @@ static const struct token tokentab2[] = { "->", POINTER }, { "/=", NOTEQUAL }, { "<=", LEQ }, - { ">=", GTR }, - { "IN", IN }, - { "OR", LOGIOR } + { ">=", GTR } }; /* Read one token, getting characters through lexptr. */ @@ -1815,7 +1809,7 @@ yylex () { case '\'': case '\"': - /* First try to match a string literal, which is any nonzero + /* First try to match a string literal, which is any sequence of characters enclosed in matching single or double quotes, except that a single character inside single quotes is a character literal, so we have to catch that case also. */ @@ -1849,42 +1843,6 @@ yylex () } break; } - /* See if it is a special token of length 6. */ - for (i = 0; i < sizeof (tokentab6) / sizeof (tokentab6[0]); i++) - { - if (STREQN (lexptr, tokentab6[i].operator, 6)) - { - lexptr += 6; - return (tokentab6[i].token); - } - } - /* See if it is a special token of length 5. */ - for (i = 0; i < sizeof (tokentab5) / sizeof (tokentab5[0]); i++) - { - if (STREQN (lexptr, tokentab5[i].operator, 5)) - { - lexptr += 5; - return (tokentab5[i].token); - } - } - /* See if it is a special token of length 4. */ - for (i = 0; i < sizeof (tokentab4) / sizeof (tokentab4[0]); i++) - { - if (STREQN (lexptr, tokentab4[i].operator, 4)) - { - lexptr += 4; - return (tokentab4[i].token); - } - } - /* See if it is a special token of length 3. */ - for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++) - { - if (STREQN (lexptr, tokentab3[i].operator, 3)) - { - lexptr += 3; - return (tokentab3[i].token); - } - } /* See if it is a special token of length 2. */ for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++) { @@ -1906,19 +1864,6 @@ yylex () case '>': return (*lexptr++); } - /* Look for other special tokens. */ - if (STREQN (lexptr, "TRUE", 4)) /* FIXME: What about lowercase? */ - { - yylval.ulval = 1; - lexptr += 4; - return (BOOLEAN_LITERAL); - } - if (STREQN (lexptr, "FALSE", 5)) /* FIXME: What about lowercase? */ - { - yylval.ulval = 0; - lexptr += 5; - return (BOOLEAN_LITERAL); - } /* Look for a float literal before looking for an integer literal, so we match as much of the input stream as possible. */ token = match_float_literal (); @@ -1944,8 +1889,30 @@ yylex () we can't classify what sort of name it is. */ simplename = match_simple_name_string (); + if (simplename != NULL) { + /* See if it is a reserved identifier. */ + for (i = 0; i < sizeof (idtokentab) / sizeof (idtokentab[0]); i++) + { + if (STREQ (simplename, idtokentab[i].operator)) + { + return (idtokentab[i].token); + } + } + + /* Look for other special tokens. */ + if (STREQ (simplename, "true")) + { + yylval.ulval = 1; + return (BOOLEAN_LITERAL); + } + if (STREQ (simplename, "false")) + { + yylval.ulval = 0; + return (BOOLEAN_LITERAL); + } + sym = lookup_symbol (simplename, expression_context_block, VAR_NAMESPACE, (int *) NULL, (struct symtab **) NULL); @@ -1967,8 +1934,11 @@ yylex () case LOC_ARG: case LOC_REF_ARG: case LOC_REGPARM: + case LOC_REGPARM_ADDR: case LOC_LOCAL: case LOC_LOCAL_ARG: + case LOC_BASEREG: + case LOC_BASEREG_ARG: if (innermost_block == NULL || contained_in (block_found, innermost_block)) { @@ -2021,7 +1991,7 @@ void yyerror (msg) char *msg; /* unused */ { - printf ("Parsing: %s\n", lexptr); + printf_unfiltered ("Parsing: %s\n", lexptr); if (yychar < 256) { error ("Invalid syntax in expression near character '%c'.", yychar);