URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [tags/] [VER_5_3/] [gdb-5.3/] [gdb/] [ch-exp.c] - Rev 1182
Go to most recent revision | Compare with Previous | Blame | View Log
// OBSOLETE /* Parser for GNU CHILL (CCITT High-Level Language) -*- C -*- // OBSOLETE Copyright 1992, 1993, 1995, 1996, 1997, 1999, 2000, 2001 // OBSOLETE Free Software Foundation, Inc. // OBSOLETE // OBSOLETE This file is part of GDB. // OBSOLETE // OBSOLETE This program is free software; you can redistribute it and/or modify // OBSOLETE it under the terms of the GNU General Public License as published by // OBSOLETE the Free Software Foundation; either version 2 of the License, or // OBSOLETE (at your option) any later version. // OBSOLETE // OBSOLETE This program is distributed in the hope that it will be useful, // OBSOLETE but WITHOUT ANY WARRANTY; without even the implied warranty of // OBSOLETE MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // OBSOLETE GNU General Public License for more details. // OBSOLETE // OBSOLETE You should have received a copy of the GNU General Public License // OBSOLETE along with this program; if not, write to the Free Software // OBSOLETE Foundation, Inc., 59 Temple Place - Suite 330, // OBSOLETE Boston, MA 02111-1307, USA. */ // OBSOLETE // OBSOLETE /* Parse a Chill expression from text in a string, // OBSOLETE and return the result as a struct expression pointer. // OBSOLETE That structure contains arithmetic operations in reverse polish, // OBSOLETE with constants represented by operations that are followed by special data. // OBSOLETE See expression.h for the details of the format. // OBSOLETE What is important here is that it can be built up sequentially // OBSOLETE during the process of parsing; the lower levels of the tree always // OBSOLETE come first in the result. // OBSOLETE // OBSOLETE Note that the language accepted by this parser is more liberal // OBSOLETE than the one accepted by an actual Chill compiler. For example, the // OBSOLETE language rule that a simple name string can not be one of the reserved // OBSOLETE simple name strings is not enforced (e.g "case" is not treated as a // OBSOLETE reserved name). Another example is that Chill is a strongly typed // OBSOLETE language, and certain expressions that violate the type constraints // OBSOLETE may still be evaluated if gdb can do so in a meaningful manner, while // OBSOLETE such expressions would be rejected by the compiler. The reason for // OBSOLETE this more liberal behavior is the philosophy that the debugger // OBSOLETE is intended to be a tool that is used by the programmer when things // OBSOLETE go wrong, and as such, it should provide as few artificial barriers // OBSOLETE to it's use as possible. If it can do something meaningful, even // OBSOLETE something that violates language contraints that are enforced by the // OBSOLETE compiler, it should do so without complaint. // OBSOLETE // OBSOLETE */ // OBSOLETE // OBSOLETE #include "defs.h" // OBSOLETE #include "gdb_string.h" // OBSOLETE #include <ctype.h> // OBSOLETE #include "expression.h" // OBSOLETE #include "language.h" // OBSOLETE #include "value.h" // OBSOLETE #include "parser-defs.h" // OBSOLETE #include "ch-lang.h" // OBSOLETE #include "bfd.h" /* Required by objfiles.h. */ // OBSOLETE #include "symfile.h" /* Required by objfiles.h. */ // OBSOLETE #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */ // OBSOLETE // OBSOLETE #ifdef __GNUC__ // OBSOLETE #define INLINE __inline__ // OBSOLETE #endif // OBSOLETE // OBSOLETE typedef union // OBSOLETE // OBSOLETE { // OBSOLETE LONGEST lval; // OBSOLETE ULONGEST ulval; // OBSOLETE struct // OBSOLETE { // OBSOLETE LONGEST val; // OBSOLETE struct type *type; // OBSOLETE } // OBSOLETE typed_val; // OBSOLETE double dval; // OBSOLETE struct symbol *sym; // OBSOLETE struct type *tval; // OBSOLETE struct stoken sval; // OBSOLETE struct ttype tsym; // OBSOLETE struct symtoken ssym; // OBSOLETE } // OBSOLETE YYSTYPE; // OBSOLETE // OBSOLETE enum ch_terminal // OBSOLETE { // OBSOLETE END_TOKEN = 0, // OBSOLETE /* '\001' ... '\xff' come first. */ // OBSOLETE OPEN_PAREN = '(', // OBSOLETE TOKEN_NOT_READ = 999, // OBSOLETE INTEGER_LITERAL, // OBSOLETE BOOLEAN_LITERAL, // OBSOLETE CHARACTER_LITERAL, // OBSOLETE FLOAT_LITERAL, // OBSOLETE GENERAL_PROCEDURE_NAME, // OBSOLETE LOCATION_NAME, // OBSOLETE EMPTINESS_LITERAL, // OBSOLETE CHARACTER_STRING_LITERAL, // OBSOLETE BIT_STRING_LITERAL, // OBSOLETE TYPENAME, // OBSOLETE DOT_FIELD_NAME, /* '.' followed by <field name> */ // OBSOLETE CASE, // OBSOLETE OF, // OBSOLETE ESAC, // OBSOLETE LOGIOR, // OBSOLETE ORIF, // OBSOLETE LOGXOR, // OBSOLETE LOGAND, // OBSOLETE ANDIF, // OBSOLETE NOTEQUAL, // OBSOLETE GEQ, // OBSOLETE LEQ, // OBSOLETE IN, // OBSOLETE SLASH_SLASH, // OBSOLETE MOD, // OBSOLETE REM, // OBSOLETE NOT, // OBSOLETE POINTER, // OBSOLETE RECEIVE, // OBSOLETE UP, // OBSOLETE IF, // OBSOLETE THEN, // OBSOLETE ELSE, // OBSOLETE FI, // OBSOLETE ELSIF, // OBSOLETE ILLEGAL_TOKEN, // OBSOLETE NUM, // OBSOLETE PRED, // OBSOLETE SUCC, // OBSOLETE ABS, // OBSOLETE CARD, // OBSOLETE MAX_TOKEN, // OBSOLETE MIN_TOKEN, // OBSOLETE ADDR_TOKEN, // OBSOLETE SIZE, // OBSOLETE UPPER, // OBSOLETE LOWER, // OBSOLETE LENGTH, // OBSOLETE ARRAY, // OBSOLETE GDB_VARIABLE, // OBSOLETE GDB_ASSIGNMENT // OBSOLETE }; // OBSOLETE // OBSOLETE /* Forward declarations. */ // OBSOLETE // OBSOLETE static void write_lower_upper_value (enum exp_opcode, struct type *); // OBSOLETE static enum ch_terminal match_bitstring_literal (void); // OBSOLETE static enum ch_terminal match_integer_literal (void); // OBSOLETE static enum ch_terminal match_character_literal (void); // OBSOLETE static enum ch_terminal match_string_literal (void); // OBSOLETE static enum ch_terminal match_float_literal (void); // OBSOLETE static int decode_integer_literal (LONGEST *, char **); // OBSOLETE static int decode_integer_value (int, char **, LONGEST *); // OBSOLETE static char *match_simple_name_string (void); // OBSOLETE static void growbuf_by_size (int); // OBSOLETE static void parse_case_label (void); // OBSOLETE static void parse_untyped_expr (void); // OBSOLETE static void parse_if_expression (void); // OBSOLETE static void parse_if_expression_body (void); // OBSOLETE static void parse_else_alternative (void); // OBSOLETE static void parse_then_alternative (void); // OBSOLETE static void parse_expr (void); // OBSOLETE static void parse_operand0 (void); // OBSOLETE static void parse_operand1 (void); // OBSOLETE static void parse_operand2 (void); // OBSOLETE static void parse_operand3 (void); // OBSOLETE static void parse_operand4 (void); // OBSOLETE static void parse_operand5 (void); // OBSOLETE static void parse_operand6 (void); // OBSOLETE static void parse_primval (void); // OBSOLETE static void parse_tuple (struct type *); // OBSOLETE static void parse_opt_element_list (struct type *); // OBSOLETE static void parse_tuple_element (struct type *); // OBSOLETE static void parse_named_record_element (void); // OBSOLETE static void parse_call (void); // OBSOLETE static struct type *parse_mode_or_normal_call (void); // OBSOLETE #if 0 // OBSOLETE static struct type *parse_mode_call (void); // OBSOLETE #endif // OBSOLETE static void parse_unary_call (void); // OBSOLETE static int parse_opt_untyped_expr (void); // OBSOLETE static int expect (enum ch_terminal, char *); // OBSOLETE static enum ch_terminal ch_lex (void); // OBSOLETE INLINE static enum ch_terminal PEEK_TOKEN (void); // OBSOLETE static enum ch_terminal peek_token_ (int); // OBSOLETE static void forward_token_ (void); // OBSOLETE static void require (enum ch_terminal); // OBSOLETE static int check_token (enum ch_terminal); // OBSOLETE // OBSOLETE #define MAX_LOOK_AHEAD 2 // OBSOLETE static enum ch_terminal terminal_buffer[MAX_LOOK_AHEAD + 1] = // OBSOLETE { // OBSOLETE TOKEN_NOT_READ, TOKEN_NOT_READ, TOKEN_NOT_READ}; // OBSOLETE static YYSTYPE yylval; // OBSOLETE static YYSTYPE val_buffer[MAX_LOOK_AHEAD + 1]; // OBSOLETE // OBSOLETE /*int current_token, lookahead_token; */ // OBSOLETE // OBSOLETE INLINE static enum ch_terminal // OBSOLETE PEEK_TOKEN (void) // OBSOLETE { // OBSOLETE if (terminal_buffer[0] == TOKEN_NOT_READ) // OBSOLETE { // OBSOLETE terminal_buffer[0] = ch_lex (); // OBSOLETE val_buffer[0] = yylval; // OBSOLETE } // OBSOLETE return terminal_buffer[0]; // OBSOLETE } // OBSOLETE #define PEEK_LVAL() val_buffer[0] // OBSOLETE #define PEEK_TOKEN1() peek_token_(1) // OBSOLETE #define PEEK_TOKEN2() peek_token_(2) // OBSOLETE static enum ch_terminal // OBSOLETE peek_token_ (int i) // OBSOLETE { // OBSOLETE if (i > MAX_LOOK_AHEAD) // OBSOLETE internal_error (__FILE__, __LINE__, // OBSOLETE "too much lookahead"); // OBSOLETE if (terminal_buffer[i] == TOKEN_NOT_READ) // OBSOLETE { // OBSOLETE terminal_buffer[i] = ch_lex (); // OBSOLETE val_buffer[i] = yylval; // OBSOLETE } // OBSOLETE return terminal_buffer[i]; // OBSOLETE } // OBSOLETE // OBSOLETE #if 0 // OBSOLETE // OBSOLETE static void // OBSOLETE pushback_token (enum ch_terminal code, YYSTYPE node) // OBSOLETE { // OBSOLETE int i; // OBSOLETE if (terminal_buffer[MAX_LOOK_AHEAD] != TOKEN_NOT_READ) // OBSOLETE internal_error (__FILE__, __LINE__, // OBSOLETE "cannot pushback token"); // OBSOLETE for (i = MAX_LOOK_AHEAD; i > 0; i--) // OBSOLETE { // OBSOLETE terminal_buffer[i] = terminal_buffer[i - 1]; // OBSOLETE val_buffer[i] = val_buffer[i - 1]; // OBSOLETE } // OBSOLETE terminal_buffer[0] = code; // OBSOLETE val_buffer[0] = node; // OBSOLETE } // OBSOLETE // OBSOLETE #endif // OBSOLETE // OBSOLETE static void // OBSOLETE forward_token_ (void) // OBSOLETE { // OBSOLETE int i; // OBSOLETE for (i = 0; i < MAX_LOOK_AHEAD; i++) // OBSOLETE { // OBSOLETE terminal_buffer[i] = terminal_buffer[i + 1]; // OBSOLETE val_buffer[i] = val_buffer[i + 1]; // OBSOLETE } // OBSOLETE terminal_buffer[MAX_LOOK_AHEAD] = TOKEN_NOT_READ; // OBSOLETE } // OBSOLETE #define FORWARD_TOKEN() forward_token_() // OBSOLETE // OBSOLETE /* Skip the next token. // OBSOLETE if it isn't TOKEN, the parser is broken. */ // OBSOLETE // OBSOLETE static void // OBSOLETE require (enum ch_terminal token) // OBSOLETE { // OBSOLETE if (PEEK_TOKEN () != token) // OBSOLETE { // OBSOLETE internal_error (__FILE__, __LINE__, // OBSOLETE "expected token %d", (int) token); // OBSOLETE } // OBSOLETE FORWARD_TOKEN (); // OBSOLETE } // OBSOLETE // OBSOLETE static int // OBSOLETE check_token (enum ch_terminal token) // OBSOLETE { // OBSOLETE if (PEEK_TOKEN () != token) // OBSOLETE return 0; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE return 1; // OBSOLETE } // OBSOLETE // OBSOLETE /* return 0 if expected token was not found, // OBSOLETE else return 1. // OBSOLETE */ // OBSOLETE static int // OBSOLETE expect (enum ch_terminal token, char *message) // OBSOLETE { // OBSOLETE if (PEEK_TOKEN () != token) // OBSOLETE { // OBSOLETE if (message) // OBSOLETE error (message); // OBSOLETE else if (token < 256) // OBSOLETE error ("syntax error - expected a '%c' here \"%s\"", token, lexptr); // OBSOLETE else // OBSOLETE error ("syntax error"); // OBSOLETE return 0; // OBSOLETE } // OBSOLETE else // OBSOLETE FORWARD_TOKEN (); // OBSOLETE return 1; // OBSOLETE } // OBSOLETE // OBSOLETE #if 0 // OBSOLETE /* Parse a name string. If ALLOW_ALL is 1, ALL is allowed as a postfix. */ // OBSOLETE // OBSOLETE static tree // OBSOLETE parse_opt_name_string (int allow_all) // OBSOLETE { // OBSOLETE int token = PEEK_TOKEN (); // OBSOLETE tree name; // OBSOLETE if (token != NAME) // OBSOLETE { // OBSOLETE if (token == ALL && allow_all) // OBSOLETE { // OBSOLETE FORWARD_TOKEN (); // OBSOLETE return ALL_POSTFIX; // OBSOLETE } // OBSOLETE return NULL_TREE; // OBSOLETE } // OBSOLETE name = PEEK_LVAL (); // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE FORWARD_TOKEN (); // OBSOLETE token = PEEK_TOKEN (); // OBSOLETE if (token != '!') // OBSOLETE return name; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE token = PEEK_TOKEN (); // OBSOLETE if (token == ALL && allow_all) // OBSOLETE return get_identifier3 (IDENTIFIER_POINTER (name), "!", "*"); // OBSOLETE if (token != NAME) // OBSOLETE { // OBSOLETE if (pass == 1) // OBSOLETE error ("'%s!' is not followed by an identifier", // OBSOLETE IDENTIFIER_POINTER (name)); // OBSOLETE return name; // OBSOLETE } // OBSOLETE name = get_identifier3 (IDENTIFIER_POINTER (name), // OBSOLETE "!", IDENTIFIER_POINTER (PEEK_LVAL ())); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static tree // OBSOLETE parse_simple_name_string (void) // OBSOLETE { // OBSOLETE int token = PEEK_TOKEN (); // OBSOLETE tree name; // OBSOLETE if (token != NAME) // OBSOLETE { // OBSOLETE error ("expected a name here"); // OBSOLETE return error_mark_node; // OBSOLETE } // OBSOLETE name = PEEK_LVAL (); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE return name; // OBSOLETE } // OBSOLETE // OBSOLETE static tree // OBSOLETE parse_name_string (void) // OBSOLETE { // OBSOLETE tree name = parse_opt_name_string (0); // OBSOLETE if (name) // OBSOLETE return name; // OBSOLETE if (pass == 1) // OBSOLETE error ("expected a name string here"); // OBSOLETE return error_mark_node; // OBSOLETE } // OBSOLETE // OBSOLETE /* Matches: <name_string> // OBSOLETE Returns if pass 1: the identifier. // OBSOLETE Returns if pass 2: a decl or value for identifier. */ // OBSOLETE // OBSOLETE static tree // OBSOLETE parse_name (void) // OBSOLETE { // OBSOLETE tree name = parse_name_string (); // OBSOLETE if (pass == 1 || ignoring) // OBSOLETE return name; // OBSOLETE else // OBSOLETE { // OBSOLETE tree decl = lookup_name (name); // OBSOLETE if (decl == NULL_TREE) // OBSOLETE { // OBSOLETE error ("`%s' undeclared", IDENTIFIER_POINTER (name)); // OBSOLETE return error_mark_node; // OBSOLETE } // OBSOLETE else if (TREE_CODE (TREE_TYPE (decl)) == ERROR_MARK) // OBSOLETE return error_mark_node; // OBSOLETE else if (TREE_CODE (decl) == CONST_DECL) // OBSOLETE return DECL_INITIAL (decl); // OBSOLETE else if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE) // OBSOLETE return convert_from_reference (decl); // OBSOLETE else // OBSOLETE return decl; // OBSOLETE } // OBSOLETE } // OBSOLETE #endif // OBSOLETE // OBSOLETE #if 0 // OBSOLETE static void // OBSOLETE pushback_paren_expr (tree expr) // OBSOLETE { // OBSOLETE if (pass == 1 && !ignoring) // OBSOLETE expr = build1 (PAREN_EXPR, NULL_TREE, expr); // OBSOLETE pushback_token (EXPR, expr); // OBSOLETE } // OBSOLETE #endif // OBSOLETE // OBSOLETE /* Matches: <case label> */ // OBSOLETE // OBSOLETE static void // OBSOLETE parse_case_label (void) // OBSOLETE { // OBSOLETE if (check_token (ELSE)) // OBSOLETE error ("ELSE in tuples labels not implemented"); // OBSOLETE /* Does not handle the case of a mode name. FIXME */ // OBSOLETE parse_expr (); // OBSOLETE if (check_token (':')) // OBSOLETE { // OBSOLETE parse_expr (); // OBSOLETE write_exp_elt_opcode (BINOP_RANGE); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static int // OBSOLETE parse_opt_untyped_expr (void) // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case ',': // OBSOLETE case ':': // OBSOLETE case ')': // OBSOLETE return 0; // OBSOLETE default: // OBSOLETE parse_untyped_expr (); // OBSOLETE return 1; // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_unary_call (void) // OBSOLETE { // OBSOLETE FORWARD_TOKEN (); // OBSOLETE expect ('(', NULL); // OBSOLETE parse_expr (); // OBSOLETE expect (')', NULL); // OBSOLETE } // OBSOLETE // OBSOLETE /* Parse NAME '(' MODENAME ')'. */ // OBSOLETE // OBSOLETE #if 0 // OBSOLETE // OBSOLETE static struct type * // OBSOLETE parse_mode_call (void) // OBSOLETE { // OBSOLETE struct type *type; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE expect ('(', NULL); // OBSOLETE if (PEEK_TOKEN () != TYPENAME) // OBSOLETE error ("expect MODENAME here `%s'", lexptr); // OBSOLETE type = PEEK_LVAL ().tsym.type; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE expect (')', NULL); // OBSOLETE return type; // OBSOLETE } // OBSOLETE // OBSOLETE #endif // OBSOLETE // OBSOLETE static struct type * // OBSOLETE parse_mode_or_normal_call (void) // OBSOLETE { // OBSOLETE struct type *type; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE expect ('(', NULL); // OBSOLETE if (PEEK_TOKEN () == TYPENAME) // OBSOLETE { // OBSOLETE type = PEEK_LVAL ().tsym.type; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE parse_expr (); // OBSOLETE type = NULL; // OBSOLETE } // OBSOLETE expect (')', NULL); // OBSOLETE return type; // OBSOLETE } // OBSOLETE // OBSOLETE /* Parse something that looks like a function call. // OBSOLETE Assume we have parsed the function, and are at the '('. */ // OBSOLETE // OBSOLETE static void // OBSOLETE parse_call (void) // OBSOLETE { // OBSOLETE int arg_count; // OBSOLETE require ('('); // OBSOLETE /* This is to save the value of arglist_len // OBSOLETE being accumulated for each dimension. */ // OBSOLETE start_arglist (); // OBSOLETE if (parse_opt_untyped_expr ()) // OBSOLETE { // OBSOLETE int tok = PEEK_TOKEN (); // OBSOLETE arglist_len = 1; // OBSOLETE if (tok == UP || tok == ':') // OBSOLETE { // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_expr (); // OBSOLETE expect (')', "expected ')' to terminate slice"); // OBSOLETE end_arglist (); // OBSOLETE write_exp_elt_opcode (tok == UP ? TERNOP_SLICE_COUNT // OBSOLETE : TERNOP_SLICE); // OBSOLETE return; // OBSOLETE } // OBSOLETE while (check_token (',')) // OBSOLETE { // OBSOLETE parse_untyped_expr (); // OBSOLETE arglist_len++; // OBSOLETE } // OBSOLETE } // OBSOLETE else // OBSOLETE arglist_len = 0; // OBSOLETE expect (')', NULL); // OBSOLETE arg_count = end_arglist (); // OBSOLETE write_exp_elt_opcode (MULTI_SUBSCRIPT); // OBSOLETE write_exp_elt_longcst (arg_count); // OBSOLETE write_exp_elt_opcode (MULTI_SUBSCRIPT); // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_named_record_element (void) // OBSOLETE { // OBSOLETE struct stoken label; // OBSOLETE char buf[256]; // OBSOLETE // OBSOLETE label = PEEK_LVAL ().sval; // OBSOLETE sprintf (buf, "expected a field name here `%s'", lexptr); // OBSOLETE expect (DOT_FIELD_NAME, buf); // OBSOLETE if (check_token (',')) // OBSOLETE parse_named_record_element (); // OBSOLETE else if (check_token (':')) // OBSOLETE parse_expr (); // OBSOLETE else // OBSOLETE error ("syntax error near `%s' in named record tuple element", lexptr); // OBSOLETE write_exp_elt_opcode (OP_LABELED); // OBSOLETE write_exp_string (label); // OBSOLETE write_exp_elt_opcode (OP_LABELED); // OBSOLETE } // OBSOLETE // OBSOLETE /* Returns one or more TREE_LIST nodes, in reverse order. */ // OBSOLETE // OBSOLETE static void // OBSOLETE parse_tuple_element (struct type *type) // OBSOLETE { // OBSOLETE if (PEEK_TOKEN () == DOT_FIELD_NAME) // OBSOLETE { // OBSOLETE /* Parse a labelled structure tuple. */ // OBSOLETE parse_named_record_element (); // OBSOLETE return; // OBSOLETE } // OBSOLETE // OBSOLETE if (check_token ('(')) // OBSOLETE { // OBSOLETE if (check_token ('*')) // OBSOLETE { // OBSOLETE expect (')', "missing ')' after '*' case label list"); // OBSOLETE if (type) // OBSOLETE { // OBSOLETE if (TYPE_CODE (type) == TYPE_CODE_ARRAY) // OBSOLETE { // OBSOLETE /* do this as a range from low to high */ // OBSOLETE struct type *range_type = TYPE_FIELD_TYPE (type, 0); // OBSOLETE LONGEST low_bound, high_bound; // OBSOLETE if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0) // OBSOLETE error ("cannot determine bounds for (*)"); // OBSOLETE /* lower bound */ // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE write_exp_elt_type (range_type); // OBSOLETE write_exp_elt_longcst (low_bound); // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE /* upper bound */ // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE write_exp_elt_type (range_type); // OBSOLETE write_exp_elt_longcst (high_bound); // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE write_exp_elt_opcode (BINOP_RANGE); // OBSOLETE } // OBSOLETE else // OBSOLETE error ("(*) in invalid context"); // OBSOLETE } // OBSOLETE else // OBSOLETE error ("(*) only possible with modename in front of tuple (mode[..])"); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE parse_case_label (); // OBSOLETE while (check_token (',')) // OBSOLETE { // OBSOLETE parse_case_label (); // OBSOLETE write_exp_elt_opcode (BINOP_COMMA); // OBSOLETE } // OBSOLETE expect (')', NULL); // OBSOLETE } // OBSOLETE } // OBSOLETE else // OBSOLETE parse_untyped_expr (); // OBSOLETE if (check_token (':')) // OBSOLETE { // OBSOLETE /* A powerset range or a labeled Array. */ // OBSOLETE parse_untyped_expr (); // OBSOLETE write_exp_elt_opcode (BINOP_RANGE); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Matches: a COMMA-separated list of tuple elements. // OBSOLETE Returns a list (of TREE_LIST nodes). */ // OBSOLETE static void // OBSOLETE parse_opt_element_list (struct type *type) // OBSOLETE { // OBSOLETE arglist_len = 0; // OBSOLETE if (PEEK_TOKEN () == ']') // OBSOLETE return; // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE parse_tuple_element (type); // OBSOLETE arglist_len++; // OBSOLETE if (PEEK_TOKEN () == ']') // OBSOLETE break; // OBSOLETE if (!check_token (',')) // OBSOLETE error ("bad syntax in tuple"); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Parses: '[' elements ']' // OBSOLETE If modename is non-NULL it prefixed the tuple. */ // OBSOLETE // OBSOLETE static void // OBSOLETE parse_tuple (struct type *mode) // OBSOLETE { // OBSOLETE struct type *type; // OBSOLETE if (mode) // OBSOLETE type = check_typedef (mode); // OBSOLETE else // OBSOLETE type = 0; // OBSOLETE require ('['); // OBSOLETE start_arglist (); // OBSOLETE parse_opt_element_list (type); // OBSOLETE expect (']', "missing ']' after tuple"); // OBSOLETE write_exp_elt_opcode (OP_ARRAY); // OBSOLETE write_exp_elt_longcst ((LONGEST) 0); // OBSOLETE write_exp_elt_longcst ((LONGEST) end_arglist () - 1); // OBSOLETE write_exp_elt_opcode (OP_ARRAY); // OBSOLETE if (type) // OBSOLETE { // OBSOLETE if (TYPE_CODE (type) != TYPE_CODE_ARRAY // OBSOLETE && TYPE_CODE (type) != TYPE_CODE_STRUCT // OBSOLETE && TYPE_CODE (type) != TYPE_CODE_SET) // OBSOLETE error ("invalid tuple mode"); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE write_exp_elt_type (mode); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_primval (void) // OBSOLETE { // OBSOLETE struct type *type; // OBSOLETE enum exp_opcode op; // OBSOLETE char *op_name; // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case INTEGER_LITERAL: // OBSOLETE case CHARACTER_LITERAL: // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE write_exp_elt_type (PEEK_LVAL ().typed_val.type); // OBSOLETE write_exp_elt_longcst (PEEK_LVAL ().typed_val.val); // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case BOOLEAN_LITERAL: // OBSOLETE write_exp_elt_opcode (OP_BOOL); // OBSOLETE write_exp_elt_longcst ((LONGEST) PEEK_LVAL ().ulval); // OBSOLETE write_exp_elt_opcode (OP_BOOL); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case FLOAT_LITERAL: // OBSOLETE write_exp_elt_opcode (OP_DOUBLE); // OBSOLETE write_exp_elt_type (builtin_type_double); // OBSOLETE write_exp_elt_dblcst (PEEK_LVAL ().dval); // OBSOLETE write_exp_elt_opcode (OP_DOUBLE); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case EMPTINESS_LITERAL: // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE write_exp_elt_type (lookup_pointer_type (builtin_type_void)); // OBSOLETE write_exp_elt_longcst (0); // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case CHARACTER_STRING_LITERAL: // OBSOLETE write_exp_elt_opcode (OP_STRING); // OBSOLETE write_exp_string (PEEK_LVAL ().sval); // OBSOLETE write_exp_elt_opcode (OP_STRING); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case BIT_STRING_LITERAL: // OBSOLETE write_exp_elt_opcode (OP_BITSTRING); // OBSOLETE write_exp_bitstring (PEEK_LVAL ().sval); // OBSOLETE write_exp_elt_opcode (OP_BITSTRING); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case ARRAY: // OBSOLETE FORWARD_TOKEN (); // OBSOLETE /* This is pseudo-Chill, similar to C's '(TYPE[])EXPR' // OBSOLETE which casts to an artificial array. */ // OBSOLETE expect ('(', NULL); // OBSOLETE expect (')', NULL); // OBSOLETE if (PEEK_TOKEN () != TYPENAME) // OBSOLETE error ("missing MODENAME after ARRAY()"); // OBSOLETE type = PEEK_LVAL ().tsym.type; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE expect ('(', NULL); // OBSOLETE parse_expr (); // OBSOLETE expect (')', "missing right parenthesis"); // OBSOLETE type = create_array_type ((struct type *) NULL, type, // OBSOLETE create_range_type ((struct type *) NULL, // OBSOLETE builtin_type_int, 0, 0)); // OBSOLETE TYPE_ARRAY_UPPER_BOUND_TYPE (type) = BOUND_CANNOT_BE_DETERMINED; // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE write_exp_elt_type (type); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE break; // OBSOLETE #if 0 // OBSOLETE case CONST: // OBSOLETE case EXPR: // OBSOLETE val = PEEK_LVAL (); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE #endif // OBSOLETE case '(': // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_expr (); // OBSOLETE expect (')', "missing right parenthesis"); // OBSOLETE break; // OBSOLETE case '[': // OBSOLETE parse_tuple (NULL); // OBSOLETE break; // OBSOLETE case GENERAL_PROCEDURE_NAME: // OBSOLETE case LOCATION_NAME: // OBSOLETE write_exp_elt_opcode (OP_VAR_VALUE); // OBSOLETE write_exp_elt_block (NULL); // OBSOLETE write_exp_elt_sym (PEEK_LVAL ().ssym.sym); // OBSOLETE write_exp_elt_opcode (OP_VAR_VALUE); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case GDB_VARIABLE: /* gdb specific */ // OBSOLETE FORWARD_TOKEN (); // OBSOLETE break; // OBSOLETE case NUM: // OBSOLETE parse_unary_call (); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE write_exp_elt_type (builtin_type_int); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE break; // OBSOLETE case CARD: // OBSOLETE parse_unary_call (); // OBSOLETE write_exp_elt_opcode (UNOP_CARD); // OBSOLETE break; // OBSOLETE case MAX_TOKEN: // OBSOLETE parse_unary_call (); // OBSOLETE write_exp_elt_opcode (UNOP_CHMAX); // OBSOLETE break; // OBSOLETE case MIN_TOKEN: // OBSOLETE parse_unary_call (); // OBSOLETE write_exp_elt_opcode (UNOP_CHMIN); // OBSOLETE break; // OBSOLETE case PRED: // OBSOLETE op_name = "PRED"; // OBSOLETE goto unimplemented_unary_builtin; // OBSOLETE case SUCC: // OBSOLETE op_name = "SUCC"; // OBSOLETE goto unimplemented_unary_builtin; // OBSOLETE case ABS: // OBSOLETE op_name = "ABS"; // OBSOLETE goto unimplemented_unary_builtin; // OBSOLETE unimplemented_unary_builtin: // OBSOLETE parse_unary_call (); // OBSOLETE error ("not implemented: %s builtin function", op_name); // OBSOLETE break; // OBSOLETE case ADDR_TOKEN: // OBSOLETE parse_unary_call (); // OBSOLETE write_exp_elt_opcode (UNOP_ADDR); // OBSOLETE break; // OBSOLETE case SIZE: // OBSOLETE type = parse_mode_or_normal_call (); // OBSOLETE if (type) // OBSOLETE { // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE write_exp_elt_type (builtin_type_int); // OBSOLETE CHECK_TYPEDEF (type); // OBSOLETE write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (type)); // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE } // OBSOLETE else // OBSOLETE write_exp_elt_opcode (UNOP_SIZEOF); // OBSOLETE break; // OBSOLETE case LOWER: // OBSOLETE op = UNOP_LOWER; // OBSOLETE goto lower_upper; // OBSOLETE case UPPER: // OBSOLETE op = UNOP_UPPER; // OBSOLETE goto lower_upper; // OBSOLETE lower_upper: // OBSOLETE type = parse_mode_or_normal_call (); // OBSOLETE write_lower_upper_value (op, type); // OBSOLETE break; // OBSOLETE case LENGTH: // OBSOLETE parse_unary_call (); // OBSOLETE write_exp_elt_opcode (UNOP_LENGTH); // OBSOLETE break; // OBSOLETE case TYPENAME: // OBSOLETE type = PEEK_LVAL ().tsym.type; // OBSOLETE FORWARD_TOKEN (); // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case '[': // OBSOLETE parse_tuple (type); // OBSOLETE break; // OBSOLETE case '(': // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_expr (); // OBSOLETE expect (')', "missing right parenthesis"); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE write_exp_elt_type (type); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE break; // OBSOLETE default: // OBSOLETE error ("typename in invalid context"); // OBSOLETE } // OBSOLETE break; // OBSOLETE // OBSOLETE default: // OBSOLETE error ("invalid expression syntax at `%s'", lexptr); // OBSOLETE } // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case DOT_FIELD_NAME: // OBSOLETE write_exp_elt_opcode (STRUCTOP_STRUCT); // OBSOLETE write_exp_string (PEEK_LVAL ().sval); // OBSOLETE write_exp_elt_opcode (STRUCTOP_STRUCT); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE continue; // OBSOLETE case POINTER: // OBSOLETE FORWARD_TOKEN (); // OBSOLETE if (PEEK_TOKEN () == TYPENAME) // OBSOLETE { // OBSOLETE type = PEEK_LVAL ().tsym.type; // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE write_exp_elt_type (lookup_pointer_type (type)); // OBSOLETE write_exp_elt_opcode (UNOP_CAST); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE } // OBSOLETE write_exp_elt_opcode (UNOP_IND); // OBSOLETE continue; // OBSOLETE case OPEN_PAREN: // OBSOLETE parse_call (); // OBSOLETE continue; // OBSOLETE case CHARACTER_STRING_LITERAL: // OBSOLETE case CHARACTER_LITERAL: // OBSOLETE case BIT_STRING_LITERAL: // OBSOLETE /* Handle string repetition. (See comment in parse_operand5.) */ // OBSOLETE parse_primval (); // OBSOLETE write_exp_elt_opcode (MULTI_SUBSCRIPT); // OBSOLETE write_exp_elt_longcst (1); // OBSOLETE write_exp_elt_opcode (MULTI_SUBSCRIPT); // OBSOLETE continue; // OBSOLETE case END_TOKEN: // OBSOLETE case TOKEN_NOT_READ: // OBSOLETE case INTEGER_LITERAL: // OBSOLETE case BOOLEAN_LITERAL: // OBSOLETE case FLOAT_LITERAL: // OBSOLETE case GENERAL_PROCEDURE_NAME: // OBSOLETE case LOCATION_NAME: // OBSOLETE case EMPTINESS_LITERAL: // OBSOLETE case TYPENAME: // OBSOLETE case CASE: // OBSOLETE case OF: // OBSOLETE case ESAC: // OBSOLETE case LOGIOR: // OBSOLETE case ORIF: // OBSOLETE case LOGXOR: // OBSOLETE case LOGAND: // OBSOLETE case ANDIF: // OBSOLETE case NOTEQUAL: // OBSOLETE case GEQ: // OBSOLETE case LEQ: // OBSOLETE case IN: // OBSOLETE case SLASH_SLASH: // OBSOLETE case MOD: // OBSOLETE case REM: // OBSOLETE case NOT: // OBSOLETE case RECEIVE: // OBSOLETE case UP: // OBSOLETE case IF: // OBSOLETE case THEN: // OBSOLETE case ELSE: // OBSOLETE case FI: // OBSOLETE case ELSIF: // OBSOLETE case ILLEGAL_TOKEN: // OBSOLETE case NUM: // OBSOLETE case PRED: // OBSOLETE case SUCC: // OBSOLETE case ABS: // OBSOLETE case CARD: // OBSOLETE case MAX_TOKEN: // OBSOLETE case MIN_TOKEN: // OBSOLETE case ADDR_TOKEN: // OBSOLETE case SIZE: // OBSOLETE case UPPER: // OBSOLETE case LOWER: // OBSOLETE case LENGTH: // OBSOLETE case ARRAY: // OBSOLETE case GDB_VARIABLE: // OBSOLETE case GDB_ASSIGNMENT: // OBSOLETE break; // OBSOLETE } // OBSOLETE break; // OBSOLETE } // OBSOLETE return; // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_operand6 (void) // OBSOLETE { // OBSOLETE if (check_token (RECEIVE)) // OBSOLETE { // OBSOLETE parse_primval (); // OBSOLETE error ("not implemented: RECEIVE expression"); // OBSOLETE } // OBSOLETE else if (check_token (POINTER)) // OBSOLETE { // OBSOLETE parse_primval (); // OBSOLETE write_exp_elt_opcode (UNOP_ADDR); // OBSOLETE } // OBSOLETE else // OBSOLETE parse_primval (); // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_operand5 (void) // OBSOLETE { // OBSOLETE enum exp_opcode op; // OBSOLETE /* We are supposed to be looking for a <string repetition operator>, // OBSOLETE but in general we can't distinguish that from a parenthesized // OBSOLETE expression. This is especially difficult if we allow the // OBSOLETE string operand to be a constant expression (as requested by // OBSOLETE some users), and not just a string literal. // OBSOLETE Consider: LPRN expr RPRN LPRN expr RPRN // OBSOLETE Is that a function call or string repetition? // OBSOLETE Instead, we handle string repetition in parse_primval, // OBSOLETE and build_generalized_call. */ // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case NOT: // OBSOLETE op = UNOP_LOGICAL_NOT; // OBSOLETE break; // OBSOLETE case '-': // OBSOLETE op = UNOP_NEG; // OBSOLETE break; // OBSOLETE default: // OBSOLETE op = OP_NULL; // OBSOLETE } // OBSOLETE if (op != OP_NULL) // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_operand6 (); // OBSOLETE if (op != OP_NULL) // OBSOLETE write_exp_elt_opcode (op); // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_operand4 (void) // OBSOLETE { // OBSOLETE enum exp_opcode op; // OBSOLETE parse_operand5 (); // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case '*': // OBSOLETE op = BINOP_MUL; // OBSOLETE break; // OBSOLETE case '/': // OBSOLETE op = BINOP_DIV; // OBSOLETE break; // OBSOLETE case MOD: // OBSOLETE op = BINOP_MOD; // OBSOLETE break; // OBSOLETE case REM: // OBSOLETE op = BINOP_REM; // OBSOLETE break; // OBSOLETE default: // OBSOLETE return; // OBSOLETE } // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_operand5 (); // OBSOLETE write_exp_elt_opcode (op); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_operand3 (void) // OBSOLETE { // OBSOLETE enum exp_opcode op; // OBSOLETE parse_operand4 (); // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case '+': // OBSOLETE op = BINOP_ADD; // OBSOLETE break; // OBSOLETE case '-': // OBSOLETE op = BINOP_SUB; // OBSOLETE break; // OBSOLETE case SLASH_SLASH: // OBSOLETE op = BINOP_CONCAT; // OBSOLETE break; // OBSOLETE default: // OBSOLETE return; // OBSOLETE } // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_operand4 (); // OBSOLETE write_exp_elt_opcode (op); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_operand2 (void) // OBSOLETE { // OBSOLETE enum exp_opcode op; // OBSOLETE parse_operand3 (); // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE if (check_token (IN)) // OBSOLETE { // OBSOLETE parse_operand3 (); // OBSOLETE write_exp_elt_opcode (BINOP_IN); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case '>': // OBSOLETE op = BINOP_GTR; // OBSOLETE break; // OBSOLETE case GEQ: // OBSOLETE op = BINOP_GEQ; // OBSOLETE break; // OBSOLETE case '<': // OBSOLETE op = BINOP_LESS; // OBSOLETE break; // OBSOLETE case LEQ: // OBSOLETE op = BINOP_LEQ; // OBSOLETE break; // OBSOLETE case '=': // OBSOLETE op = BINOP_EQUAL; // OBSOLETE break; // OBSOLETE case NOTEQUAL: // OBSOLETE op = BINOP_NOTEQUAL; // OBSOLETE break; // OBSOLETE default: // OBSOLETE return; // OBSOLETE } // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_operand3 (); // OBSOLETE write_exp_elt_opcode (op); // OBSOLETE } // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_operand1 (void) // OBSOLETE { // OBSOLETE enum exp_opcode op; // OBSOLETE parse_operand2 (); // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case LOGAND: // OBSOLETE op = BINOP_BITWISE_AND; // OBSOLETE break; // OBSOLETE case ANDIF: // OBSOLETE op = BINOP_LOGICAL_AND; // OBSOLETE break; // OBSOLETE default: // OBSOLETE return; // OBSOLETE } // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_operand2 (); // OBSOLETE write_exp_elt_opcode (op); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_operand0 (void) // OBSOLETE { // OBSOLETE enum exp_opcode op; // OBSOLETE parse_operand1 (); // OBSOLETE for (;;) // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case LOGIOR: // OBSOLETE op = BINOP_BITWISE_IOR; // OBSOLETE break; // OBSOLETE case LOGXOR: // OBSOLETE op = BINOP_BITWISE_XOR; // OBSOLETE break; // OBSOLETE case ORIF: // OBSOLETE op = BINOP_LOGICAL_OR; // OBSOLETE break; // OBSOLETE default: // OBSOLETE return; // OBSOLETE } // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_operand1 (); // OBSOLETE write_exp_elt_opcode (op); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_expr (void) // OBSOLETE { // OBSOLETE parse_operand0 (); // OBSOLETE if (check_token (GDB_ASSIGNMENT)) // OBSOLETE { // OBSOLETE parse_expr (); // OBSOLETE write_exp_elt_opcode (BINOP_ASSIGN); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_then_alternative (void) // OBSOLETE { // OBSOLETE expect (THEN, "missing 'THEN' in 'IF' expression"); // OBSOLETE parse_expr (); // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_else_alternative (void) // OBSOLETE { // OBSOLETE if (check_token (ELSIF)) // OBSOLETE parse_if_expression_body (); // OBSOLETE else if (check_token (ELSE)) // OBSOLETE parse_expr (); // OBSOLETE else // OBSOLETE error ("missing ELSE/ELSIF in IF expression"); // OBSOLETE } // OBSOLETE // OBSOLETE /* Matches: <boolean expression> <then alternative> <else alternative> */ // OBSOLETE // OBSOLETE static void // OBSOLETE parse_if_expression_body (void) // OBSOLETE { // OBSOLETE parse_expr (); // OBSOLETE parse_then_alternative (); // OBSOLETE parse_else_alternative (); // OBSOLETE write_exp_elt_opcode (TERNOP_COND); // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE parse_if_expression (void) // OBSOLETE { // OBSOLETE require (IF); // OBSOLETE parse_if_expression_body (); // OBSOLETE expect (FI, "missing 'FI' at end of conditional expression"); // OBSOLETE } // OBSOLETE // OBSOLETE /* An <untyped_expr> is a superset of <expr>. It also includes // OBSOLETE <conditional expressions> and untyped <tuples>, whose types // OBSOLETE are not given by their constituents. Hence, these are only // OBSOLETE allowed in certain contexts that expect a certain type. // OBSOLETE You should call convert() to fix up the <untyped_expr>. */ // OBSOLETE // OBSOLETE static void // OBSOLETE parse_untyped_expr (void) // OBSOLETE { // OBSOLETE switch (PEEK_TOKEN ()) // OBSOLETE { // OBSOLETE case IF: // OBSOLETE parse_if_expression (); // OBSOLETE return; // OBSOLETE case CASE: // OBSOLETE error ("not implemented: CASE expression"); // OBSOLETE case '(': // OBSOLETE switch (PEEK_TOKEN1 ()) // OBSOLETE { // OBSOLETE case IF: // OBSOLETE case CASE: // OBSOLETE goto skip_lprn; // OBSOLETE case '[': // OBSOLETE skip_lprn: // OBSOLETE FORWARD_TOKEN (); // OBSOLETE parse_untyped_expr (); // OBSOLETE expect (')', "missing ')'"); // OBSOLETE return; // OBSOLETE default:; // OBSOLETE /* fall through */ // OBSOLETE } // OBSOLETE default: // OBSOLETE parse_operand0 (); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE int // OBSOLETE chill_parse (void) // OBSOLETE { // OBSOLETE terminal_buffer[0] = TOKEN_NOT_READ; // OBSOLETE if (PEEK_TOKEN () == TYPENAME && PEEK_TOKEN1 () == END_TOKEN) // OBSOLETE { // OBSOLETE write_exp_elt_opcode (OP_TYPE); // OBSOLETE write_exp_elt_type (PEEK_LVAL ().tsym.type); // OBSOLETE write_exp_elt_opcode (OP_TYPE); // OBSOLETE FORWARD_TOKEN (); // OBSOLETE } // OBSOLETE else // OBSOLETE parse_expr (); // OBSOLETE if (terminal_buffer[0] != END_TOKEN) // OBSOLETE { // OBSOLETE if (comma_terminates && terminal_buffer[0] == ',') // OBSOLETE lexptr--; /* Put the comma back. */ // OBSOLETE else // OBSOLETE error ("Junk after end of expression."); // OBSOLETE } // OBSOLETE return 0; // OBSOLETE } // OBSOLETE // OBSOLETE // OBSOLETE /* Implementation of a dynamically expandable buffer for processing input // OBSOLETE characters acquired through lexptr and building a value to return in // OBSOLETE yylval. */ // OBSOLETE // OBSOLETE static char *tempbuf; /* Current buffer contents */ // OBSOLETE static int tempbufsize; /* Size of allocated buffer */ // OBSOLETE static int tempbufindex; /* Current index into buffer */ // OBSOLETE // OBSOLETE #define GROWBY_MIN_SIZE 64 /* Minimum amount to grow buffer by */ // OBSOLETE // OBSOLETE #define CHECKBUF(size) \ // OBSOLETE do { \ // OBSOLETE if (tempbufindex + (size) >= tempbufsize) \ // OBSOLETE { \ // OBSOLETE growbuf_by_size (size); \ // OBSOLETE } \ // OBSOLETE } while (0); // OBSOLETE // OBSOLETE /* Grow the static temp buffer if necessary, including allocating the first one // OBSOLETE on demand. */ // OBSOLETE // OBSOLETE static void // OBSOLETE growbuf_by_size (int count) // OBSOLETE { // OBSOLETE int growby; // OBSOLETE // OBSOLETE growby = max (count, GROWBY_MIN_SIZE); // OBSOLETE tempbufsize += growby; // OBSOLETE if (tempbuf == NULL) // OBSOLETE { // OBSOLETE tempbuf = (char *) xmalloc (tempbufsize); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE tempbuf = (char *) xrealloc (tempbuf, tempbufsize); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Try to consume a simple name string token. If successful, returns // OBSOLETE a pointer to a nullbyte terminated copy of the name that can be used // OBSOLETE in symbol table lookups. If not successful, returns NULL. */ // OBSOLETE // OBSOLETE static char * // OBSOLETE match_simple_name_string (void) // OBSOLETE { // OBSOLETE char *tokptr = lexptr; // OBSOLETE // OBSOLETE if (isalpha (*tokptr) || *tokptr == '_') // OBSOLETE { // OBSOLETE char *result; // OBSOLETE do // OBSOLETE { // OBSOLETE tokptr++; // OBSOLETE } // OBSOLETE while (isalnum (*tokptr) || (*tokptr == '_')); // OBSOLETE yylval.sval.ptr = lexptr; // OBSOLETE yylval.sval.length = tokptr - lexptr; // OBSOLETE lexptr = tokptr; // OBSOLETE result = copy_name (yylval.sval); // OBSOLETE return result; // OBSOLETE } // OBSOLETE return (NULL); // OBSOLETE } // OBSOLETE // OBSOLETE /* Start looking for a value composed of valid digits as set by the base // OBSOLETE in use. Note that '_' characters are valid anywhere, in any quantity, // OBSOLETE and are simply ignored. Since we must find at least one valid digit, // OBSOLETE or reject this token as an integer literal, we keep track of how many // OBSOLETE digits we have encountered. */ // OBSOLETE // OBSOLETE static int // OBSOLETE decode_integer_value (int base, char **tokptrptr, LONGEST *ivalptr) // OBSOLETE { // OBSOLETE char *tokptr = *tokptrptr; // OBSOLETE int temp; // OBSOLETE int digits = 0; // OBSOLETE // OBSOLETE while (*tokptr != '\0') // OBSOLETE { // OBSOLETE temp = *tokptr; // OBSOLETE if (isupper (temp)) // OBSOLETE temp = tolower (temp); // OBSOLETE tokptr++; // OBSOLETE switch (temp) // OBSOLETE { // OBSOLETE case '_': // OBSOLETE continue; // OBSOLETE case '0': // OBSOLETE case '1': // OBSOLETE case '2': // OBSOLETE case '3': // OBSOLETE case '4': // OBSOLETE case '5': // OBSOLETE case '6': // OBSOLETE case '7': // OBSOLETE case '8': // OBSOLETE case '9': // OBSOLETE temp -= '0'; // OBSOLETE break; // OBSOLETE case 'a': // OBSOLETE case 'b': // OBSOLETE case 'c': // OBSOLETE case 'd': // OBSOLETE case 'e': // OBSOLETE case 'f': // OBSOLETE temp -= 'a'; // OBSOLETE temp += 10; // OBSOLETE break; // OBSOLETE default: // OBSOLETE temp = base; // OBSOLETE break; // OBSOLETE } // OBSOLETE if (temp < base) // OBSOLETE { // OBSOLETE digits++; // OBSOLETE *ivalptr *= base; // OBSOLETE *ivalptr += temp; // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE /* Found something not in domain for current base. */ // OBSOLETE tokptr--; /* Unconsume what gave us indigestion. */ // OBSOLETE break; // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* If we didn't find any digits, then we don't have a valid integer // OBSOLETE value, so reject the entire token. Otherwise, update the lexical // OBSOLETE scan pointer, and return non-zero for success. */ // OBSOLETE // OBSOLETE if (digits == 0) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE *tokptrptr = tokptr; // OBSOLETE return (1); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE static int // OBSOLETE decode_integer_literal (LONGEST *valptr, char **tokptrptr) // OBSOLETE { // OBSOLETE char *tokptr = *tokptrptr; // OBSOLETE int base = 0; // OBSOLETE LONGEST ival = 0; // OBSOLETE int explicit_base = 0; // OBSOLETE // OBSOLETE /* Look for an explicit base specifier, which is optional. */ // OBSOLETE // OBSOLETE switch (*tokptr) // OBSOLETE { // OBSOLETE case 'd': // OBSOLETE case 'D': // OBSOLETE explicit_base++; // OBSOLETE base = 10; // OBSOLETE tokptr++; // OBSOLETE break; // OBSOLETE case 'b': // OBSOLETE case 'B': // OBSOLETE explicit_base++; // OBSOLETE base = 2; // OBSOLETE tokptr++; // OBSOLETE break; // OBSOLETE case 'h': // OBSOLETE case 'H': // OBSOLETE explicit_base++; // OBSOLETE base = 16; // OBSOLETE tokptr++; // OBSOLETE break; // OBSOLETE case 'o': // OBSOLETE case 'O': // OBSOLETE explicit_base++; // OBSOLETE base = 8; // OBSOLETE tokptr++; // OBSOLETE break; // OBSOLETE default: // OBSOLETE base = 10; // OBSOLETE break; // OBSOLETE } // OBSOLETE // OBSOLETE /* If we found an explicit base ensure that the character after the // OBSOLETE explicit base is a single quote. */ // OBSOLETE // OBSOLETE if (explicit_base && (*tokptr++ != '\'')) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE // OBSOLETE /* Attempt to decode whatever follows as an integer value in the // OBSOLETE indicated base, updating the token pointer in the process and // OBSOLETE computing the value into ival. Also, if we have an explicit // OBSOLETE base, then the next character must not be a single quote, or we // OBSOLETE have a bitstring literal, so reject the entire token in this case. // OBSOLETE Otherwise, update the lexical scan pointer, and return non-zero // OBSOLETE for success. */ // OBSOLETE // OBSOLETE if (!decode_integer_value (base, &tokptr, &ival)) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE else if (explicit_base && (*tokptr == '\'')) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE *valptr = ival; // OBSOLETE *tokptrptr = tokptr; // OBSOLETE return (1); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* If it wasn't for the fact that floating point values can contain '_' // OBSOLETE characters, we could just let strtod do all the hard work by letting it // OBSOLETE try to consume as much of the current token buffer as possible and // OBSOLETE find a legal conversion. Unfortunately we need to filter out the '_' // OBSOLETE characters before calling strtod, which we do by copying the other // OBSOLETE legal chars to a local buffer to be converted. However since we also // OBSOLETE need to keep track of where the last unconsumed character in the input // OBSOLETE buffer is, we have transfer only as many characters as may compose a // OBSOLETE legal floating point value. */ // OBSOLETE // OBSOLETE static enum ch_terminal // OBSOLETE match_float_literal (void) // OBSOLETE { // OBSOLETE char *tokptr = lexptr; // OBSOLETE char *buf; // OBSOLETE char *copy; // OBSOLETE double dval; // OBSOLETE extern double strtod (); // OBSOLETE // OBSOLETE /* Make local buffer in which to build the string to convert. This is // OBSOLETE required because underscores are valid in chill floating point numbers // OBSOLETE but not in the string passed to strtod to convert. The string will be // OBSOLETE no longer than our input string. */ // OBSOLETE // OBSOLETE copy = buf = (char *) alloca (strlen (tokptr) + 1); // OBSOLETE // OBSOLETE /* Transfer all leading digits to the conversion buffer, discarding any // OBSOLETE underscores. */ // OBSOLETE // OBSOLETE while (isdigit (*tokptr) || *tokptr == '_') // OBSOLETE { // OBSOLETE if (*tokptr != '_') // OBSOLETE { // OBSOLETE *copy++ = *tokptr; // OBSOLETE } // OBSOLETE tokptr++; // OBSOLETE } // OBSOLETE // OBSOLETE /* Now accept either a '.', or one of [eEdD]. Dot is legal regardless // OBSOLETE of whether we found any leading digits, and we simply accept it and // OBSOLETE continue on to look for the fractional part and/or exponent. One of // OBSOLETE [eEdD] is legal only if we have seen digits, and means that there // OBSOLETE is no fractional part. If we find neither of these, then this is // OBSOLETE not a floating point number, so return failure. */ // OBSOLETE // OBSOLETE switch (*tokptr++) // OBSOLETE { // OBSOLETE case '.': // OBSOLETE /* Accept and then look for fractional part and/or exponent. */ // OBSOLETE *copy++ = '.'; // OBSOLETE break; // OBSOLETE // OBSOLETE case 'e': // OBSOLETE case 'E': // OBSOLETE case 'd': // OBSOLETE case 'D': // OBSOLETE if (copy == buf) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE *copy++ = 'e'; // OBSOLETE goto collect_exponent; // OBSOLETE break; // OBSOLETE // OBSOLETE default: // OBSOLETE return (0); // OBSOLETE break; // OBSOLETE } // OBSOLETE // OBSOLETE /* We found a '.', copy any fractional digits to the conversion buffer, up // OBSOLETE to the first nondigit, non-underscore character. */ // OBSOLETE // OBSOLETE while (isdigit (*tokptr) || *tokptr == '_') // OBSOLETE { // OBSOLETE if (*tokptr != '_') // OBSOLETE { // OBSOLETE *copy++ = *tokptr; // OBSOLETE } // OBSOLETE tokptr++; // OBSOLETE } // OBSOLETE // OBSOLETE /* Look for an exponent, which must start with one of [eEdD]. If none // OBSOLETE is found, jump directly to trying to convert what we have collected // OBSOLETE so far. */ // OBSOLETE // OBSOLETE switch (*tokptr) // OBSOLETE { // OBSOLETE case 'e': // OBSOLETE case 'E': // OBSOLETE case 'd': // OBSOLETE case 'D': // OBSOLETE *copy++ = 'e'; // OBSOLETE tokptr++; // OBSOLETE break; // OBSOLETE default: // OBSOLETE goto convert_float; // OBSOLETE break; // OBSOLETE } // OBSOLETE // OBSOLETE /* Accept an optional '-' or '+' following one of [eEdD]. */ // OBSOLETE // OBSOLETE collect_exponent: // OBSOLETE if (*tokptr == '+' || *tokptr == '-') // OBSOLETE { // OBSOLETE *copy++ = *tokptr++; // OBSOLETE } // OBSOLETE // OBSOLETE /* Now copy an exponent into the conversion buffer. Note that at the // OBSOLETE moment underscores are *not* allowed in exponents. */ // OBSOLETE // OBSOLETE while (isdigit (*tokptr)) // OBSOLETE { // OBSOLETE *copy++ = *tokptr++; // OBSOLETE } // OBSOLETE // OBSOLETE /* If we transfered any chars to the conversion buffer, try to interpret its // OBSOLETE contents as a floating point value. If any characters remain, then we // OBSOLETE must not have a valid floating point string. */ // OBSOLETE // OBSOLETE convert_float: // OBSOLETE *copy = '\0'; // OBSOLETE if (copy != buf) // OBSOLETE { // OBSOLETE dval = strtod (buf, ©); // OBSOLETE if (*copy == '\0') // OBSOLETE { // OBSOLETE yylval.dval = dval; // OBSOLETE lexptr = tokptr; // OBSOLETE return (FLOAT_LITERAL); // OBSOLETE } // OBSOLETE } // OBSOLETE return (0); // OBSOLETE } // OBSOLETE // OBSOLETE /* Recognize a string literal. A string literal is a sequence // OBSOLETE of characters enclosed in matching single or double quotes, except that // OBSOLETE a single character inside single quotes is a character literal, which // OBSOLETE we reject as a string literal. To embed the terminator character inside // OBSOLETE a string, it is simply doubled (I.E. "this""is""one""string") */ // OBSOLETE // OBSOLETE static enum ch_terminal // OBSOLETE match_string_literal (void) // OBSOLETE { // OBSOLETE char *tokptr = lexptr; // OBSOLETE int in_ctrlseq = 0; // OBSOLETE LONGEST ival; // OBSOLETE // OBSOLETE for (tempbufindex = 0, tokptr++; *tokptr != '\0'; tokptr++) // OBSOLETE { // OBSOLETE CHECKBUF (1); // OBSOLETE tryagain:; // OBSOLETE if (in_ctrlseq) // OBSOLETE { // OBSOLETE /* skip possible whitespaces */ // OBSOLETE while ((*tokptr == ' ' || *tokptr == '\t') && *tokptr) // OBSOLETE tokptr++; // OBSOLETE if (*tokptr == ')') // OBSOLETE { // OBSOLETE in_ctrlseq = 0; // OBSOLETE tokptr++; // OBSOLETE goto tryagain; // OBSOLETE } // OBSOLETE else if (*tokptr != ',') // OBSOLETE error ("Invalid control sequence"); // OBSOLETE tokptr++; // OBSOLETE /* skip possible whitespaces */ // OBSOLETE while ((*tokptr == ' ' || *tokptr == '\t') && *tokptr) // OBSOLETE tokptr++; // OBSOLETE if (!decode_integer_literal (&ival, &tokptr)) // OBSOLETE error ("Invalid control sequence"); // OBSOLETE tokptr--; // OBSOLETE } // OBSOLETE else if (*tokptr == *lexptr) // OBSOLETE { // OBSOLETE if (*(tokptr + 1) == *lexptr) // OBSOLETE { // OBSOLETE ival = *tokptr++; // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE break; // OBSOLETE } // OBSOLETE } // OBSOLETE else if (*tokptr == '^') // OBSOLETE { // OBSOLETE if (*(tokptr + 1) == '(') // OBSOLETE { // OBSOLETE in_ctrlseq = 1; // OBSOLETE tokptr += 2; // OBSOLETE if (!decode_integer_literal (&ival, &tokptr)) // OBSOLETE error ("Invalid control sequence"); // OBSOLETE tokptr--; // OBSOLETE } // OBSOLETE else if (*(tokptr + 1) == '^') // OBSOLETE ival = *tokptr++; // OBSOLETE else // OBSOLETE error ("Invalid control sequence"); // OBSOLETE } // OBSOLETE else // OBSOLETE ival = *tokptr; // OBSOLETE tempbuf[tempbufindex++] = ival; // OBSOLETE } // OBSOLETE if (in_ctrlseq) // OBSOLETE error ("Invalid control sequence"); // OBSOLETE // OBSOLETE if (*tokptr == '\0' /* no terminator */ // OBSOLETE || (tempbufindex == 1 && *tokptr == '\'')) /* char literal */ // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE tempbuf[tempbufindex] = '\0'; // OBSOLETE yylval.sval.ptr = tempbuf; // OBSOLETE yylval.sval.length = tempbufindex; // OBSOLETE lexptr = ++tokptr; // OBSOLETE return (CHARACTER_STRING_LITERAL); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Recognize a character literal. A character literal is single character // OBSOLETE or a control sequence, enclosed in single quotes. A control sequence // OBSOLETE is a comma separated list of one or more integer literals, enclosed // OBSOLETE in parenthesis and introduced with a circumflex character. // OBSOLETE // OBSOLETE EX: 'a' '^(7)' '^(7,8)' // OBSOLETE // OBSOLETE As a GNU chill extension, the syntax C'xx' is also recognized as a // OBSOLETE character literal, where xx is a hex value for the character. // OBSOLETE // OBSOLETE Note that more than a single character, enclosed in single quotes, is // OBSOLETE a string literal. // OBSOLETE // OBSOLETE Returns CHARACTER_LITERAL if a match is found. // OBSOLETE */ // OBSOLETE // OBSOLETE static enum ch_terminal // OBSOLETE match_character_literal (void) // OBSOLETE { // OBSOLETE char *tokptr = lexptr; // OBSOLETE LONGEST ival = 0; // OBSOLETE // OBSOLETE if ((*tokptr == 'c' || *tokptr == 'C') && (*(tokptr + 1) == '\'')) // OBSOLETE { // OBSOLETE /* We have a GNU chill extension form, so skip the leading "C'", // OBSOLETE decode the hex value, and then ensure that we have a trailing // OBSOLETE single quote character. */ // OBSOLETE tokptr += 2; // OBSOLETE if (!decode_integer_value (16, &tokptr, &ival) || (*tokptr != '\'')) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE tokptr++; // OBSOLETE } // OBSOLETE else if (*tokptr == '\'') // OBSOLETE { // OBSOLETE tokptr++; // OBSOLETE // OBSOLETE /* Determine which form we have, either a control sequence or the // OBSOLETE single character form. */ // OBSOLETE // OBSOLETE if (*tokptr == '^') // OBSOLETE { // OBSOLETE if (*(tokptr + 1) == '(') // OBSOLETE { // OBSOLETE /* Match and decode a control sequence. Return zero if we don't // OBSOLETE find a valid integer literal, or if the next unconsumed character // OBSOLETE after the integer literal is not the trailing ')'. */ // OBSOLETE tokptr += 2; // OBSOLETE if (!decode_integer_literal (&ival, &tokptr) || (*tokptr++ != ')')) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE } // OBSOLETE else if (*(tokptr + 1) == '^') // OBSOLETE { // OBSOLETE ival = *tokptr; // OBSOLETE tokptr += 2; // OBSOLETE } // OBSOLETE else // OBSOLETE /* fail */ // OBSOLETE error ("Invalid control sequence"); // OBSOLETE } // OBSOLETE else if (*tokptr == '\'') // OBSOLETE { // OBSOLETE /* this must be duplicated */ // OBSOLETE ival = *tokptr; // OBSOLETE tokptr += 2; // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE ival = *tokptr++; // OBSOLETE } // OBSOLETE // OBSOLETE /* The trailing quote has not yet been consumed. If we don't find // OBSOLETE it, then we have no match. */ // OBSOLETE // OBSOLETE if (*tokptr++ != '\'') // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE /* Not a character literal. */ // OBSOLETE return (0); // OBSOLETE } // OBSOLETE yylval.typed_val.val = ival; // OBSOLETE yylval.typed_val.type = builtin_type_chill_char; // OBSOLETE lexptr = tokptr; // OBSOLETE return (CHARACTER_LITERAL); // OBSOLETE } // OBSOLETE // OBSOLETE /* Recognize an integer literal, as specified in Z.200 sec 5.2.4.2. // OBSOLETE Note that according to 5.2.4.2, a single "_" is also a valid integer // OBSOLETE literal, however GNU-chill requires there to be at least one "digit" // OBSOLETE in any integer literal. */ // OBSOLETE // OBSOLETE static enum ch_terminal // OBSOLETE match_integer_literal (void) // OBSOLETE { // OBSOLETE char *tokptr = lexptr; // OBSOLETE LONGEST ival; // OBSOLETE // OBSOLETE if (!decode_integer_literal (&ival, &tokptr)) // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE yylval.typed_val.val = ival; // OBSOLETE #if defined(CC_HAS_LONG_LONG) // OBSOLETE if (ival > (LONGEST) 2147483647U || ival < -(LONGEST) 2147483648U) // OBSOLETE yylval.typed_val.type = builtin_type_long_long; // OBSOLETE else // OBSOLETE #endif // OBSOLETE yylval.typed_val.type = builtin_type_int; // OBSOLETE lexptr = tokptr; // OBSOLETE return (INTEGER_LITERAL); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Recognize a bit-string literal, as specified in Z.200 sec 5.2.4.8 // OBSOLETE Note that according to 5.2.4.8, a single "_" is also a valid bit-string // OBSOLETE literal, however GNU-chill requires there to be at least one "digit" // OBSOLETE in any bit-string literal. */ // OBSOLETE // OBSOLETE static enum ch_terminal // OBSOLETE match_bitstring_literal (void) // OBSOLETE { // OBSOLETE register char *tokptr = lexptr; // OBSOLETE int bitoffset = 0; // OBSOLETE int bitcount = 0; // OBSOLETE int bits_per_char; // OBSOLETE int digit; // OBSOLETE // OBSOLETE tempbufindex = 0; // OBSOLETE CHECKBUF (1); // OBSOLETE tempbuf[0] = 0; // OBSOLETE // OBSOLETE /* Look for the required explicit base specifier. */ // OBSOLETE // OBSOLETE switch (*tokptr++) // OBSOLETE { // OBSOLETE case 'b': // OBSOLETE case 'B': // OBSOLETE bits_per_char = 1; // OBSOLETE break; // OBSOLETE case 'o': // OBSOLETE case 'O': // OBSOLETE bits_per_char = 3; // OBSOLETE break; // OBSOLETE case 'h': // OBSOLETE case 'H': // OBSOLETE bits_per_char = 4; // OBSOLETE break; // OBSOLETE default: // OBSOLETE return (0); // OBSOLETE break; // OBSOLETE } // OBSOLETE // OBSOLETE /* Ensure that the character after the explicit base is a single quote. */ // OBSOLETE // OBSOLETE if (*tokptr++ != '\'') // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE // OBSOLETE while (*tokptr != '\0' && *tokptr != '\'') // OBSOLETE { // OBSOLETE digit = *tokptr; // OBSOLETE if (isupper (digit)) // OBSOLETE digit = tolower (digit); // OBSOLETE tokptr++; // OBSOLETE switch (digit) // OBSOLETE { // OBSOLETE case '_': // OBSOLETE continue; // OBSOLETE case '0': // OBSOLETE case '1': // OBSOLETE case '2': // OBSOLETE case '3': // OBSOLETE case '4': // OBSOLETE case '5': // OBSOLETE case '6': // OBSOLETE case '7': // OBSOLETE case '8': // OBSOLETE case '9': // OBSOLETE digit -= '0'; // OBSOLETE break; // OBSOLETE case 'a': // OBSOLETE case 'b': // OBSOLETE case 'c': // OBSOLETE case 'd': // OBSOLETE case 'e': // OBSOLETE case 'f': // OBSOLETE digit -= 'a'; // OBSOLETE digit += 10; // OBSOLETE break; // OBSOLETE default: // OBSOLETE /* this is not a bitstring literal, probably an integer */ // OBSOLETE return 0; // OBSOLETE } // OBSOLETE if (digit >= 1 << bits_per_char) // OBSOLETE { // OBSOLETE /* Found something not in domain for current base. */ // OBSOLETE error ("Too-large digit in bitstring or integer."); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE /* Extract bits from digit, packing them into the bitstring byte. */ // OBSOLETE int k = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? bits_per_char - 1 : 0; // OBSOLETE for (; TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? k >= 0 : k < bits_per_char; // OBSOLETE TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? k-- : k++) // OBSOLETE { // OBSOLETE bitcount++; // OBSOLETE if (digit & (1 << k)) // OBSOLETE { // OBSOLETE tempbuf[tempbufindex] |= // OBSOLETE (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) // OBSOLETE ? (1 << (HOST_CHAR_BIT - 1 - bitoffset)) // OBSOLETE : (1 << bitoffset); // OBSOLETE } // OBSOLETE bitoffset++; // OBSOLETE if (bitoffset == HOST_CHAR_BIT) // OBSOLETE { // OBSOLETE bitoffset = 0; // OBSOLETE tempbufindex++; // OBSOLETE CHECKBUF (1); // OBSOLETE tempbuf[tempbufindex] = 0; // OBSOLETE } // OBSOLETE } // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Verify that we consumed everything up to the trailing single quote, // OBSOLETE and that we found some bits (IE not just underbars). */ // OBSOLETE // OBSOLETE if (*tokptr++ != '\'') // OBSOLETE { // OBSOLETE return (0); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE yylval.sval.ptr = tempbuf; // OBSOLETE yylval.sval.length = bitcount; // OBSOLETE lexptr = tokptr; // OBSOLETE return (BIT_STRING_LITERAL); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE struct token // OBSOLETE { // OBSOLETE char *operator; // OBSOLETE int token; // OBSOLETE }; // OBSOLETE // OBSOLETE static const struct token idtokentab[] = // OBSOLETE { // OBSOLETE {"array", ARRAY}, // OBSOLETE {"length", LENGTH}, // OBSOLETE {"lower", LOWER}, // OBSOLETE {"upper", UPPER}, // OBSOLETE {"andif", ANDIF}, // OBSOLETE {"pred", PRED}, // OBSOLETE {"succ", SUCC}, // OBSOLETE {"card", CARD}, // OBSOLETE {"size", SIZE}, // OBSOLETE {"orif", ORIF}, // OBSOLETE {"num", NUM}, // OBSOLETE {"abs", ABS}, // OBSOLETE {"max", MAX_TOKEN}, // OBSOLETE {"min", MIN_TOKEN}, // OBSOLETE {"mod", MOD}, // OBSOLETE {"rem", REM}, // OBSOLETE {"not", NOT}, // OBSOLETE {"xor", LOGXOR}, // OBSOLETE {"and", LOGAND}, // OBSOLETE {"in", IN}, // OBSOLETE {"or", LOGIOR}, // OBSOLETE {"up", UP}, // OBSOLETE {"addr", ADDR_TOKEN}, // OBSOLETE {"null", EMPTINESS_LITERAL} // OBSOLETE }; // OBSOLETE // OBSOLETE static const struct token tokentab2[] = // OBSOLETE { // OBSOLETE {":=", GDB_ASSIGNMENT}, // OBSOLETE {"//", SLASH_SLASH}, // OBSOLETE {"->", POINTER}, // OBSOLETE {"/=", NOTEQUAL}, // OBSOLETE {"<=", LEQ}, // OBSOLETE {">=", GEQ} // OBSOLETE }; // OBSOLETE // OBSOLETE /* Read one token, getting characters through lexptr. */ // OBSOLETE /* This is where we will check to make sure that the language and the // OBSOLETE operators used are compatible. */ // OBSOLETE // OBSOLETE static enum ch_terminal // OBSOLETE ch_lex (void) // OBSOLETE { // OBSOLETE unsigned int i; // OBSOLETE enum ch_terminal token; // OBSOLETE char *inputname; // OBSOLETE struct symbol *sym; // OBSOLETE // OBSOLETE /* Skip over any leading whitespace. */ // OBSOLETE while (isspace (*lexptr)) // OBSOLETE { // OBSOLETE lexptr++; // OBSOLETE } // OBSOLETE /* Look for special single character cases which can't be the first // OBSOLETE character of some other multicharacter token. */ // OBSOLETE switch (*lexptr) // OBSOLETE { // OBSOLETE case '\0': // OBSOLETE return END_TOKEN; // OBSOLETE case ',': // OBSOLETE case '=': // OBSOLETE case ';': // OBSOLETE case '!': // OBSOLETE case '+': // OBSOLETE case '*': // OBSOLETE case '(': // OBSOLETE case ')': // OBSOLETE case '[': // OBSOLETE case ']': // OBSOLETE return (*lexptr++); // OBSOLETE } // OBSOLETE /* Look for characters which start a particular kind of multicharacter // OBSOLETE token, such as a character literal, register name, convenience // OBSOLETE variable name, string literal, etc. */ // OBSOLETE switch (*lexptr) // OBSOLETE { // OBSOLETE case '\'': // OBSOLETE case '\"': // OBSOLETE /* First try to match a string literal, which is any // OBSOLETE sequence of characters enclosed in matching single or double // OBSOLETE quotes, except that a single character inside single quotes // OBSOLETE is a character literal, so we have to catch that case also. */ // OBSOLETE token = match_string_literal (); // OBSOLETE if (token != 0) // OBSOLETE { // OBSOLETE return (token); // OBSOLETE } // OBSOLETE if (*lexptr == '\'') // OBSOLETE { // OBSOLETE token = match_character_literal (); // OBSOLETE if (token != 0) // OBSOLETE { // OBSOLETE return (token); // OBSOLETE } // OBSOLETE } // OBSOLETE break; // OBSOLETE case 'C': // OBSOLETE case 'c': // OBSOLETE token = match_character_literal (); // OBSOLETE if (token != 0) // OBSOLETE { // OBSOLETE return (token); // OBSOLETE } // OBSOLETE break; // OBSOLETE case '$': // OBSOLETE yylval.sval.ptr = lexptr; // OBSOLETE do // OBSOLETE { // OBSOLETE lexptr++; // OBSOLETE } // OBSOLETE while (isalnum (*lexptr) || *lexptr == '_' || *lexptr == '$'); // OBSOLETE yylval.sval.length = lexptr - yylval.sval.ptr; // OBSOLETE write_dollar_variable (yylval.sval); // OBSOLETE return GDB_VARIABLE; // OBSOLETE break; // OBSOLETE } // OBSOLETE /* See if it is a special token of length 2. */ // OBSOLETE for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++) // OBSOLETE { // OBSOLETE if (STREQN (lexptr, tokentab2[i].operator, 2)) // OBSOLETE { // OBSOLETE lexptr += 2; // OBSOLETE return (tokentab2[i].token); // OBSOLETE } // OBSOLETE } // OBSOLETE /* Look for single character cases which which could be the first // OBSOLETE character of some other multicharacter token, but aren't, or we // OBSOLETE would already have found it. */ // OBSOLETE switch (*lexptr) // OBSOLETE { // OBSOLETE case '-': // OBSOLETE case ':': // OBSOLETE case '/': // OBSOLETE case '<': // OBSOLETE case '>': // OBSOLETE return (*lexptr++); // OBSOLETE } // OBSOLETE /* Look for a float literal before looking for an integer literal, so // OBSOLETE we match as much of the input stream as possible. */ // OBSOLETE token = match_float_literal (); // OBSOLETE if (token != 0) // OBSOLETE { // OBSOLETE return (token); // OBSOLETE } // OBSOLETE token = match_bitstring_literal (); // OBSOLETE if (token != 0) // OBSOLETE { // OBSOLETE return (token); // OBSOLETE } // OBSOLETE token = match_integer_literal (); // OBSOLETE if (token != 0) // OBSOLETE { // OBSOLETE return (token); // OBSOLETE } // OBSOLETE // OBSOLETE /* Try to match a simple name string, and if a match is found, then // OBSOLETE further classify what sort of name it is and return an appropriate // OBSOLETE token. Note that attempting to match a simple name string consumes // OBSOLETE the token from lexptr, so we can't back out if we later find that // OBSOLETE we can't classify what sort of name it is. */ // OBSOLETE // OBSOLETE inputname = match_simple_name_string (); // OBSOLETE // OBSOLETE if (inputname != NULL) // OBSOLETE { // OBSOLETE char *simplename = (char *) alloca (strlen (inputname) + 1); // OBSOLETE // OBSOLETE char *dptr = simplename, *sptr = inputname; // OBSOLETE for (; *sptr; sptr++) // OBSOLETE *dptr++ = isupper (*sptr) ? tolower (*sptr) : *sptr; // OBSOLETE *dptr = '\0'; // OBSOLETE // OBSOLETE /* See if it is a reserved identifier. */ // OBSOLETE for (i = 0; i < sizeof (idtokentab) / sizeof (idtokentab[0]); i++) // OBSOLETE { // OBSOLETE if (STREQ (simplename, idtokentab[i].operator)) // OBSOLETE { // OBSOLETE return (idtokentab[i].token); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Look for other special tokens. */ // OBSOLETE if (STREQ (simplename, "true")) // OBSOLETE { // OBSOLETE yylval.ulval = 1; // OBSOLETE return (BOOLEAN_LITERAL); // OBSOLETE } // OBSOLETE if (STREQ (simplename, "false")) // OBSOLETE { // OBSOLETE yylval.ulval = 0; // OBSOLETE return (BOOLEAN_LITERAL); // OBSOLETE } // OBSOLETE // OBSOLETE sym = lookup_symbol (inputname, expression_context_block, // OBSOLETE VAR_NAMESPACE, (int *) NULL, // OBSOLETE (struct symtab **) NULL); // OBSOLETE if (sym == NULL && strcmp (inputname, simplename) != 0) // OBSOLETE { // OBSOLETE sym = lookup_symbol (simplename, expression_context_block, // OBSOLETE VAR_NAMESPACE, (int *) NULL, // OBSOLETE (struct symtab **) NULL); // OBSOLETE } // OBSOLETE if (sym != NULL) // OBSOLETE { // OBSOLETE yylval.ssym.stoken.ptr = NULL; // OBSOLETE yylval.ssym.stoken.length = 0; // OBSOLETE yylval.ssym.sym = sym; // OBSOLETE yylval.ssym.is_a_field_of_this = 0; /* FIXME, C++'ism */ // OBSOLETE switch (SYMBOL_CLASS (sym)) // OBSOLETE { // OBSOLETE case LOC_BLOCK: // OBSOLETE /* Found a procedure name. */ // OBSOLETE return (GENERAL_PROCEDURE_NAME); // OBSOLETE case LOC_STATIC: // OBSOLETE /* Found a global or local static variable. */ // OBSOLETE return (LOCATION_NAME); // OBSOLETE case LOC_REGISTER: // OBSOLETE case LOC_ARG: // OBSOLETE case LOC_REF_ARG: // OBSOLETE case LOC_REGPARM: // OBSOLETE case LOC_REGPARM_ADDR: // OBSOLETE case LOC_LOCAL: // OBSOLETE case LOC_LOCAL_ARG: // OBSOLETE case LOC_BASEREG: // OBSOLETE case LOC_BASEREG_ARG: // OBSOLETE if (innermost_block == NULL // OBSOLETE || contained_in (block_found, innermost_block)) // OBSOLETE { // OBSOLETE innermost_block = block_found; // OBSOLETE } // OBSOLETE return (LOCATION_NAME); // OBSOLETE break; // OBSOLETE case LOC_CONST: // OBSOLETE case LOC_LABEL: // OBSOLETE return (LOCATION_NAME); // OBSOLETE break; // OBSOLETE case LOC_TYPEDEF: // OBSOLETE yylval.tsym.type = SYMBOL_TYPE (sym); // OBSOLETE return TYPENAME; // OBSOLETE case LOC_UNDEF: // OBSOLETE case LOC_CONST_BYTES: // OBSOLETE case LOC_OPTIMIZED_OUT: // OBSOLETE error ("Symbol \"%s\" names no location.", inputname); // OBSOLETE break; // OBSOLETE default: // OBSOLETE internal_error (__FILE__, __LINE__, // OBSOLETE "unhandled SYMBOL_CLASS in ch_lex()"); // OBSOLETE break; // OBSOLETE } // OBSOLETE } // OBSOLETE else if (!have_full_symbols () && !have_partial_symbols ()) // OBSOLETE { // OBSOLETE error ("No symbol table is loaded. Use the \"file\" command."); // OBSOLETE } // OBSOLETE else // OBSOLETE { // OBSOLETE error ("No symbol \"%s\" in current context.", inputname); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE /* Catch single character tokens which are not part of some // OBSOLETE longer token. */ // OBSOLETE // OBSOLETE switch (*lexptr) // OBSOLETE { // OBSOLETE case '.': /* Not float for example. */ // OBSOLETE lexptr++; // OBSOLETE while (isspace (*lexptr)) // OBSOLETE lexptr++; // OBSOLETE inputname = match_simple_name_string (); // OBSOLETE if (!inputname) // OBSOLETE return '.'; // OBSOLETE return DOT_FIELD_NAME; // OBSOLETE } // OBSOLETE // OBSOLETE return (ILLEGAL_TOKEN); // OBSOLETE } // OBSOLETE // OBSOLETE static void // OBSOLETE write_lower_upper_value (enum exp_opcode opcode, /* Either UNOP_LOWER or UNOP_UPPER */ // OBSOLETE struct type *type) // OBSOLETE { // OBSOLETE if (type == NULL) // OBSOLETE write_exp_elt_opcode (opcode); // OBSOLETE else // OBSOLETE { // OBSOLETE struct type *result_type; // OBSOLETE LONGEST val = type_lower_upper (opcode, type, &result_type); // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE write_exp_elt_type (result_type); // OBSOLETE write_exp_elt_longcst (val); // OBSOLETE write_exp_elt_opcode (OP_LONG); // OBSOLETE } // OBSOLETE } // OBSOLETE // OBSOLETE void // OBSOLETE chill_error (char *msg) // OBSOLETE { // OBSOLETE /* Never used. */ // OBSOLETE }
Go to most recent revision | Compare with Previous | Blame | View Log