Blame ce_expr.tab.cc

Packit a4aae4
/* A Bison parser, made by GNU Bison 3.0.4.  */
Packit a4aae4
Packit a4aae4
/* Bison implementation for Yacc-like parsers in C
Packit a4aae4
Packit a4aae4
   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
Packit a4aae4
Packit a4aae4
   This program is free software: you can redistribute it and/or modify
Packit a4aae4
   it under the terms of the GNU General Public License as published by
Packit a4aae4
   the Free Software Foundation, either version 3 of the License, or
Packit a4aae4
   (at your option) any later version.
Packit a4aae4
Packit a4aae4
   This program is distributed in the hope that it will be useful,
Packit a4aae4
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4aae4
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit a4aae4
   GNU General Public License for more details.
Packit a4aae4
Packit a4aae4
   You should have received a copy of the GNU General Public License
Packit a4aae4
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit a4aae4
Packit a4aae4
/* As a special exception, you may create a larger work that contains
Packit a4aae4
   part or all of the Bison parser skeleton and distribute that work
Packit a4aae4
   under terms of your choice, so long as that work isn't itself a
Packit a4aae4
   parser generator using the skeleton or a modified version thereof
Packit a4aae4
   as a parser skeleton.  Alternatively, if you modify or redistribute
Packit a4aae4
   the parser skeleton itself, you may (at your option) remove this
Packit a4aae4
   special exception, which will cause the skeleton and the resulting
Packit a4aae4
   Bison output files to be licensed under the GNU General Public
Packit a4aae4
   License without this special exception.
Packit a4aae4
Packit a4aae4
   This special exception was added by the Free Software Foundation in
Packit a4aae4
   version 2.2 of Bison.  */
Packit a4aae4
Packit a4aae4
/* C LALR(1) parser skeleton written by Richard Stallman, by
Packit a4aae4
   simplifying the original so-called "semantic" parser.  */
Packit a4aae4
Packit a4aae4
/* All symbols defined below should begin with yy or YY, to avoid
Packit a4aae4
   infringing on user name space.  This should be done even for local
Packit a4aae4
   variables, as they might otherwise be expanded by user macros.
Packit a4aae4
   There are some unavoidable exceptions within include files to
Packit a4aae4
   define necessary library symbols; they are noted "INFRINGES ON
Packit a4aae4
   USER NAME SPACE" below.  */
Packit a4aae4
Packit a4aae4
/* Identify Bison output.  */
Packit a4aae4
#define YYBISON 1
Packit a4aae4
Packit a4aae4
/* Bison version.  */
Packit a4aae4
#define YYBISON_VERSION "3.0.4"
Packit a4aae4
Packit a4aae4
/* Skeleton name.  */
Packit a4aae4
#define YYSKELETON_NAME "yacc.c"
Packit a4aae4
Packit a4aae4
/* Pure parsers.  */
Packit a4aae4
#define YYPURE 0
Packit a4aae4
Packit a4aae4
/* Push parsers.  */
Packit a4aae4
#define YYPUSH 0
Packit a4aae4
Packit a4aae4
/* Pull parsers.  */
Packit a4aae4
#define YYPULL 1
Packit a4aae4
Packit a4aae4
Packit a4aae4
/* Substitute the variable and function names.  */
Packit a4aae4
#define yyparse         ce_exprparse
Packit a4aae4
#define yylex           ce_exprlex
Packit a4aae4
#define yyerror         ce_exprerror
Packit a4aae4
#define yydebug         ce_exprdebug
Packit a4aae4
#define yynerrs         ce_exprnerrs
Packit a4aae4
Packit a4aae4
#define yylval          ce_exprlval
Packit a4aae4
#define yychar          ce_exprchar
Packit a4aae4
Packit a4aae4
/* Copy the first part of user declarations.  */
Packit a4aae4
Packit a4aae4
#line 75 "ce_expr.tab.cc" /* yacc.c:339  */
Packit a4aae4
Packit a4aae4
# ifndef YY_NULLPTR
Packit a4aae4
#  if defined __cplusplus && 201103L <= __cplusplus
Packit a4aae4
#   define YY_NULLPTR nullptr
Packit a4aae4
#  else
Packit a4aae4
#   define YY_NULLPTR 0
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
/* Enabling verbose error messages.  */
Packit a4aae4
#ifdef YYERROR_VERBOSE
Packit a4aae4
# undef YYERROR_VERBOSE
Packit a4aae4
# define YYERROR_VERBOSE 1
Packit a4aae4
#else
Packit a4aae4
# define YYERROR_VERBOSE 0
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* In a future release of Bison, this section will be replaced
Packit a4aae4
   by #include "ce_expr.tab.hh".  */
Packit a4aae4
#ifndef YY_CE_EXPR_CE_EXPR_TAB_HH_INCLUDED
Packit a4aae4
# define YY_CE_EXPR_CE_EXPR_TAB_HH_INCLUDED
Packit a4aae4
/* Debug traces.  */
Packit a4aae4
#ifndef YYDEBUG
Packit a4aae4
# define YYDEBUG 1
Packit a4aae4
#endif
Packit a4aae4
#if YYDEBUG
Packit a4aae4
extern int ce_exprdebug;
Packit a4aae4
#endif
Packit a4aae4
/* "%code requires" blocks.  */
Packit a4aae4
#line 41 "ce_expr.yy" /* yacc.c:355  */
Packit a4aae4
Packit a4aae4
Packit a4aae4
#include "config.h"
Packit a4aae4
Packit a4aae4
#include <cassert>
Packit a4aae4
#include <cstdlib>
Packit a4aae4
#include <cstring>
Packit a4aae4
Packit a4aae4
#include <iostream>
Packit a4aae4
#include <sstream>
Packit a4aae4
#include <iterator>
Packit a4aae4
#include <string>
Packit a4aae4
#include <stack>
Packit a4aae4
Packit a4aae4
//#define DODS_DEBUG
Packit a4aae4
Packit a4aae4
#include "debug.h"
Packit a4aae4
#include "escaping.h"
Packit a4aae4
Packit a4aae4
#include "DDS.h"
Packit a4aae4
#include "ConstraintEvaluator.h"
Packit a4aae4
Packit a4aae4
#include "BaseType.h"
Packit a4aae4
Packit a4aae4
#include "Byte.h"
Packit a4aae4
#include "Int16.h"
Packit a4aae4
#include "UInt16.h"
Packit a4aae4
#include "Int32.h"
Packit a4aae4
#include "UInt32.h"
Packit a4aae4
#include "Float32.h"
Packit a4aae4
#include "Float64.h"
Packit a4aae4
#include "Str.h"
Packit a4aae4
#include "Url.h"
Packit a4aae4
#include "Array.h"
Packit a4aae4
#include "Structure.h"
Packit a4aae4
#include "Sequence.h"
Packit a4aae4
#include "Grid.h"
Packit a4aae4
Packit a4aae4
#include "Error.h"
Packit a4aae4
Packit a4aae4
#include "util.h"
Packit a4aae4
#include "parser.h"
Packit a4aae4
#include "ce_parser.h"
Packit a4aae4
#include "expr.h"
Packit a4aae4
#include "RValue.h"
Packit a4aae4
Packit a4aae4
using std::cerr;
Packit a4aae4
using std::endl;
Packit a4aae4
using namespace libdap ;
Packit a4aae4
Packit a4aae4
#define EVALUATOR(arg) (static_cast<ce_parser_arg*>(arg)->get_eval())
Packit a4aae4
#define DDS(arg) (static_cast<ce_parser_arg*>(arg)->get_dds())
Packit a4aae4
Packit a4aae4
// #define YYPARSE_PARAM arg
Packit a4aae4
Packit a4aae4
int ce_exprlex(void);		/* the scanner; see expr.lex */
Packit a4aae4
Packit a4aae4
void ce_exprerror(ce_parser_arg *arg, const string &s); 
Packit a4aae4
void ce_exprerror(ce_parser_arg *arg, const string &s, const string &s2;;
Packit a4aae4
void no_such_func(ce_parser_arg *arg, const string &name);
Packit a4aae4
void no_such_ident(ce_parser_arg *arg, const string &name, const string &word);
Packit a4aae4
Packit a4aae4
int_list *make_array_index(value &i1, value &i2, value &i3;;
Packit a4aae4
int_list *make_array_index(value &i1, value &i2;;
Packit a4aae4
int_list *make_array_index(value &i1;;
Packit a4aae4
int_list_list *make_array_indices(int_list *index);
Packit a4aae4
int_list_list *append_array_index(int_list_list *indices, int_list *index);
Packit a4aae4
Packit a4aae4
void delete_array_indices(int_list_list *indices);
Packit a4aae4
bool bracket_projection(DDS &table, const char *name, int_list_list *indices);
Packit a4aae4
Packit a4aae4
void process_array_indices(BaseType *variable, int_list_list *indices); 
Packit a4aae4
void process_grid_indices(BaseType *variable, int_list_list *indices); 
Packit a4aae4
void process_sequence_indices(BaseType *variable, int_list_list *indices);
Packit a4aae4
Packit a4aae4
/* Replace these with method calls. jhrg 8/31/06 */
Packit a4aae4
bool is_array_t(BaseType *variable);
Packit a4aae4
bool is_grid_t(BaseType *variable);
Packit a4aae4
bool is_sequence_t(BaseType *variable);
Packit a4aae4
Packit a4aae4
BaseType *make_variable(ConstraintEvaluator &eval, const value &val;;
Packit a4aae4
bool_func get_function(const ConstraintEvaluator &eval, const char *name);
Packit a4aae4
btp_func get_btp_function(const ConstraintEvaluator &eval, const char *name);
Packit a4aae4
proj_func get_proj_function(const ConstraintEvaluator &eval, const char *name);
Packit a4aae4
Packit a4aae4
template<class arg_list, class arg_type>
Packit a4aae4
arg_list make_fast_arg_list(unsigned long vector_size_hint, arg_type arg_value);
Packit a4aae4
Packit a4aae4
template<class arg_list, class arg_type>
Packit a4aae4
arg_list make_fast_arg_list(arg_list int_values, arg_type arg_value);
Packit a4aae4
Packit a4aae4
template<class t, class T>
Packit a4aae4
rvalue *build_constant_array(vector<t> *values, DDS *dds);
Packit a4aae4
Packit a4aae4
Packit a4aae4
#line 201 "ce_expr.tab.cc" /* yacc.c:355  */
Packit a4aae4
Packit a4aae4
/* Token type.  */
Packit a4aae4
#ifndef YYTOKENTYPE
Packit a4aae4
# define YYTOKENTYPE
Packit a4aae4
  enum yytokentype
Packit a4aae4
  {
Packit a4aae4
    SCAN_STR = 258,
Packit a4aae4
    SCAN_WORD = 259,
Packit a4aae4
    SCAN_EQUAL = 260,
Packit a4aae4
    SCAN_NOT_EQUAL = 261,
Packit a4aae4
    SCAN_GREATER = 262,
Packit a4aae4
    SCAN_GREATER_EQL = 263,
Packit a4aae4
    SCAN_LESS = 264,
Packit a4aae4
    SCAN_LESS_EQL = 265,
Packit a4aae4
    SCAN_REGEXP = 266,
Packit a4aae4
    SCAN_STAR = 267,
Packit a4aae4
    SCAN_HASH_BYTE = 268,
Packit a4aae4
    SCAN_HASH_INT16 = 269,
Packit a4aae4
    SCAN_HASH_UINT16 = 270,
Packit a4aae4
    SCAN_HASH_INT32 = 271,
Packit a4aae4
    SCAN_HASH_UINT32 = 272,
Packit a4aae4
    SCAN_HASH_FLOAT32 = 273,
Packit a4aae4
    SCAN_HASH_FLOAT64 = 274
Packit a4aae4
  };
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* Value type.  */
Packit a4aae4
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
Packit a4aae4
Packit a4aae4
union YYSTYPE
Packit a4aae4
{
Packit a4aae4
#line 145 "ce_expr.yy" /* yacc.c:355  */
Packit a4aae4
Packit a4aae4
    bool boolean;
Packit a4aae4
    int op;
Packit a4aae4
    char id[ID_MAX];
Packit a4aae4
    
Packit a4aae4
    libdap::dods_byte byte_value;
Packit a4aae4
    libdap::dods_int16 int16_value;
Packit a4aae4
    libdap::dods_uint16 uint16_value;
Packit a4aae4
    libdap::dods_int32 int32_value;
Packit a4aae4
    libdap::dods_uint32 uint32_value;
Packit a4aae4
    libdap::dods_float32 float32_value;
Packit a4aae4
    libdap::dods_float64 float64_value;
Packit a4aae4
    
Packit a4aae4
    libdap::byte_arg_list byte_values;
Packit a4aae4
    libdap::int16_arg_list int16_values;
Packit a4aae4
    libdap::uint16_arg_list uint16_values;
Packit a4aae4
    libdap::int32_arg_list int32_values;
Packit a4aae4
    libdap::uint32_arg_list uint32_values;
Packit a4aae4
    libdap::float32_arg_list float32_values;
Packit a4aae4
    libdap::float64_arg_list float64_values;
Packit a4aae4
    
Packit a4aae4
    libdap::value val;               // value is defined in expr.h
Packit a4aae4
Packit a4aae4
    libdap::bool_func b_func;
Packit a4aae4
    libdap::btp_func bt_func;
Packit a4aae4
Packit a4aae4
    libdap::int_list *int_l_ptr;
Packit a4aae4
    libdap::int_list_list *int_ll_ptr;
Packit a4aae4
    
Packit a4aae4
    libdap::rvalue *rval_ptr;
Packit a4aae4
    libdap::rvalue_list *r_val_l_ptr;
Packit a4aae4
Packit a4aae4
#line 266 "ce_expr.tab.cc" /* yacc.c:355  */
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
typedef union YYSTYPE YYSTYPE;
Packit a4aae4
# define YYSTYPE_IS_TRIVIAL 1
Packit a4aae4
# define YYSTYPE_IS_DECLARED 1
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
Packit a4aae4
extern YYSTYPE ce_exprlval;
Packit a4aae4
Packit a4aae4
int ce_exprparse (ce_parser_arg *arg);
Packit a4aae4
Packit a4aae4
#endif /* !YY_CE_EXPR_CE_EXPR_TAB_HH_INCLUDED  */
Packit a4aae4
Packit a4aae4
/* Copy the second part of user declarations.  */
Packit a4aae4
Packit a4aae4
#line 283 "ce_expr.tab.cc" /* yacc.c:358  */
Packit a4aae4
/* Unqualified %code blocks.  */
Packit a4aae4
#line 232 "ce_expr.yy" /* yacc.c:359  */
Packit a4aae4
Packit a4aae4
/* This global is used by the rule 'arg_length_hint' so that the hint can 
Packit a4aae4
   be used during the paraent rule's parse. See fast_int32_arg_list. */
Packit a4aae4
unsigned long arg_length_hint_value = 0;
Packit a4aae4
Packit a4aae4
#line 291 "ce_expr.tab.cc" /* yacc.c:359  */
Packit a4aae4
Packit a4aae4
#ifdef short
Packit a4aae4
# undef short
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifdef YYTYPE_UINT8
Packit a4aae4
typedef YYTYPE_UINT8 yytype_uint8;
Packit a4aae4
#else
Packit a4aae4
typedef unsigned char yytype_uint8;
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifdef YYTYPE_INT8
Packit a4aae4
typedef YYTYPE_INT8 yytype_int8;
Packit a4aae4
#else
Packit a4aae4
typedef signed char yytype_int8;
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifdef YYTYPE_UINT16
Packit a4aae4
typedef YYTYPE_UINT16 yytype_uint16;
Packit a4aae4
#else
Packit a4aae4
typedef unsigned short int yytype_uint16;
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifdef YYTYPE_INT16
Packit a4aae4
typedef YYTYPE_INT16 yytype_int16;
Packit a4aae4
#else
Packit a4aae4
typedef short int yytype_int16;
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifndef YYSIZE_T
Packit a4aae4
# ifdef __SIZE_TYPE__
Packit a4aae4
#  define YYSIZE_T __SIZE_TYPE__
Packit a4aae4
# elif defined size_t
Packit a4aae4
#  define YYSIZE_T size_t
Packit a4aae4
# elif ! defined YYSIZE_T
Packit a4aae4
#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#  define YYSIZE_T size_t
Packit a4aae4
# else
Packit a4aae4
#  define YYSIZE_T unsigned int
Packit a4aae4
# endif
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
Packit a4aae4
Packit a4aae4
#ifndef YY_
Packit a4aae4
# if defined YYENABLE_NLS && YYENABLE_NLS
Packit a4aae4
#  if ENABLE_NLS
Packit a4aae4
#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
# ifndef YY_
Packit a4aae4
#  define YY_(Msgid) Msgid
Packit a4aae4
# endif
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifndef YY_ATTRIBUTE
Packit a4aae4
# if (defined __GNUC__                                               \
Packit a4aae4
      && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__)))  \
Packit a4aae4
     || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
Packit a4aae4
#  define YY_ATTRIBUTE(Spec) __attribute__(Spec)
Packit a4aae4
# else
Packit a4aae4
#  define YY_ATTRIBUTE(Spec) /* empty */
Packit a4aae4
# endif
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifndef YY_ATTRIBUTE_PURE
Packit a4aae4
# define YY_ATTRIBUTE_PURE   YY_ATTRIBUTE ((__pure__))
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifndef YY_ATTRIBUTE_UNUSED
Packit a4aae4
# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#if !defined _Noreturn \
Packit a4aae4
     && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)
Packit a4aae4
# if defined _MSC_VER && 1200 <= _MSC_VER
Packit a4aae4
#  define _Noreturn __declspec (noreturn)
Packit a4aae4
# else
Packit a4aae4
#  define _Noreturn YY_ATTRIBUTE ((__noreturn__))
Packit a4aae4
# endif
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* Suppress unused-variable warnings by "using" E.  */
Packit a4aae4
#if ! defined lint || defined __GNUC__
Packit a4aae4
# define YYUSE(E) ((void) (E))
Packit a4aae4
#else
Packit a4aae4
# define YYUSE(E) /* empty */
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
Packit a4aae4
/* Suppress an incorrect diagnostic about yylval being uninitialized.  */
Packit a4aae4
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
Packit a4aae4
    _Pragma ("GCC diagnostic push") \
Packit a4aae4
    _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
Packit a4aae4
    _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
Packit a4aae4
# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
Packit a4aae4
    _Pragma ("GCC diagnostic pop")
Packit a4aae4
#else
Packit a4aae4
# define YY_INITIAL_VALUE(Value) Value
Packit a4aae4
#endif
Packit a4aae4
#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
Packit a4aae4
# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
Packit a4aae4
# define YY_IGNORE_MAYBE_UNINITIALIZED_END
Packit a4aae4
#endif
Packit a4aae4
#ifndef YY_INITIAL_VALUE
Packit a4aae4
# define YY_INITIAL_VALUE(Value) /* Nothing. */
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
Packit a4aae4
#if ! defined yyoverflow || YYERROR_VERBOSE
Packit a4aae4
Packit a4aae4
/* The parser invokes alloca or malloc; define the necessary symbols.  */
Packit a4aae4
Packit a4aae4
# ifdef YYSTACK_USE_ALLOCA
Packit a4aae4
#  if YYSTACK_USE_ALLOCA
Packit a4aae4
#   ifdef __GNUC__
Packit a4aae4
#    define YYSTACK_ALLOC __builtin_alloca
Packit a4aae4
#   elif defined __BUILTIN_VA_ARG_INCR
Packit a4aae4
#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#   elif defined _AIX
Packit a4aae4
#    define YYSTACK_ALLOC __alloca
Packit a4aae4
#   elif defined _MSC_VER
Packit a4aae4
#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#    define alloca _alloca
Packit a4aae4
#   else
Packit a4aae4
#    define YYSTACK_ALLOC alloca
Packit a4aae4
#    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
Packit a4aae4
#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
      /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
Packit a4aae4
#     ifndef EXIT_SUCCESS
Packit a4aae4
#      define EXIT_SUCCESS 0
Packit a4aae4
#     endif
Packit a4aae4
#    endif
Packit a4aae4
#   endif
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
# ifdef YYSTACK_ALLOC
Packit a4aae4
   /* Pacify GCC's 'empty if-body' warning.  */
Packit a4aae4
#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
Packit a4aae4
#  ifndef YYSTACK_ALLOC_MAXIMUM
Packit a4aae4
    /* The OS might guarantee only one guard page at the bottom of the stack,
Packit a4aae4
       and a page size can be as small as 4096 bytes.  So we cannot safely
Packit a4aae4
       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
Packit a4aae4
       to allow for a few compiler-allocated temporary stack slots.  */
Packit a4aae4
#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
Packit a4aae4
#  endif
Packit a4aae4
# else
Packit a4aae4
#  define YYSTACK_ALLOC YYMALLOC
Packit a4aae4
#  define YYSTACK_FREE YYFREE
Packit a4aae4
#  ifndef YYSTACK_ALLOC_MAXIMUM
Packit a4aae4
#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
Packit a4aae4
#  endif
Packit a4aae4
#  if (defined __cplusplus && ! defined EXIT_SUCCESS \
Packit a4aae4
       && ! ((defined YYMALLOC || defined malloc) \
Packit a4aae4
             && (defined YYFREE || defined free)))
Packit a4aae4
#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#   ifndef EXIT_SUCCESS
Packit a4aae4
#    define EXIT_SUCCESS 0
Packit a4aae4
#   endif
Packit a4aae4
#  endif
Packit a4aae4
#  ifndef YYMALLOC
Packit a4aae4
#   define YYMALLOC malloc
Packit a4aae4
#   if ! defined malloc && ! defined EXIT_SUCCESS
Packit a4aae4
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#   endif
Packit a4aae4
#  endif
Packit a4aae4
#  ifndef YYFREE
Packit a4aae4
#   define YYFREE free
Packit a4aae4
#   if ! defined free && ! defined EXIT_SUCCESS
Packit a4aae4
void free (void *); /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#   endif
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
Packit a4aae4
Packit a4aae4
Packit a4aae4
#if (! defined yyoverflow \
Packit a4aae4
     && (! defined __cplusplus \
Packit a4aae4
         || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
Packit a4aae4
Packit a4aae4
/* A type that is properly aligned for any stack member.  */
Packit a4aae4
union yyalloc
Packit a4aae4
{
Packit a4aae4
  yytype_int16 yyss_alloc;
Packit a4aae4
  YYSTYPE yyvs_alloc;
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
/* The size of the maximum gap between one aligned stack and the next.  */
Packit a4aae4
# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
Packit a4aae4
Packit a4aae4
/* The size of an array large to enough to hold all stacks, each with
Packit a4aae4
   N elements.  */
Packit a4aae4
# define YYSTACK_BYTES(N) \
Packit a4aae4
     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
Packit a4aae4
      + YYSTACK_GAP_MAXIMUM)
Packit a4aae4
Packit a4aae4
# define YYCOPY_NEEDED 1
Packit a4aae4
Packit a4aae4
/* Relocate STACK from its old location to the new one.  The
Packit a4aae4
   local variables YYSIZE and YYSTACKSIZE give the old and new number of
Packit a4aae4
   elements in the stack, and YYPTR gives the new location of the
Packit a4aae4
   stack.  Advance YYPTR to a properly aligned location for the next
Packit a4aae4
   stack.  */
Packit a4aae4
# define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
Packit a4aae4
    do                                                                  \
Packit a4aae4
      {                                                                 \
Packit a4aae4
        YYSIZE_T yynewbytes;                                            \
Packit a4aae4
        YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
Packit a4aae4
        Stack = &yyptr->Stack_alloc;                                    \
Packit a4aae4
        yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
Packit a4aae4
        yyptr += yynewbytes / sizeof (*yyptr);                          \
Packit a4aae4
      }                                                                 \
Packit a4aae4
    while (0)
Packit a4aae4
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#if defined YYCOPY_NEEDED && YYCOPY_NEEDED
Packit a4aae4
/* Copy COUNT objects from SRC to DST.  The source and destination do
Packit a4aae4
   not overlap.  */
Packit a4aae4
# ifndef YYCOPY
Packit a4aae4
#  if defined __GNUC__ && 1 < __GNUC__
Packit a4aae4
#   define YYCOPY(Dst, Src, Count) \
Packit a4aae4
      __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
Packit a4aae4
#  else
Packit a4aae4
#   define YYCOPY(Dst, Src, Count)              \
Packit a4aae4
      do                                        \
Packit a4aae4
        {                                       \
Packit a4aae4
          YYSIZE_T yyi;                         \
Packit a4aae4
          for (yyi = 0; yyi < (Count); yyi++)   \
Packit a4aae4
            (Dst)[yyi] = (Src)[yyi];            \
Packit a4aae4
        }                                       \
Packit a4aae4
      while (0)
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
#endif /* !YYCOPY_NEEDED */
Packit a4aae4
Packit a4aae4
/* YYFINAL -- State number of the termination state.  */
Packit a4aae4
#define YYFINAL  28
Packit a4aae4
/* YYLAST -- Last index in YYTABLE.  */
Packit a4aae4
#define YYLAST   167
Packit a4aae4
Packit a4aae4
/* YYNTOKENS -- Number of terminals.  */
Packit a4aae4
#define YYNTOKENS  29
Packit a4aae4
/* YYNNTS -- Number of nonterminals.  */
Packit a4aae4
#define YYNNTS  36
Packit a4aae4
/* YYNRULES -- Number of rules.  */
Packit a4aae4
#define YYNRULES  80
Packit a4aae4
/* YYNSTATES -- Number of states.  */
Packit a4aae4
#define YYNSTATES  149
Packit a4aae4
Packit a4aae4
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
Packit a4aae4
   by yylex, with out-of-bounds checking.  */
Packit a4aae4
#define YYUNDEFTOK  2
Packit a4aae4
#define YYMAXUTOK   274
Packit a4aae4
Packit a4aae4
#define YYTRANSLATE(YYX)                                                \
Packit a4aae4
  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
Packit a4aae4
Packit a4aae4
/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
Packit a4aae4
   as returned by yylex, without out-of-bounds checking.  */
Packit a4aae4
static const yytype_uint8 yytranslate[] =
Packit a4aae4
{
Packit a4aae4
       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,    20,     2,
Packit a4aae4
      22,    24,     2,     2,    21,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,    23,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,    27,     2,    28,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,    25,     2,    26,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
Packit a4aae4
       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
Packit a4aae4
       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
Packit a4aae4
      15,    16,    17,    18,    19
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
#if YYDEBUG
Packit a4aae4
  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
Packit a4aae4
static const yytype_uint16 yyrline[] =
Packit a4aae4
{
Packit a4aae4
       0,   241,   241,   247,   249,   249,   253,   259,   260,   266,
Packit a4aae4
     278,   282,   286,   310,   316,   322,   328,   334,   340,   346,
Packit a4aae4
     355,   366,   370,   377,   384,   388,   395,   402,   406,   413,
Packit a4aae4
     420,   424,   431,   438,   442,   449,   456,   460,   467,   474,
Packit a4aae4
     478,   485,   492,   514,   515,   521,   530,   541,   548,   562,
Packit a4aae4
     563,   573,   577,   583,   590,   599,   604,   609,   647,   671,
Packit a4aae4
     684,   690,   699,   705,   716,   721,   735,   739,   753,   762,
Packit a4aae4
     769,   781,   792,   807,   823,   824,   825,   826,   827,   828,
Packit a4aae4
     829
Packit a4aae4
};
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#if YYDEBUG || YYERROR_VERBOSE || 0
Packit a4aae4
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
Packit a4aae4
   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
Packit a4aae4
static const char *const yytname[] =
Packit a4aae4
{
Packit a4aae4
  "$end", "error", "$undefined", "SCAN_STR", "SCAN_WORD", "SCAN_EQUAL",
Packit a4aae4
  "SCAN_NOT_EQUAL", "SCAN_GREATER", "SCAN_GREATER_EQL", "SCAN_LESS",
Packit a4aae4
  "SCAN_LESS_EQL", "SCAN_REGEXP", "SCAN_STAR", "SCAN_HASH_BYTE",
Packit a4aae4
  "SCAN_HASH_INT16", "SCAN_HASH_UINT16", "SCAN_HASH_INT32",
Packit a4aae4
  "SCAN_HASH_UINT32", "SCAN_HASH_FLOAT32", "SCAN_HASH_FLOAT64", "'&'",
Packit a4aae4
  "','", "'('", "':'", "')'", "'{'", "'}'", "'['", "']'", "$accept",
Packit a4aae4
  "constraint_expr", "$@1", "projection", "proj_clause",
Packit a4aae4
  "array_const_special_form", "arg_length_hint", "fast_byte_arg_list",
Packit a4aae4
  "fast_byte_arg", "fast_int16_arg_list", "fast_int16_arg",
Packit a4aae4
  "fast_uint16_arg_list", "fast_uint16_arg", "fast_int32_arg_list",
Packit a4aae4
  "fast_int32_arg", "fast_uint32_arg_list", "fast_uint32_arg",
Packit a4aae4
  "fast_float32_arg_list", "fast_float32_arg", "fast_float64_arg_list",
Packit a4aae4
  "fast_float64_arg", "proj_function", "selection", "clause",
Packit a4aae4
  "bool_function", "r_value", "r_value_list", "arg_list", "id_or_const",
Packit a4aae4
  "array_projection_rvalue", "array_projection", "array_proj_clause",
Packit a4aae4
  "name", "array_indices", "array_index", "rel_op", YY_NULLPTR
Packit a4aae4
};
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
# ifdef YYPRINT
Packit a4aae4
/* YYTOKNUM[NUM] -- (External) token number corresponding to the
Packit a4aae4
   (internal) symbol number NUM (which must be that of a token).  */
Packit a4aae4
static const yytype_uint16 yytoknum[] =
Packit a4aae4
{
Packit a4aae4
       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
Packit a4aae4
     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
Packit a4aae4
      38,    44,    40,    58,    41,   123,   125,    91,    93
Packit a4aae4
};
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
#define YYPACT_NINF -57
Packit a4aae4
Packit a4aae4
#define yypact_value_is_default(Yystate) \
Packit a4aae4
  (!!((Yystate) == (-57)))
Packit a4aae4
Packit a4aae4
#define YYTABLE_NINF -66
Packit a4aae4
Packit a4aae4
#define yytable_value_is_error(Yytable_value) \
Packit a4aae4
  0
Packit a4aae4
Packit a4aae4
  /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
Packit a4aae4
     STATE-NUM.  */
Packit a4aae4
static const yytype_int16 yypact[] =
Packit a4aae4
{
Packit a4aae4
      49,   -57,    -5,    15,    24,    25,    34,    36,    64,   103,
Packit a4aae4
     -57,    28,    12,    60,   -57,   -57,   -57,     6,    -2,    57,
Packit a4aae4
      22,    22,    22,    22,    22,    22,    22,    74,   -57,    74,
Packit a4aae4
      81,   -57,    -2,     9,    -2,   -57,    21,   -15,   -57,   -57,
Packit a4aae4
     101,   102,   -57,   -57,    -2,   -57,   104,   105,   106,   107,
Packit a4aae4
     108,   109,   110,   -11,   114,   -57,   -57,    96,   114,   -57,
Packit a4aae4
      -2,     8,   111,   -57,    57,    57,   -57,    -2,   131,   132,
Packit a4aae4
     133,   134,   136,   137,   138,    57,    74,   -57,   -57,   -57,
Packit a4aae4
     -57,   -57,   -57,   -57,    26,    10,   -57,   -57,   119,   -57,
Packit a4aae4
     -57,    58,   -57,   -57,    59,   -57,   -57,    93,   -57,   -57,
Packit a4aae4
      94,   -57,   -57,    95,   -57,   -57,    99,   -57,   -57,   100,
Packit a4aae4
     -57,   120,   -57,    57,   -57,    27,   117,   -57,   131,   -57,
Packit a4aae4
     132,   -57,   133,   -57,   134,   -57,   136,   -57,   137,   -57,
Packit a4aae4
     138,   -57,     4,    33,    11,   -57,   -57,   -57,   -57,   -57,
Packit a4aae4
     -57,   -57,   -57,   -57,   -57,   118,   121,   -57,   -57
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
  /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
Packit a4aae4
     Performed when YYTABLE does not specify something else to do.  Zero
Packit a4aae4
     means the default is an error.  */
Packit a4aae4
static const yytype_uint8 yydefact[] =
Packit a4aae4
{
Packit a4aae4
       2,    65,    64,     0,     0,     0,     0,     0,     0,     0,
Packit a4aae4
       4,     0,     3,     7,    12,    10,    11,    60,     9,    56,
Packit a4aae4
       0,     0,     0,     0,     0,     0,     0,     0,     1,     0,
Packit a4aae4
       0,    64,    62,     0,    61,    66,    58,    57,    51,    53,
Packit a4aae4
      55,     0,    49,    52,     0,    20,     0,     0,     0,     0,
Packit a4aae4
       0,     0,     0,    57,     5,    43,    47,     0,     6,     8,
Packit a4aae4
      63,     0,     0,    67,    56,     0,    42,    59,     0,     0,
Packit a4aae4
       0,     0,     0,     0,     0,    56,     0,    74,    75,    76,
Packit a4aae4
      77,    78,    79,    80,     0,     0,    68,    69,     0,    54,
Packit a4aae4
      23,     0,    21,    26,     0,    24,    29,     0,    27,    32,
Packit a4aae4
       0,    30,    35,     0,    33,    38,     0,    36,    41,     0,
Packit a4aae4
      39,     0,    44,     0,    46,     0,     0,    50,     0,    13,
Packit a4aae4
       0,    14,     0,    15,     0,    16,     0,    17,     0,    18,
Packit a4aae4
       0,    19,    50,     0,     0,    70,    71,    22,    25,    28,
Packit a4aae4
      31,    34,    37,    40,    45,     0,     0,    72,    73
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
  /* YYPGOTO[NTERM-NUM].  */
Packit a4aae4
static const yytype_int8 yypgoto[] =
Packit a4aae4
{
Packit a4aae4
     -57,   -57,   -57,   122,   -57,     5,    87,   -57,    29,   -57,
Packit a4aae4
      30,   -57,    31,   -57,    32,   -57,    35,   -57,    20,   -57,
Packit a4aae4
      37,   -57,   125,    75,   -57,   -27,    42,   -56,   -57,   -57,
Packit a4aae4
     -57,   -57,     3,   -26,   -33,   -57
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
  /* YYDEFGOTO[NTERM-NUM].  */
Packit a4aae4
static const yytype_int8 yydefgoto[] =
Packit a4aae4
{
Packit a4aae4
      -1,    11,    27,    12,    13,    38,    46,    91,    92,    94,
Packit a4aae4
      95,    97,    98,   100,   101,   103,   104,   106,   107,   109,
Packit a4aae4
     110,    15,    54,    55,    56,    39,    40,    41,    42,    43,
Packit a4aae4
      16,    17,    44,    34,    35,    84
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
  /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
Packit a4aae4
     positive, shift that token.  If negative, reduce the rule whose
Packit a4aae4
     number is the opposite.  If YYTABLE_NINF, syntax error.  */
Packit a4aae4
static const yytype_int16 yytable[] =
Packit a4aae4
{
Packit a4aae4
      57,    63,    57,    18,   -48,    14,    60,    64,    88,     1,
Packit a4aae4
      31,    75,   -64,    61,   115,   145,   -64,    19,    67,   111,
Packit a4aae4
      32,    62,   116,   146,   -48,    33,    45,    63,    28,    36,
Packit a4aae4
      37,    85,    29,    18,    63,    14,    86,    20,    89,     3,
Packit a4aae4
       4,     5,     6,     7,     8,     9,    21,    22,   -65,    57,
Packit a4aae4
     134,   113,     1,     2,    65,   135,    23,   114,    24,   144,
Packit a4aae4
      36,    37,     3,     4,     5,     6,     7,     8,     9,    10,
Packit a4aae4
       3,     4,     5,     6,     7,     8,     9,    36,    53,   118,
Packit a4aae4
     120,    30,   119,   121,     1,     2,    25,     3,     4,     5,
Packit a4aae4
       6,     7,     8,     9,     3,     4,     5,     6,     7,     8,
Packit a4aae4
       9,    77,    78,    79,    80,    81,    82,    83,    47,    48,
Packit a4aae4
      49,    50,    51,    52,   122,   124,   126,   123,   125,   127,
Packit a4aae4
     128,   130,    65,   129,   131,    26,    66,    68,    69,    70,
Packit a4aae4
      71,    72,    73,    74,    76,    90,    93,    96,    99,    87,
Packit a4aae4
     102,   105,   108,   117,   132,   136,   147,   137,   142,   148,
Packit a4aae4
     138,   112,    59,   139,    58,   133,   140,     0,     0,     0,
Packit a4aae4
       0,   141,     0,     0,     0,     0,     0,   143
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
static const yytype_int16 yycheck[] =
Packit a4aae4
{
Packit a4aae4
      27,    34,    29,     0,     0,     0,    32,    22,    64,     3,
Packit a4aae4
       4,    22,    27,     4,     4,     4,    27,    22,    44,    75,
Packit a4aae4
      17,    12,    12,    12,    20,    27,     4,    60,     0,     3,
Packit a4aae4
       4,    23,    20,    30,    67,    30,    28,    22,    65,    13,
Packit a4aae4
      14,    15,    16,    17,    18,    19,    22,    22,    27,    76,
Packit a4aae4
      23,    25,     3,     4,    21,    28,    22,    84,    22,    26,
Packit a4aae4
       3,     4,    13,    14,    15,    16,    17,    18,    19,    20,
Packit a4aae4
      13,    14,    15,    16,    17,    18,    19,     3,     4,    21,
Packit a4aae4
      21,    21,    24,    24,     3,     4,    22,    13,    14,    15,
Packit a4aae4
      16,    17,    18,    19,    13,    14,    15,    16,    17,    18,
Packit a4aae4
      19,     5,     6,     7,     8,     9,    10,    11,    21,    22,
Packit a4aae4
      23,    24,    25,    26,    21,    21,    21,    24,    24,    24,
Packit a4aae4
      21,    21,    21,    24,    24,    22,    24,    23,    23,    23,
Packit a4aae4
      23,    23,    23,    23,    20,     4,     4,     4,     4,    28,
Packit a4aae4
       4,     4,     4,    24,    24,    28,    28,   118,   128,    28,
Packit a4aae4
     120,    76,    30,   122,    29,   113,   124,    -1,    -1,    -1,
Packit a4aae4
      -1,   126,    -1,    -1,    -1,    -1,    -1,   130
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
  /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
Packit a4aae4
     symbol of state STATE-NUM.  */
Packit a4aae4
static const yytype_uint8 yystos[] =
Packit a4aae4
{
Packit a4aae4
       0,     3,     4,    13,    14,    15,    16,    17,    18,    19,
Packit a4aae4
      20,    30,    32,    33,    34,    50,    59,    60,    61,    22,
Packit a4aae4
      22,    22,    22,    22,    22,    22,    22,    31,     0,    20,
Packit a4aae4
      21,     4,    61,    27,    62,    63,     3,     4,    34,    54,
Packit a4aae4
      55,    56,    57,    58,    61,     4,    35,    35,    35,    35,
Packit a4aae4
      35,    35,    35,     4,    51,    52,    53,    54,    51,    32,
Packit a4aae4
      62,     4,    12,    63,    22,    21,    24,    62,    23,    23,
Packit a4aae4
      23,    23,    23,    23,    23,    22,    20,     5,     6,     7,
Packit a4aae4
       8,     9,    10,    11,    64,    23,    28,    28,    56,    54,
Packit a4aae4
       4,    36,    37,     4,    38,    39,     4,    40,    41,     4,
Packit a4aae4
      42,    43,     4,    44,    45,     4,    46,    47,     4,    48,
Packit a4aae4
      49,    56,    52,    25,    54,     4,    12,    24,    21,    24,
Packit a4aae4
      21,    24,    21,    24,    21,    24,    21,    24,    21,    24,
Packit a4aae4
      21,    24,    24,    55,    23,    28,    28,    37,    39,    41,
Packit a4aae4
      43,    45,    47,    49,    26,     4,    12,    28,    28
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
  /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
Packit a4aae4
static const yytype_uint8 yyr1[] =
Packit a4aae4
{
Packit a4aae4
       0,    29,    30,    30,    31,    30,    30,    32,    32,    33,
Packit a4aae4
      33,    33,    33,    34,    34,    34,    34,    34,    34,    34,
Packit a4aae4
      35,    36,    36,    37,    38,    38,    39,    40,    40,    41,
Packit a4aae4
      42,    42,    43,    44,    44,    45,    46,    46,    47,    48,
Packit a4aae4
      48,    49,    50,    51,    51,    52,    52,    52,    53,    54,
Packit a4aae4
      54,    54,    54,    55,    55,    56,    56,    57,    57,    58,
Packit a4aae4
      59,    60,    60,    60,    61,    61,    62,    62,    63,    63,
Packit a4aae4
      63,    63,    63,    63,    64,    64,    64,    64,    64,    64,
Packit a4aae4
      64
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
  /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
Packit a4aae4
static const yytype_uint8 yyr2[] =
Packit a4aae4
{
Packit a4aae4
       0,     2,     0,     1,     0,     3,     3,     1,     3,     1,
Packit a4aae4
       1,     1,     1,     6,     6,     6,     6,     6,     6,     6,
Packit a4aae4
       1,     1,     3,     1,     1,     3,     1,     1,     3,     1,
Packit a4aae4
       1,     3,     1,     1,     3,     1,     1,     3,     1,     1,
Packit a4aae4
       3,     1,     4,     1,     3,     5,     3,     1,     4,     1,
Packit a4aae4
       4,     1,     1,     1,     3,     1,     0,     1,     1,     2,
Packit a4aae4
       1,     2,     2,     3,     1,     1,     1,     2,     3,     3,
Packit a4aae4
       5,     5,     7,     7,     1,     1,     1,     1,     1,     1,
Packit a4aae4
       1
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
Packit a4aae4
#define yyerrok         (yyerrstatus = 0)
Packit a4aae4
#define yyclearin       (yychar = YYEMPTY)
Packit a4aae4
#define YYEMPTY         (-2)
Packit a4aae4
#define YYEOF           0
Packit a4aae4
Packit a4aae4
#define YYACCEPT        goto yyacceptlab
Packit a4aae4
#define YYABORT         goto yyabortlab
Packit a4aae4
#define YYERROR         goto yyerrorlab
Packit a4aae4
Packit a4aae4
Packit a4aae4
#define YYRECOVERING()  (!!yyerrstatus)
Packit a4aae4
Packit a4aae4
#define YYBACKUP(Token, Value)                                  \
Packit a4aae4
do                                                              \
Packit a4aae4
  if (yychar == YYEMPTY)                                        \
Packit a4aae4
    {                                                           \
Packit a4aae4
      yychar = (Token);                                         \
Packit a4aae4
      yylval = (Value);                                         \
Packit a4aae4
      YYPOPSTACK (yylen);                                       \
Packit a4aae4
      yystate = *yyssp;                                         \
Packit a4aae4
      goto yybackup;                                            \
Packit a4aae4
    }                                                           \
Packit a4aae4
  else                                                          \
Packit a4aae4
    {                                                           \
Packit a4aae4
      yyerror (arg, YY_("syntax error: cannot back up")); \
Packit a4aae4
      YYERROR;                                                  \
Packit a4aae4
    }                                                           \
Packit a4aae4
while (0)
Packit a4aae4
Packit a4aae4
/* Error token number */
Packit a4aae4
#define YYTERROR        1
Packit a4aae4
#define YYERRCODE       256
Packit a4aae4
Packit a4aae4
Packit a4aae4
Packit a4aae4
/* Enable debugging if requested.  */
Packit a4aae4
#if YYDEBUG
Packit a4aae4
Packit a4aae4
# ifndef YYFPRINTF
Packit a4aae4
#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
Packit a4aae4
#  define YYFPRINTF fprintf
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
# define YYDPRINTF(Args)                        \
Packit a4aae4
do {                                            \
Packit a4aae4
  if (yydebug)                                  \
Packit a4aae4
    YYFPRINTF Args;                             \
Packit a4aae4
} while (0)
Packit a4aae4
Packit a4aae4
/* This macro is provided for backward compatibility. */
Packit a4aae4
#ifndef YY_LOCATION_PRINT
Packit a4aae4
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
Packit a4aae4
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)                    \
Packit a4aae4
do {                                                                      \
Packit a4aae4
  if (yydebug)                                                            \
Packit a4aae4
    {                                                                     \
Packit a4aae4
      YYFPRINTF (stderr, "%s ", Title);                                   \
Packit a4aae4
      yy_symbol_print (stderr,                                            \
Packit a4aae4
                  Type, Value, arg); \
Packit a4aae4
      YYFPRINTF (stderr, "\n");                                           \
Packit a4aae4
    }                                                                     \
Packit a4aae4
} while (0)
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*----------------------------------------.
Packit a4aae4
| Print this symbol's value on YYOUTPUT.  |
Packit a4aae4
`----------------------------------------*/
Packit a4aae4
Packit a4aae4
static void
Packit a4aae4
yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, ce_parser_arg *arg)
Packit a4aae4
{
Packit a4aae4
  FILE *yyo = yyoutput;
Packit a4aae4
  YYUSE (yyo);
Packit a4aae4
  YYUSE (arg);
Packit a4aae4
  if (!yyvaluep)
Packit a4aae4
    return;
Packit a4aae4
# ifdef YYPRINT
Packit a4aae4
  if (yytype < YYNTOKENS)
Packit a4aae4
    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
Packit a4aae4
# endif
Packit a4aae4
  YYUSE (yytype);
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*--------------------------------.
Packit a4aae4
| Print this symbol on YYOUTPUT.  |
Packit a4aae4
`--------------------------------*/
Packit a4aae4
Packit a4aae4
static void
Packit a4aae4
yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, ce_parser_arg *arg)
Packit a4aae4
{
Packit a4aae4
  YYFPRINTF (yyoutput, "%s %s (",
Packit a4aae4
             yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
Packit a4aae4
Packit a4aae4
  yy_symbol_value_print (yyoutput, yytype, yyvaluep, arg);
Packit a4aae4
  YYFPRINTF (yyoutput, ")");
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
/*------------------------------------------------------------------.
Packit a4aae4
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
Packit a4aae4
| TOP (included).                                                   |
Packit a4aae4
`------------------------------------------------------------------*/
Packit a4aae4
Packit a4aae4
static void
Packit a4aae4
yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
Packit a4aae4
{
Packit a4aae4
  YYFPRINTF (stderr, "Stack now");
Packit a4aae4
  for (; yybottom <= yytop; yybottom++)
Packit a4aae4
    {
Packit a4aae4
      int yybot = *yybottom;
Packit a4aae4
      YYFPRINTF (stderr, " %d", yybot);
Packit a4aae4
    }
Packit a4aae4
  YYFPRINTF (stderr, "\n");
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
# define YY_STACK_PRINT(Bottom, Top)                            \
Packit a4aae4
do {                                                            \
Packit a4aae4
  if (yydebug)                                                  \
Packit a4aae4
    yy_stack_print ((Bottom), (Top));                           \
Packit a4aae4
} while (0)
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*------------------------------------------------.
Packit a4aae4
| Report that the YYRULE is going to be reduced.  |
Packit a4aae4
`------------------------------------------------*/
Packit a4aae4
Packit a4aae4
static void
Packit a4aae4
yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, ce_parser_arg *arg)
Packit a4aae4
{
Packit a4aae4
  unsigned long int yylno = yyrline[yyrule];
Packit a4aae4
  int yynrhs = yyr2[yyrule];
Packit a4aae4
  int yyi;
Packit a4aae4
  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
Packit a4aae4
             yyrule - 1, yylno);
Packit a4aae4
  /* The symbols being reduced.  */
Packit a4aae4
  for (yyi = 0; yyi < yynrhs; yyi++)
Packit a4aae4
    {
Packit a4aae4
      YYFPRINTF (stderr, "   $%d = ", yyi + 1);
Packit a4aae4
      yy_symbol_print (stderr,
Packit a4aae4
                       yystos[yyssp[yyi + 1 - yynrhs]],
Packit a4aae4
                       &(yyvsp[(yyi + 1) - (yynrhs)])
Packit a4aae4
                                              , arg);
Packit a4aae4
      YYFPRINTF (stderr, "\n");
Packit a4aae4
    }
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
# define YY_REDUCE_PRINT(Rule)          \
Packit a4aae4
do {                                    \
Packit a4aae4
  if (yydebug)                          \
Packit a4aae4
    yy_reduce_print (yyssp, yyvsp, Rule, arg); \
Packit a4aae4
} while (0)
Packit a4aae4
Packit a4aae4
/* Nonzero means print parse trace.  It is left uninitialized so that
Packit a4aae4
   multiple parsers can coexist.  */
Packit a4aae4
int yydebug;
Packit a4aae4
#else /* !YYDEBUG */
Packit a4aae4
# define YYDPRINTF(Args)
Packit a4aae4
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
Packit a4aae4
# define YY_STACK_PRINT(Bottom, Top)
Packit a4aae4
# define YY_REDUCE_PRINT(Rule)
Packit a4aae4
#endif /* !YYDEBUG */
Packit a4aae4
Packit a4aae4
Packit a4aae4
/* YYINITDEPTH -- initial size of the parser's stacks.  */
Packit a4aae4
#ifndef YYINITDEPTH
Packit a4aae4
# define YYINITDEPTH 200
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
Packit a4aae4
   if the built-in stack extension method is used).
Packit a4aae4
Packit a4aae4
   Do not make this value too large; the results are undefined if
Packit a4aae4
   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
Packit a4aae4
   evaluated with infinite-precision integer arithmetic.  */
Packit a4aae4
Packit a4aae4
#ifndef YYMAXDEPTH
Packit a4aae4
# define YYMAXDEPTH 10000
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
Packit a4aae4
#if YYERROR_VERBOSE
Packit a4aae4
Packit a4aae4
# ifndef yystrlen
Packit a4aae4
#  if defined __GLIBC__ && defined _STRING_H
Packit a4aae4
#   define yystrlen strlen
Packit a4aae4
#  else
Packit a4aae4
/* Return the length of YYSTR.  */
Packit a4aae4
static YYSIZE_T
Packit a4aae4
yystrlen (const char *yystr)
Packit a4aae4
{
Packit a4aae4
  YYSIZE_T yylen;
Packit a4aae4
  for (yylen = 0; yystr[yylen]; yylen++)
Packit a4aae4
    continue;
Packit a4aae4
  return yylen;
Packit a4aae4
}
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
# ifndef yystpcpy
Packit a4aae4
#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
Packit a4aae4
#   define yystpcpy stpcpy
Packit a4aae4
#  else
Packit a4aae4
/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
Packit a4aae4
   YYDEST.  */
Packit a4aae4
static char *
Packit a4aae4
yystpcpy (char *yydest, const char *yysrc)
Packit a4aae4
{
Packit a4aae4
  char *yyd = yydest;
Packit a4aae4
  const char *yys = yysrc;
Packit a4aae4
Packit a4aae4
  while ((*yyd++ = *yys++) != '\0')
Packit a4aae4
    continue;
Packit a4aae4
Packit a4aae4
  return yyd - 1;
Packit a4aae4
}
Packit a4aae4
#  endif
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
# ifndef yytnamerr
Packit a4aae4
/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
Packit a4aae4
   quotes and backslashes, so that it's suitable for yyerror.  The
Packit a4aae4
   heuristic is that double-quoting is unnecessary unless the string
Packit a4aae4
   contains an apostrophe, a comma, or backslash (other than
Packit a4aae4
   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
Packit a4aae4
   null, do not copy; instead, return the length of what the result
Packit a4aae4
   would have been.  */
Packit a4aae4
static YYSIZE_T
Packit a4aae4
yytnamerr (char *yyres, const char *yystr)
Packit a4aae4
{
Packit a4aae4
  if (*yystr == '"')
Packit a4aae4
    {
Packit a4aae4
      YYSIZE_T yyn = 0;
Packit a4aae4
      char const *yyp = yystr;
Packit a4aae4
Packit a4aae4
      for (;;)
Packit a4aae4
        switch (*++yyp)
Packit a4aae4
          {
Packit a4aae4
          case '\'':
Packit a4aae4
          case ',':
Packit a4aae4
            goto do_not_strip_quotes;
Packit a4aae4
Packit a4aae4
          case '\\':
Packit a4aae4
            if (*++yyp != '\\')
Packit a4aae4
              goto do_not_strip_quotes;
Packit a4aae4
            /* Fall through.  */
Packit a4aae4
          default:
Packit a4aae4
            if (yyres)
Packit a4aae4
              yyres[yyn] = *yyp;
Packit a4aae4
            yyn++;
Packit a4aae4
            break;
Packit a4aae4
Packit a4aae4
          case '"':
Packit a4aae4
            if (yyres)
Packit a4aae4
              yyres[yyn] = '\0';
Packit a4aae4
            return yyn;
Packit a4aae4
          }
Packit a4aae4
    do_not_strip_quotes: ;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  if (! yyres)
Packit a4aae4
    return yystrlen (yystr);
Packit a4aae4
Packit a4aae4
  return yystpcpy (yyres, yystr) - yyres;
Packit a4aae4
}
Packit a4aae4
# endif
Packit a4aae4
Packit a4aae4
/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
Packit a4aae4
   about the unexpected token YYTOKEN for the state stack whose top is
Packit a4aae4
   YYSSP.
Packit a4aae4
Packit a4aae4
   Return 0 if *YYMSG was successfully written.  Return 1 if *YYMSG is
Packit a4aae4
   not large enough to hold the message.  In that case, also set
Packit a4aae4
   *YYMSG_ALLOC to the required number of bytes.  Return 2 if the
Packit a4aae4
   required number of bytes is too large to store.  */
Packit a4aae4
static int
Packit a4aae4
yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
Packit a4aae4
                yytype_int16 *yyssp, int yytoken)
Packit a4aae4
{
Packit a4aae4
  YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
Packit a4aae4
  YYSIZE_T yysize = yysize0;
Packit a4aae4
  enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
Packit a4aae4
  /* Internationalized format string. */
Packit a4aae4
  const char *yyformat = YY_NULLPTR;
Packit a4aae4
  /* Arguments of yyformat. */
Packit a4aae4
  char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
Packit a4aae4
  /* Number of reported tokens (one for the "unexpected", one per
Packit a4aae4
     "expected"). */
Packit a4aae4
  int yycount = 0;
Packit a4aae4
Packit a4aae4
  /* There are many possibilities here to consider:
Packit a4aae4
     - If this state is a consistent state with a default action, then
Packit a4aae4
       the only way this function was invoked is if the default action
Packit a4aae4
       is an error action.  In that case, don't check for expected
Packit a4aae4
       tokens because there are none.
Packit a4aae4
     - The only way there can be no lookahead present (in yychar) is if
Packit a4aae4
       this state is a consistent state with a default action.  Thus,
Packit a4aae4
       detecting the absence of a lookahead is sufficient to determine
Packit a4aae4
       that there is no unexpected or expected token to report.  In that
Packit a4aae4
       case, just report a simple "syntax error".
Packit a4aae4
     - Don't assume there isn't a lookahead just because this state is a
Packit a4aae4
       consistent state with a default action.  There might have been a
Packit a4aae4
       previous inconsistent state, consistent state with a non-default
Packit a4aae4
       action, or user semantic action that manipulated yychar.
Packit a4aae4
     - Of course, the expected token list depends on states to have
Packit a4aae4
       correct lookahead information, and it depends on the parser not
Packit a4aae4
       to perform extra reductions after fetching a lookahead from the
Packit a4aae4
       scanner and before detecting a syntax error.  Thus, state merging
Packit a4aae4
       (from LALR or IELR) and default reductions corrupt the expected
Packit a4aae4
       token list.  However, the list is correct for canonical LR with
Packit a4aae4
       one exception: it will still contain any token that will not be
Packit a4aae4
       accepted due to an error action in a later state.
Packit a4aae4
  */
Packit a4aae4
  if (yytoken != YYEMPTY)
Packit a4aae4
    {
Packit a4aae4
      int yyn = yypact[*yyssp];
Packit a4aae4
      yyarg[yycount++] = yytname[yytoken];
Packit a4aae4
      if (!yypact_value_is_default (yyn))
Packit a4aae4
        {
Packit a4aae4
          /* Start YYX at -YYN if negative to avoid negative indexes in
Packit a4aae4
             YYCHECK.  In other words, skip the first -YYN actions for
Packit a4aae4
             this state because they are default actions.  */
Packit a4aae4
          int yyxbegin = yyn < 0 ? -yyn : 0;
Packit a4aae4
          /* Stay within bounds of both yycheck and yytname.  */
Packit a4aae4
          int yychecklim = YYLAST - yyn + 1;
Packit a4aae4
          int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
Packit a4aae4
          int yyx;
Packit a4aae4
Packit a4aae4
          for (yyx = yyxbegin; yyx < yyxend; ++yyx)
Packit a4aae4
            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
Packit a4aae4
                && !yytable_value_is_error (yytable[yyx + yyn]))
Packit a4aae4
              {
Packit a4aae4
                if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
Packit a4aae4
                  {
Packit a4aae4
                    yycount = 1;
Packit a4aae4
                    yysize = yysize0;
Packit a4aae4
                    break;
Packit a4aae4
                  }
Packit a4aae4
                yyarg[yycount++] = yytname[yyx];
Packit a4aae4
                {
Packit a4aae4
                  YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
Packit a4aae4
                  if (! (yysize <= yysize1
Packit a4aae4
                         && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
Packit a4aae4
                    return 2;
Packit a4aae4
                  yysize = yysize1;
Packit a4aae4
                }
Packit a4aae4
              }
Packit a4aae4
        }
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  switch (yycount)
Packit a4aae4
    {
Packit a4aae4
# define YYCASE_(N, S)                      \
Packit a4aae4
      case N:                               \
Packit a4aae4
        yyformat = S;                       \
Packit a4aae4
      break
Packit a4aae4
      YYCASE_(0, YY_("syntax error"));
Packit a4aae4
      YYCASE_(1, YY_("syntax error, unexpected %s"));
Packit a4aae4
      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
Packit a4aae4
      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
Packit a4aae4
      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
Packit a4aae4
      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
Packit a4aae4
# undef YYCASE_
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  {
Packit a4aae4
    YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
Packit a4aae4
    if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))
Packit a4aae4
      return 2;
Packit a4aae4
    yysize = yysize1;
Packit a4aae4
  }
Packit a4aae4
Packit a4aae4
  if (*yymsg_alloc < yysize)
Packit a4aae4
    {
Packit a4aae4
      *yymsg_alloc = 2 * yysize;
Packit a4aae4
      if (! (yysize <= *yymsg_alloc
Packit a4aae4
             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
Packit a4aae4
        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
Packit a4aae4
      return 1;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  /* Avoid sprintf, as that infringes on the user's name space.
Packit a4aae4
     Don't have undefined behavior even if the translation
Packit a4aae4
     produced a string with the wrong number of "%s"s.  */
Packit a4aae4
  {
Packit a4aae4
    char *yyp = *yymsg;
Packit a4aae4
    int yyi = 0;
Packit a4aae4
    while ((*yyp = *yyformat) != '\0')
Packit a4aae4
      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
Packit a4aae4
        {
Packit a4aae4
          yyp += yytnamerr (yyp, yyarg[yyi++]);
Packit a4aae4
          yyformat += 2;
Packit a4aae4
        }
Packit a4aae4
      else
Packit a4aae4
        {
Packit a4aae4
          yyp++;
Packit a4aae4
          yyformat++;
Packit a4aae4
        }
Packit a4aae4
  }
Packit a4aae4
  return 0;
Packit a4aae4
}
Packit a4aae4
#endif /* YYERROR_VERBOSE */
Packit a4aae4
Packit a4aae4
/*-----------------------------------------------.
Packit a4aae4
| Release the memory associated to this symbol.  |
Packit a4aae4
`-----------------------------------------------*/
Packit a4aae4
Packit a4aae4
static void
Packit a4aae4
yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, ce_parser_arg *arg)
Packit a4aae4
{
Packit a4aae4
  YYUSE (yyvaluep);
Packit a4aae4
  YYUSE (arg);
Packit a4aae4
  if (!yymsg)
Packit a4aae4
    yymsg = "Deleting";
Packit a4aae4
  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
Packit a4aae4
Packit a4aae4
  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
Packit a4aae4
  YYUSE (yytype);
Packit a4aae4
  YY_IGNORE_MAYBE_UNINITIALIZED_END
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
Packit a4aae4
Packit a4aae4
Packit a4aae4
/* The lookahead symbol.  */
Packit a4aae4
int yychar;
Packit a4aae4
Packit a4aae4
/* The semantic value of the lookahead symbol.  */
Packit a4aae4
YYSTYPE yylval;
Packit a4aae4
/* Number of syntax errors so far.  */
Packit a4aae4
int yynerrs;
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*----------.
Packit a4aae4
| yyparse.  |
Packit a4aae4
`----------*/
Packit a4aae4
Packit a4aae4
int
Packit a4aae4
yyparse (ce_parser_arg *arg)
Packit a4aae4
{
Packit a4aae4
    int yystate;
Packit a4aae4
    /* Number of tokens to shift before error messages enabled.  */
Packit a4aae4
    int yyerrstatus;
Packit a4aae4
Packit a4aae4
    /* The stacks and their tools:
Packit a4aae4
       'yyss': related to states.
Packit a4aae4
       'yyvs': related to semantic values.
Packit a4aae4
Packit a4aae4
       Refer to the stacks through separate pointers, to allow yyoverflow
Packit a4aae4
       to reallocate them elsewhere.  */
Packit a4aae4
Packit a4aae4
    /* The state stack.  */
Packit a4aae4
    yytype_int16 yyssa[YYINITDEPTH];
Packit a4aae4
    yytype_int16 *yyss;
Packit a4aae4
    yytype_int16 *yyssp;
Packit a4aae4
Packit a4aae4
    /* The semantic value stack.  */
Packit a4aae4
    YYSTYPE yyvsa[YYINITDEPTH];
Packit a4aae4
    YYSTYPE *yyvs;
Packit a4aae4
    YYSTYPE *yyvsp;
Packit a4aae4
Packit a4aae4
    YYSIZE_T yystacksize;
Packit a4aae4
Packit a4aae4
  int yyn;
Packit a4aae4
  int yyresult;
Packit a4aae4
  /* Lookahead token as an internal (translated) token number.  */
Packit a4aae4
  int yytoken = 0;
Packit a4aae4
  /* The variables used to return semantic value and location from the
Packit a4aae4
     action routines.  */
Packit a4aae4
  YYSTYPE yyval;
Packit a4aae4
Packit a4aae4
#if YYERROR_VERBOSE
Packit a4aae4
  /* Buffer for error messages, and its allocated size.  */
Packit a4aae4
  char yymsgbuf[128];
Packit a4aae4
  char *yymsg = yymsgbuf;
Packit a4aae4
  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
Packit a4aae4
Packit a4aae4
  /* The number of symbols on the RHS of the reduced rule.
Packit a4aae4
     Keep to zero when no symbol should be popped.  */
Packit a4aae4
  int yylen = 0;
Packit a4aae4
Packit a4aae4
  yyssp = yyss = yyssa;
Packit a4aae4
  yyvsp = yyvs = yyvsa;
Packit a4aae4
  yystacksize = YYINITDEPTH;
Packit a4aae4
Packit a4aae4
  YYDPRINTF ((stderr, "Starting parse\n"));
Packit a4aae4
Packit a4aae4
  yystate = 0;
Packit a4aae4
  yyerrstatus = 0;
Packit a4aae4
  yynerrs = 0;
Packit a4aae4
  yychar = YYEMPTY; /* Cause a token to be read.  */
Packit a4aae4
  goto yysetstate;
Packit a4aae4
Packit a4aae4
/*------------------------------------------------------------.
Packit a4aae4
| yynewstate -- Push a new state, which is found in yystate.  |
Packit a4aae4
`------------------------------------------------------------*/
Packit a4aae4
 yynewstate:
Packit a4aae4
  /* In all cases, when you get here, the value and location stacks
Packit a4aae4
     have just been pushed.  So pushing a state here evens the stacks.  */
Packit a4aae4
  yyssp++;
Packit a4aae4
Packit a4aae4
 yysetstate:
Packit a4aae4
  *yyssp = yystate;
Packit a4aae4
Packit a4aae4
  if (yyss + yystacksize - 1 <= yyssp)
Packit a4aae4
    {
Packit a4aae4
      /* Get the current used size of the three stacks, in elements.  */
Packit a4aae4
      YYSIZE_T yysize = yyssp - yyss + 1;
Packit a4aae4
Packit a4aae4
#ifdef yyoverflow
Packit a4aae4
      {
Packit a4aae4
        /* Give user a chance to reallocate the stack.  Use copies of
Packit a4aae4
           these so that the &'s don't force the real ones into
Packit a4aae4
           memory.  */
Packit a4aae4
        YYSTYPE *yyvs1 = yyvs;
Packit a4aae4
        yytype_int16 *yyss1 = yyss;
Packit a4aae4
Packit a4aae4
        /* Each stack pointer address is followed by the size of the
Packit a4aae4
           data in use in that stack, in bytes.  This used to be a
Packit a4aae4
           conditional around just the two extra args, but that might
Packit a4aae4
           be undefined if yyoverflow is a macro.  */
Packit a4aae4
        yyoverflow (YY_("memory exhausted"),
Packit a4aae4
                    &yyss1, yysize * sizeof (*yyssp),
Packit a4aae4
                    &yyvs1, yysize * sizeof (*yyvsp),
Packit a4aae4
                    &yystacksize);
Packit a4aae4
Packit a4aae4
        yyss = yyss1;
Packit a4aae4
        yyvs = yyvs1;
Packit a4aae4
      }
Packit a4aae4
#else /* no yyoverflow */
Packit a4aae4
# ifndef YYSTACK_RELOCATE
Packit a4aae4
      goto yyexhaustedlab;
Packit a4aae4
# else
Packit a4aae4
      /* Extend the stack our own way.  */
Packit a4aae4
      if (YYMAXDEPTH <= yystacksize)
Packit a4aae4
        goto yyexhaustedlab;
Packit a4aae4
      yystacksize *= 2;
Packit a4aae4
      if (YYMAXDEPTH < yystacksize)
Packit a4aae4
        yystacksize = YYMAXDEPTH;
Packit a4aae4
Packit a4aae4
      {
Packit a4aae4
        yytype_int16 *yyss1 = yyss;
Packit a4aae4
        union yyalloc *yyptr =
Packit a4aae4
          (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
Packit a4aae4
        if (! yyptr)
Packit a4aae4
          goto yyexhaustedlab;
Packit a4aae4
        YYSTACK_RELOCATE (yyss_alloc, yyss);
Packit a4aae4
        YYSTACK_RELOCATE (yyvs_alloc, yyvs);
Packit a4aae4
#  undef YYSTACK_RELOCATE
Packit a4aae4
        if (yyss1 != yyssa)
Packit a4aae4
          YYSTACK_FREE (yyss1);
Packit a4aae4
      }
Packit a4aae4
# endif
Packit a4aae4
#endif /* no yyoverflow */
Packit a4aae4
Packit a4aae4
      yyssp = yyss + yysize - 1;
Packit a4aae4
      yyvsp = yyvs + yysize - 1;
Packit a4aae4
Packit a4aae4
      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
Packit a4aae4
                  (unsigned long int) yystacksize));
Packit a4aae4
Packit a4aae4
      if (yyss + yystacksize - 1 <= yyssp)
Packit a4aae4
        YYABORT;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
Packit a4aae4
Packit a4aae4
  if (yystate == YYFINAL)
Packit a4aae4
    YYACCEPT;
Packit a4aae4
Packit a4aae4
  goto yybackup;
Packit a4aae4
Packit a4aae4
/*-----------.
Packit a4aae4
| yybackup.  |
Packit a4aae4
`-----------*/
Packit a4aae4
yybackup:
Packit a4aae4
Packit a4aae4
  /* Do appropriate processing given the current state.  Read a
Packit a4aae4
     lookahead token if we need one and don't already have one.  */
Packit a4aae4
Packit a4aae4
  /* First try to decide what to do without reference to lookahead token.  */
Packit a4aae4
  yyn = yypact[yystate];
Packit a4aae4
  if (yypact_value_is_default (yyn))
Packit a4aae4
    goto yydefault;
Packit a4aae4
Packit a4aae4
  /* Not known => get a lookahead token if don't already have one.  */
Packit a4aae4
Packit a4aae4
  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
Packit a4aae4
  if (yychar == YYEMPTY)
Packit a4aae4
    {
Packit a4aae4
      YYDPRINTF ((stderr, "Reading a token: "));
Packit a4aae4
      yychar = yylex ();
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  if (yychar <= YYEOF)
Packit a4aae4
    {
Packit a4aae4
      yychar = yytoken = YYEOF;
Packit a4aae4
      YYDPRINTF ((stderr, "Now at end of input.\n"));
Packit a4aae4
    }
Packit a4aae4
  else
Packit a4aae4
    {
Packit a4aae4
      yytoken = YYTRANSLATE (yychar);
Packit a4aae4
      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  /* If the proper action on seeing token YYTOKEN is to reduce or to
Packit a4aae4
     detect an error, take that action.  */
Packit a4aae4
  yyn += yytoken;
Packit a4aae4
  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
Packit a4aae4
    goto yydefault;
Packit a4aae4
  yyn = yytable[yyn];
Packit a4aae4
  if (yyn <= 0)
Packit a4aae4
    {
Packit a4aae4
      if (yytable_value_is_error (yyn))
Packit a4aae4
        goto yyerrlab;
Packit a4aae4
      yyn = -yyn;
Packit a4aae4
      goto yyreduce;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  /* Count tokens shifted since error; after three, turn off error
Packit a4aae4
     status.  */
Packit a4aae4
  if (yyerrstatus)
Packit a4aae4
    yyerrstatus--;
Packit a4aae4
Packit a4aae4
  /* Shift the lookahead token.  */
Packit a4aae4
  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
Packit a4aae4
Packit a4aae4
  /* Discard the shifted token.  */
Packit a4aae4
  yychar = YYEMPTY;
Packit a4aae4
Packit a4aae4
  yystate = yyn;
Packit a4aae4
  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
Packit a4aae4
  *++yyvsp = yylval;
Packit a4aae4
  YY_IGNORE_MAYBE_UNINITIALIZED_END
Packit a4aae4
Packit a4aae4
  goto yynewstate;
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*-----------------------------------------------------------.
Packit a4aae4
| yydefault -- do the default action for the current state.  |
Packit a4aae4
`-----------------------------------------------------------*/
Packit a4aae4
yydefault:
Packit a4aae4
  yyn = yydefact[yystate];
Packit a4aae4
  if (yyn == 0)
Packit a4aae4
    goto yyerrlab;
Packit a4aae4
  goto yyreduce;
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*-----------------------------.
Packit a4aae4
| yyreduce -- Do a reduction.  |
Packit a4aae4
`-----------------------------*/
Packit a4aae4
yyreduce:
Packit a4aae4
  /* yyn is the number of a rule to reduce with.  */
Packit a4aae4
  yylen = yyr2[yyn];
Packit a4aae4
Packit a4aae4
  /* If YYLEN is nonzero, implement the default value of the action:
Packit a4aae4
     '$$ = $1'.
Packit a4aae4
Packit a4aae4
     Otherwise, the following line sets YYVAL to garbage.
Packit a4aae4
     This behavior is undocumented and Bison
Packit a4aae4
     users should not rely upon it.  Assigning to YYVAL
Packit a4aae4
     unconditionally makes the parser a bit smaller, and it avoids a
Packit a4aae4
     GCC warning that YYVAL may be used uninitialized.  */
Packit a4aae4
  yyval = yyvsp[1-yylen];
Packit a4aae4
Packit a4aae4
Packit a4aae4
  YY_REDUCE_PRINT (yyn);
Packit a4aae4
  switch (yyn)
Packit a4aae4
    {
Packit a4aae4
        case 2:
Packit a4aae4
#line 241 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
             DBG(cerr << "Mark all variables" << endl);
Packit a4aae4
		     DDS(arg)->mark_all(true);
Packit a4aae4
		     (yyval.boolean) = true;
Packit a4aae4
		 }
Packit a4aae4
#line 1484 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 4:
Packit a4aae4
#line 249 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    { DDS(arg)->mark_all(true); }
Packit a4aae4
#line 1490 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 5:
Packit a4aae4
#line 250 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    { 
Packit a4aae4
		     (yyval.boolean) = (yyvsp[0].boolean);
Packit a4aae4
		 }
Packit a4aae4
#line 1498 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 6:
Packit a4aae4
#line 254 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		     (yyval.boolean) = (yyvsp[-2].boolean) && (yyvsp[0].boolean);
Packit a4aae4
		 }
Packit a4aae4
#line 1506 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 8:
Packit a4aae4
#line 261 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		     (yyval.boolean) = (yyvsp[-2].boolean) && (yyvsp[0].boolean);
Packit a4aae4
		 }
Packit a4aae4
#line 1514 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 9:
Packit a4aae4
#line 267 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		     BaseType *var = DDS(arg)->var((yyvsp[0].id));
Packit a4aae4
		     if (var) {
Packit a4aae4
			     DBG(cerr << "Marking " << (yyvsp[0].id) << endl);
Packit a4aae4
			     (yyval.boolean) = DDS(arg)->mark((yyvsp[0].id), true);
Packit a4aae4
			     DBG(cerr << "result: " << (yyval.boolean) << endl);
Packit a4aae4
		     }
Packit a4aae4
		     else {
Packit a4aae4
			     no_such_ident(arg, (yyvsp[0].id), "identifier");
Packit a4aae4
		     }
Packit a4aae4
		}
Packit a4aae4
#line 1530 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 10:
Packit a4aae4
#line 279 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    (yyval.boolean) = (yyvsp[0].boolean);
Packit a4aae4
		}
Packit a4aae4
#line 1538 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 11:
Packit a4aae4
#line 283 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    (yyval.boolean) = (yyvsp[0].boolean);
Packit a4aae4
		}
Packit a4aae4
#line 1546 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 12:
Packit a4aae4
#line 287 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            Array *array = dynamic_cast<Array*>((yyvsp[0].rval_ptr)->bvalue(*DDS(arg)));
Packit a4aae4
            if (array) { 
Packit a4aae4
                /* When the special form appears here (not as a function argument)
Packit a4aae4
                set send_p so the data will be sent and add it to the DDS. This 
Packit a4aae4
                streamlines testing (and is likely what is intended). */
Packit a4aae4
                
Packit a4aae4
                array->set_send_p(true);
Packit a4aae4
                DDS(arg)->add_var_nocopy(array);
Packit a4aae4
                
Packit a4aae4
                return true;
Packit a4aae4
            }
Packit a4aae4
            else {
Packit a4aae4
                ce_exprerror(arg, "Could not create the anonymous vector using the # special form");
Packit a4aae4
                return false;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
#line 1568 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 13:
Packit a4aae4
#line 311 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = build_constant_array<dods_byte, Byte>((yyvsp[-1].byte_values), DDS(arg));
Packit a4aae4
        }
Packit a4aae4
#line 1576 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 14:
Packit a4aae4
#line 317 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = build_constant_array<dods_int16, Int16>((yyvsp[-1].int16_values), DDS(arg));
Packit a4aae4
        }
Packit a4aae4
#line 1584 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 15:
Packit a4aae4
#line 323 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = build_constant_array<dods_uint16, UInt16>((yyvsp[-1].uint16_values), DDS(arg));
Packit a4aae4
        }
Packit a4aae4
#line 1592 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 16:
Packit a4aae4
#line 329 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = build_constant_array<dods_int32, Int32>((yyvsp[-1].int32_values), DDS(arg));
Packit a4aae4
        }
Packit a4aae4
#line 1600 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 17:
Packit a4aae4
#line 335 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = build_constant_array<dods_uint32, UInt32>((yyvsp[-1].uint32_values), DDS(arg));
Packit a4aae4
        }
Packit a4aae4
#line 1608 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 18:
Packit a4aae4
#line 341 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = build_constant_array<dods_float32, Float32>((yyvsp[-1].float32_values), DDS(arg));
Packit a4aae4
        }
Packit a4aae4
#line 1616 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 19:
Packit a4aae4
#line 347 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = build_constant_array<dods_float64, Float64>((yyvsp[-1].float64_values), DDS(arg));
Packit a4aae4
        }
Packit a4aae4
#line 1624 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 20:
Packit a4aae4
#line 356 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              if (!check_int32((yyvsp[0].id)))
Packit a4aae4
                  throw Error(malformed_expr, "$<type>(hint, value, ...) special form expected hint to be an integer");
Packit a4aae4
                   
Packit a4aae4
              arg_length_hint_value = atoi((yyvsp[0].id));
Packit a4aae4
              (yyval.boolean) = true;
Packit a4aae4
          }
Packit a4aae4
#line 1636 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 21:
Packit a4aae4
#line 367 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.byte_values) = make_fast_arg_list<byte_arg_list, dods_byte>(arg_length_hint_value, (yyvsp[0].byte_value));
Packit a4aae4
          }
Packit a4aae4
#line 1644 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 22:
Packit a4aae4
#line 371 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.byte_values) = make_fast_arg_list<byte_arg_list, dods_byte>((yyvsp[-2].byte_values), (yyvsp[0].byte_value));
Packit a4aae4
          }
Packit a4aae4
#line 1652 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 23:
Packit a4aae4
#line 378 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.byte_value) = strtol((yyvsp[0].id), 0, 0);
Packit a4aae4
          }
Packit a4aae4
#line 1660 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 24:
Packit a4aae4
#line 385 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.int16_values) = make_fast_arg_list<int16_arg_list, dods_int16>(arg_length_hint_value, (yyvsp[0].int16_value));
Packit a4aae4
          }
Packit a4aae4
#line 1668 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 25:
Packit a4aae4
#line 389 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.int16_values) = make_fast_arg_list<int16_arg_list, dods_int16>((yyvsp[-2].int16_values), (yyvsp[0].int16_value));
Packit a4aae4
          }
Packit a4aae4
#line 1676 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 26:
Packit a4aae4
#line 396 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.int16_value) = strtol((yyvsp[0].id), 0, 0);
Packit a4aae4
          }
Packit a4aae4
#line 1684 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 27:
Packit a4aae4
#line 403 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.uint16_values) = make_fast_arg_list<uint16_arg_list, dods_uint16>(arg_length_hint_value, (yyvsp[0].uint16_value));
Packit a4aae4
          }
Packit a4aae4
#line 1692 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 28:
Packit a4aae4
#line 407 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.uint16_values) = make_fast_arg_list<uint16_arg_list, dods_uint16>((yyvsp[-2].uint16_values), (yyvsp[0].uint16_value));
Packit a4aae4
          }
Packit a4aae4
#line 1700 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 29:
Packit a4aae4
#line 414 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.uint16_value) = strtoul((yyvsp[0].id), 0, 0);
Packit a4aae4
          }
Packit a4aae4
#line 1708 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 30:
Packit a4aae4
#line 421 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.int32_values) = make_fast_arg_list<int32_arg_list, dods_int32>(arg_length_hint_value, (yyvsp[0].int32_value));
Packit a4aae4
          }
Packit a4aae4
#line 1716 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 31:
Packit a4aae4
#line 425 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.int32_values) = make_fast_arg_list<int32_arg_list, dods_int32>((yyvsp[-2].int32_values), (yyvsp[0].int32_value));
Packit a4aae4
          }
Packit a4aae4
#line 1724 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 32:
Packit a4aae4
#line 432 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.int32_value) = strtol((yyvsp[0].id), 0, 0);
Packit a4aae4
          }
Packit a4aae4
#line 1732 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 33:
Packit a4aae4
#line 439 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.uint32_values) = make_fast_arg_list<uint32_arg_list, dods_uint32>(arg_length_hint_value, (yyvsp[0].uint32_value));
Packit a4aae4
          }
Packit a4aae4
#line 1740 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 34:
Packit a4aae4
#line 443 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.uint32_values) = make_fast_arg_list<uint32_arg_list, dods_uint32>((yyvsp[-2].uint32_values), (yyvsp[0].uint32_value));
Packit a4aae4
          }
Packit a4aae4
#line 1748 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 35:
Packit a4aae4
#line 450 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.uint32_value) = strtoul((yyvsp[0].id), 0, 0);
Packit a4aae4
          }
Packit a4aae4
#line 1756 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 36:
Packit a4aae4
#line 457 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.float32_values) = make_fast_arg_list<float32_arg_list, dods_float32>(arg_length_hint_value, (yyvsp[0].float32_value));
Packit a4aae4
          }
Packit a4aae4
#line 1764 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 37:
Packit a4aae4
#line 461 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.float32_values) = make_fast_arg_list<float32_arg_list, dods_float32>((yyvsp[-2].float32_values), (yyvsp[0].float32_value));
Packit a4aae4
          }
Packit a4aae4
#line 1772 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 38:
Packit a4aae4
#line 468 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.float32_value) = strtof((yyvsp[0].id), 0);
Packit a4aae4
          }
Packit a4aae4
#line 1780 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 39:
Packit a4aae4
#line 475 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.float64_values) = make_fast_arg_list<float64_arg_list, dods_float64>(arg_length_hint_value, (yyvsp[0].float64_value));
Packit a4aae4
          }
Packit a4aae4
#line 1788 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 40:
Packit a4aae4
#line 479 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.float64_values) = make_fast_arg_list<float64_arg_list, dods_float64>((yyvsp[-2].float64_values), (yyvsp[0].float64_value));
Packit a4aae4
          }
Packit a4aae4
#line 1796 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 41:
Packit a4aae4
#line 486 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
              (yyval.float64_value) = strtod((yyvsp[0].id), 0);
Packit a4aae4
          }
Packit a4aae4
#line 1804 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 42:
Packit a4aae4
#line 493 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    proj_func p_f = 0;
Packit a4aae4
		    btp_func f = 0;
Packit a4aae4
Packit a4aae4
		    if ((f = get_btp_function(*(EVALUATOR(arg)), (yyvsp[-3].id)))) {
Packit a4aae4
			    EVALUATOR(arg)->append_clause(f, (yyvsp[-1].r_val_l_ptr));
Packit a4aae4
			    (yyval.boolean) = true;
Packit a4aae4
		    }
Packit a4aae4
		    else if ((p_f = get_proj_function(*(EVALUATOR(arg)), (yyvsp[-3].id)))) { 
Packit a4aae4
		        DDS &dds = dynamic_cast<DDS&>(*(DDS(arg)));
Packit a4aae4
			    BaseType **args = build_btp_args( (yyvsp[-1].r_val_l_ptr), dds );
Packit a4aae4
			    (*p_f)(((yyvsp[-1].r_val_l_ptr)) ? (yyvsp[-1].r_val_l_ptr)->size():0, args, dds, *(EVALUATOR(arg)));
Packit a4aae4
			    delete[] args;
Packit a4aae4
			    (yyval.boolean) = true;
Packit a4aae4
		    }
Packit a4aae4
		    else {
Packit a4aae4
			    no_such_func(arg, (yyvsp[-3].id));
Packit a4aae4
		    }
Packit a4aae4
		}
Packit a4aae4
#line 1828 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 44:
Packit a4aae4
#line 516 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    (yyval.boolean) = (yyvsp[-2].boolean) && (yyvsp[0].boolean);
Packit a4aae4
		}
Packit a4aae4
#line 1836 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 45:
Packit a4aae4
#line 522 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    if ((yyvsp[-4].rval_ptr)) {
Packit a4aae4
			EVALUATOR(arg)->append_clause((yyvsp[-3].op), (yyvsp[-4].rval_ptr), (yyvsp[-1].r_val_l_ptr));
Packit a4aae4
			(yyval.boolean) = true;
Packit a4aae4
		    }
Packit a4aae4
		    else
Packit a4aae4
			(yyval.boolean) = false;
Packit a4aae4
		}
Packit a4aae4
#line 1849 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 46:
Packit a4aae4
#line 531 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    if ((yyvsp[-2].rval_ptr)) {
Packit a4aae4
			rvalue_list *rv = new rvalue_list;
Packit a4aae4
			rv->push_back((yyvsp[0].rval_ptr));
Packit a4aae4
			EVALUATOR(arg)->append_clause((yyvsp[-1].op), (yyvsp[-2].rval_ptr), rv);
Packit a4aae4
			(yyval.boolean) = true;
Packit a4aae4
		    }
Packit a4aae4
		    else
Packit a4aae4
			(yyval.boolean) = false;
Packit a4aae4
		}
Packit a4aae4
#line 1864 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 47:
Packit a4aae4
#line 542 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    (yyval.boolean) = (yyvsp[0].boolean);
Packit a4aae4
		}
Packit a4aae4
#line 1872 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 48:
Packit a4aae4
#line 549 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		   bool_func b_func = get_function((*EVALUATOR(arg)), (yyvsp[-3].id));
Packit a4aae4
		   if (!b_func) {
Packit a4aae4
		       no_such_func(arg, (yyvsp[-3].id));
Packit a4aae4
		   }
Packit a4aae4
		   else {
Packit a4aae4
		       EVALUATOR(arg)->append_clause(b_func, (yyvsp[-1].r_val_l_ptr));
Packit a4aae4
		       (yyval.boolean) = true;
Packit a4aae4
		   }
Packit a4aae4
	       }
Packit a4aae4
#line 1887 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 50:
Packit a4aae4
#line 564 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    btp_func func = get_btp_function((*EVALUATOR(arg)), (yyvsp[-3].id));
Packit a4aae4
		    if (func) {
Packit a4aae4
			    (yyval.rval_ptr) = new rvalue(func, (yyvsp[-1].r_val_l_ptr));
Packit a4aae4
		    } 
Packit a4aae4
		    else { 
Packit a4aae4
			    no_such_func(arg, (yyvsp[-3].id));
Packit a4aae4
		    }
Packit a4aae4
		}
Packit a4aae4
#line 1901 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 51:
Packit a4aae4
#line 574 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = (yyvsp[0].rval_ptr);
Packit a4aae4
        }
Packit a4aae4
#line 1909 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 52:
Packit a4aae4
#line 578 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
            (yyval.rval_ptr) = (yyvsp[0].rval_ptr);
Packit a4aae4
        }
Packit a4aae4
#line 1917 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 53:
Packit a4aae4
#line 584 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    if ((yyvsp[0].rval_ptr))
Packit a4aae4
			    (yyval.r_val_l_ptr) = make_rvalue_list((yyvsp[0].rval_ptr));
Packit a4aae4
		    else
Packit a4aae4
			    (yyval.r_val_l_ptr) = 0;
Packit a4aae4
		}
Packit a4aae4
#line 1928 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 54:
Packit a4aae4
#line 591 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    if ((yyvsp[-2].r_val_l_ptr) && (yyvsp[0].rval_ptr))
Packit a4aae4
			    (yyval.r_val_l_ptr) = append_rvalue_list((yyvsp[-2].r_val_l_ptr), (yyvsp[0].rval_ptr));
Packit a4aae4
		    else
Packit a4aae4
			    (yyval.r_val_l_ptr) = 0;
Packit a4aae4
		}
Packit a4aae4
#line 1939 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 55:
Packit a4aae4
#line 600 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {  
Packit a4aae4
		      (yyval.r_val_l_ptr) = (yyvsp[0].r_val_l_ptr);
Packit a4aae4
	      }
Packit a4aae4
#line 1947 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 56:
Packit a4aae4
#line 604 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    { 
Packit a4aae4
		      (yyval.r_val_l_ptr) = 0; 
Packit a4aae4
	      }
Packit a4aae4
#line 1955 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 57:
Packit a4aae4
#line 610 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    { 
Packit a4aae4
		    BaseType *btp = DDS(arg)->var(www2id((yyvsp[0].id)));
Packit a4aae4
		    if (btp) {
Packit a4aae4
                btp->set_in_selection(true);
Packit a4aae4
                (yyval.rval_ptr) = new rvalue(btp);
Packit a4aae4
		    }
Packit a4aae4
		    else {
Packit a4aae4
			    value new_val;
Packit a4aae4
			    string name_tmp;
Packit a4aae4
			    if (check_int32((yyvsp[0].id))) {
Packit a4aae4
			        new_val.type = dods_int32_c;
Packit a4aae4
			        new_val.v.i = atoi((yyvsp[0].id));
Packit a4aae4
			    }
Packit a4aae4
			    else if (check_uint32((yyvsp[0].id))) {
Packit a4aae4
			        new_val.type = dods_uint32_c;
Packit a4aae4
			        new_val.v.ui = atoi((yyvsp[0].id));
Packit a4aae4
			    }
Packit a4aae4
			    else if (check_float64((yyvsp[0].id))) {
Packit a4aae4
			        new_val.type = dods_float64_c;
Packit a4aae4
			        new_val.v.f = atof((yyvsp[0].id));
Packit a4aae4
			    }
Packit a4aae4
			    else {
Packit a4aae4
			        new_val.type = dods_str_c;
Packit a4aae4
				// The 'new' here was used because www2id() modifies the
Packit a4aae4
				// std::string arg in place but 'value' holds a string*.
Packit a4aae4
			        // new_val.v.s = new string(www2id($1));
Packit a4aae4
				// I replcaed this with a local tmp to avoid the dynamic
Packit a4aae4
				// allocation and the need to call delete. This was part of
Packit a4aae4
				// the fix for ticket 2240. jhrg 7/30/14
Packit a4aae4
				name_tmp = (yyvsp[0].id);
Packit a4aae4
				name_tmp = www2id(name_tmp);
Packit a4aae4
				new_val.v.s = &name_tmp;
Packit a4aae4
			    }
Packit a4aae4
			    BaseType *btp = make_variable((*EVALUATOR(arg)), new_val);
Packit a4aae4
			    (yyval.rval_ptr) = new rvalue(btp);
Packit a4aae4
		    }
Packit a4aae4
		}
Packit a4aae4
#line 1997 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 58:
Packit a4aae4
#line 648 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
                    if ((yyvsp[0].val).type != dods_str_c || (yyvsp[0].val).v.s == 0 || (yyvsp[0].val).v.s->empty())
Packit a4aae4
                        ce_exprerror(arg, "Malformed string", "");
Packit a4aae4
                        
Packit a4aae4
                    BaseType *var = DDS(arg)->var(www2id(*((yyvsp[0].val).v.s)));
Packit a4aae4
                    if (var) {
Packit a4aae4
                        (yyval.rval_ptr) = new rvalue(var);
Packit a4aae4
                    }
Packit a4aae4
                    else {
Packit a4aae4
                        var = make_variable((*EVALUATOR(arg)), (yyvsp[0].val)); 
Packit a4aae4
                        (yyval.rval_ptr) = new rvalue(var);
Packit a4aae4
                    }
Packit a4aae4
		    // When the scanner (ce_expr.lex) returns the SCAN_STR token type
Packit a4aae4
		    // it makes a local copy of the string in a new std::string object
Packit a4aae4
		    // that we must delete. Fix for a bug report by Aron.Bartle@mechdyne.com
Packit a4aae4
		    // See ticket 2240. jhrg 7/30/14
Packit a4aae4
		    delete (yyvsp[0].val).v.s;
Packit a4aae4
                }
Packit a4aae4
#line 2020 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 59:
Packit a4aae4
#line 672 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
                    if (!bracket_projection((*DDS(arg)), (yyvsp[-1].id), (yyvsp[0].int_ll_ptr)))
Packit a4aae4
                      no_such_ident(arg, (yyvsp[-1].id), "array, grid or sequence");
Packit a4aae4
                    
Packit a4aae4
                    // strncpy($$, $1, ID_MAX-1);
Packit a4aae4
                    // $$[ID_MAX-1] = '\0';
Packit a4aae4
Packit a4aae4
                    DDS(arg)->mark((yyvsp[-1].id), true);
Packit a4aae4
                    (yyval.rval_ptr) = new rvalue(DDS(arg)->var((yyvsp[-1].id)));
Packit a4aae4
                }
Packit a4aae4
#line 2035 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 60:
Packit a4aae4
#line 685 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
                    (yyval.boolean) = (*DDS(arg)).mark((yyvsp[0].id), true);
Packit a4aae4
                }
Packit a4aae4
#line 2043 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 61:
Packit a4aae4
#line 691 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
                    //string name = www2id($1);
Packit a4aae4
                    if (!bracket_projection((*DDS(arg)), (yyvsp[-1].id), (yyvsp[0].int_ll_ptr)))
Packit a4aae4
                      no_such_ident(arg, (yyvsp[-1].id), "array, grid or sequence");
Packit a4aae4
                    
Packit a4aae4
                    strncpy((yyval.id), (yyvsp[-1].id), ID_MAX-1);
Packit a4aae4
                    (yyval.id)[ID_MAX-1] = '\0';
Packit a4aae4
                }
Packit a4aae4
#line 2056 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 62:
Packit a4aae4
#line 700 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
                    string name = string((yyvsp[-1].id)) + string((yyvsp[0].id));
Packit a4aae4
                    strncpy((yyval.id), name.c_str(), ID_MAX-1);
Packit a4aae4
                    (yyval.id)[ID_MAX-1] = '\0';
Packit a4aae4
                }
Packit a4aae4
#line 2066 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 63:
Packit a4aae4
#line 706 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
                    string name = string((yyvsp[-2].id)) + string((yyvsp[-1].id));
Packit a4aae4
                    if (!bracket_projection((*DDS(arg)), name.c_str(), (yyvsp[0].int_ll_ptr)))
Packit a4aae4
                      no_such_ident(arg, name.c_str(), "array, grid or sequence");
Packit a4aae4
Packit a4aae4
                    strncpy((yyval.id), name.c_str(), ID_MAX-1);
Packit a4aae4
                    (yyval.id)[ID_MAX-1] = '\0';
Packit a4aae4
                }
Packit a4aae4
#line 2079 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 64:
Packit a4aae4
#line 717 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    { 
Packit a4aae4
                    strncpy((yyval.id), www2id((yyvsp[0].id)).c_str(), ID_MAX-1);
Packit a4aae4
                    (yyval.id)[ID_MAX-1] = '\0';
Packit a4aae4
                }
Packit a4aae4
#line 2088 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 65:
Packit a4aae4
#line 722 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
                    if ((yyvsp[0].val).type != dods_str_c || (yyvsp[0].val).v.s == 0 || (yyvsp[0].val).v.s->empty())
Packit a4aae4
                        ce_exprerror(arg, "Malformed string", "");
Packit a4aae4
                        
Packit a4aae4
                    strncpy((yyval.id), www2id(*((yyvsp[0].val).v.s)).c_str(), ID_MAX-1);
Packit a4aae4
		    // See comment about regarding the scanner's behavior WRT SCAN_STR.
Packit a4aae4
		    // jhrg 7/30/14
Packit a4aae4
                    delete (yyvsp[0].val).v.s;
Packit a4aae4
Packit a4aae4
                    (yyval.id)[ID_MAX-1] = '\0';
Packit a4aae4
                }
Packit a4aae4
#line 2104 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 66:
Packit a4aae4
#line 736 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    (yyval.int_ll_ptr) = make_array_indices((yyvsp[0].int_l_ptr));
Packit a4aae4
		}
Packit a4aae4
#line 2112 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 67:
Packit a4aae4
#line 740 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
		    (yyval.int_ll_ptr) = append_array_index((yyvsp[-1].int_ll_ptr), (yyvsp[0].int_l_ptr));
Packit a4aae4
		}
Packit a4aae4
#line 2120 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 68:
Packit a4aae4
#line 754 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
    if (!check_uint32((yyvsp[-1].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-1].id)) + "' is not a valid array index.");
Packit a4aae4
    value i;
Packit a4aae4
    i.type = dods_uint32_c;
Packit a4aae4
    i.v.i = atoi((yyvsp[-1].id));
Packit a4aae4
    (yyval.int_l_ptr) = make_array_index(i);
Packit a4aae4
}
Packit a4aae4
#line 2133 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 69:
Packit a4aae4
#line 763 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
    value i;
Packit a4aae4
    i.type = dods_int32_c;
Packit a4aae4
    i.v.i =-1;
Packit a4aae4
    (yyval.int_l_ptr) = make_array_index(i);
Packit a4aae4
}
Packit a4aae4
#line 2144 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 70:
Packit a4aae4
#line 770 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
    if (!check_uint32((yyvsp[-3].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-3].id)) + "' is not a valid array index.");
Packit a4aae4
    if (!check_uint32((yyvsp[-1].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-1].id)) + "' is not a valid array index.");
Packit a4aae4
    value i,j;
Packit a4aae4
    i.type = j.type = dods_uint32_c;
Packit a4aae4
    i.v.i = atoi((yyvsp[-3].id));
Packit a4aae4
    j.v.i = atoi((yyvsp[-1].id));
Packit a4aae4
    (yyval.int_l_ptr) = make_array_index(i, j);
Packit a4aae4
}
Packit a4aae4
#line 2160 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 71:
Packit a4aae4
#line 782 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
    if (!check_uint32((yyvsp[-3].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-3].id)) + "' is not a valid array index.");
Packit a4aae4
    value i,j;
Packit a4aae4
    i.type = dods_uint32_c;
Packit a4aae4
    j.type = dods_int32_c;  /* signed */
Packit a4aae4
    i.v.i = atoi((yyvsp[-3].id));
Packit a4aae4
    j.v.i = -1;
Packit a4aae4
    (yyval.int_l_ptr) = make_array_index(i, j);
Packit a4aae4
}
Packit a4aae4
#line 2175 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 72:
Packit a4aae4
#line 793 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
    if (!check_uint32((yyvsp[-5].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-5].id)) + "' is not a valid array index.");
Packit a4aae4
    if (!check_uint32((yyvsp[-3].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-3].id)) + "' is not a valid array index.");
Packit a4aae4
    if (!check_uint32((yyvsp[-1].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-1].id)) + "' is not a valid array index.");
Packit a4aae4
    value i, j, k;
Packit a4aae4
    i.type = j.type = k.type = dods_uint32_c;
Packit a4aae4
    i.v.i = atoi((yyvsp[-5].id));
Packit a4aae4
    j.v.i = atoi((yyvsp[-3].id));
Packit a4aae4
    k.v.i = atoi((yyvsp[-1].id));
Packit a4aae4
    (yyval.int_l_ptr) = make_array_index(i, j, k);
Packit a4aae4
}
Packit a4aae4
#line 2194 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
  case 73:
Packit a4aae4
#line 808 "ce_expr.yy" /* yacc.c:1661  */
Packit a4aae4
    {
Packit a4aae4
    if (!check_uint32((yyvsp[-5].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-5].id)) + "' is not a valid array index.");
Packit a4aae4
    if (!check_uint32((yyvsp[-3].id)))
Packit a4aae4
        throw Error(malformed_expr, "The word `" + string((yyvsp[-3].id)) + "' is not a valid array index.");
Packit a4aae4
    value i, j, k;
Packit a4aae4
    i.type = j.type = dods_uint32_c;
Packit a4aae4
    k.type = dods_int32_c;
Packit a4aae4
    i.v.i = atoi((yyvsp[-5].id));
Packit a4aae4
    j.v.i = atoi((yyvsp[-3].id));
Packit a4aae4
    k.v.i = -1;
Packit a4aae4
    (yyval.int_l_ptr) = make_array_index(i, j, k);
Packit a4aae4
}
Packit a4aae4
#line 2212 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
    break;
Packit a4aae4
Packit a4aae4
Packit a4aae4
#line 2216 "ce_expr.tab.cc" /* yacc.c:1661  */
Packit a4aae4
      default: break;
Packit a4aae4
    }
Packit a4aae4
  /* User semantic actions sometimes alter yychar, and that requires
Packit a4aae4
     that yytoken be updated with the new translation.  We take the
Packit a4aae4
     approach of translating immediately before every use of yytoken.
Packit a4aae4
     One alternative is translating here after every semantic action,
Packit a4aae4
     but that translation would be missed if the semantic action invokes
Packit a4aae4
     YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
Packit a4aae4
     if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
Packit a4aae4
     incorrect destructor might then be invoked immediately.  In the
Packit a4aae4
     case of YYERROR or YYBACKUP, subsequent parser actions might lead
Packit a4aae4
     to an incorrect destructor call or verbose syntax error message
Packit a4aae4
     before the lookahead is translated.  */
Packit a4aae4
  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
Packit a4aae4
Packit a4aae4
  YYPOPSTACK (yylen);
Packit a4aae4
  yylen = 0;
Packit a4aae4
  YY_STACK_PRINT (yyss, yyssp);
Packit a4aae4
Packit a4aae4
  *++yyvsp = yyval;
Packit a4aae4
Packit a4aae4
  /* Now 'shift' the result of the reduction.  Determine what state
Packit a4aae4
     that goes to, based on the state we popped back to and the rule
Packit a4aae4
     number reduced by.  */
Packit a4aae4
Packit a4aae4
  yyn = yyr1[yyn];
Packit a4aae4
Packit a4aae4
  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
Packit a4aae4
  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
Packit a4aae4
    yystate = yytable[yystate];
Packit a4aae4
  else
Packit a4aae4
    yystate = yydefgoto[yyn - YYNTOKENS];
Packit a4aae4
Packit a4aae4
  goto yynewstate;
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*--------------------------------------.
Packit a4aae4
| yyerrlab -- here on detecting error.  |
Packit a4aae4
`--------------------------------------*/
Packit a4aae4
yyerrlab:
Packit a4aae4
  /* Make sure we have latest lookahead translation.  See comments at
Packit a4aae4
     user semantic actions for why this is necessary.  */
Packit a4aae4
  yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
Packit a4aae4
Packit a4aae4
  /* If not already recovering from an error, report this error.  */
Packit a4aae4
  if (!yyerrstatus)
Packit a4aae4
    {
Packit a4aae4
      ++yynerrs;
Packit a4aae4
#if ! YYERROR_VERBOSE
Packit a4aae4
      yyerror (arg, YY_("syntax error"));
Packit a4aae4
#else
Packit a4aae4
# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
Packit a4aae4
                                        yyssp, yytoken)
Packit a4aae4
      {
Packit a4aae4
        char const *yymsgp = YY_("syntax error");
Packit a4aae4
        int yysyntax_error_status;
Packit a4aae4
        yysyntax_error_status = YYSYNTAX_ERROR;
Packit a4aae4
        if (yysyntax_error_status == 0)
Packit a4aae4
          yymsgp = yymsg;
Packit a4aae4
        else if (yysyntax_error_status == 1)
Packit a4aae4
          {
Packit a4aae4
            if (yymsg != yymsgbuf)
Packit a4aae4
              YYSTACK_FREE (yymsg);
Packit a4aae4
            yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
Packit a4aae4
            if (!yymsg)
Packit a4aae4
              {
Packit a4aae4
                yymsg = yymsgbuf;
Packit a4aae4
                yymsg_alloc = sizeof yymsgbuf;
Packit a4aae4
                yysyntax_error_status = 2;
Packit a4aae4
              }
Packit a4aae4
            else
Packit a4aae4
              {
Packit a4aae4
                yysyntax_error_status = YYSYNTAX_ERROR;
Packit a4aae4
                yymsgp = yymsg;
Packit a4aae4
              }
Packit a4aae4
          }
Packit a4aae4
        yyerror (arg, yymsgp);
Packit a4aae4
        if (yysyntax_error_status == 2)
Packit a4aae4
          goto yyexhaustedlab;
Packit a4aae4
      }
Packit a4aae4
# undef YYSYNTAX_ERROR
Packit a4aae4
#endif
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
Packit a4aae4
Packit a4aae4
  if (yyerrstatus == 3)
Packit a4aae4
    {
Packit a4aae4
      /* If just tried and failed to reuse lookahead token after an
Packit a4aae4
         error, discard it.  */
Packit a4aae4
Packit a4aae4
      if (yychar <= YYEOF)
Packit a4aae4
        {
Packit a4aae4
          /* Return failure if at end of input.  */
Packit a4aae4
          if (yychar == YYEOF)
Packit a4aae4
            YYABORT;
Packit a4aae4
        }
Packit a4aae4
      else
Packit a4aae4
        {
Packit a4aae4
          yydestruct ("Error: discarding",
Packit a4aae4
                      yytoken, &yylval, arg);
Packit a4aae4
          yychar = YYEMPTY;
Packit a4aae4
        }
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  /* Else will try to reuse lookahead token after shifting the error
Packit a4aae4
     token.  */
Packit a4aae4
  goto yyerrlab1;
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*---------------------------------------------------.
Packit a4aae4
| yyerrorlab -- error raised explicitly by YYERROR.  |
Packit a4aae4
`---------------------------------------------------*/
Packit a4aae4
yyerrorlab:
Packit a4aae4
Packit a4aae4
  /* Pacify compilers like GCC when the user code never invokes
Packit a4aae4
     YYERROR and the label yyerrorlab therefore never appears in user
Packit a4aae4
     code.  */
Packit a4aae4
  if (/*CONSTCOND*/ 0)
Packit a4aae4
     goto yyerrorlab;
Packit a4aae4
Packit a4aae4
  /* Do not reclaim the symbols of the rule whose action triggered
Packit a4aae4
     this YYERROR.  */
Packit a4aae4
  YYPOPSTACK (yylen);
Packit a4aae4
  yylen = 0;
Packit a4aae4
  YY_STACK_PRINT (yyss, yyssp);
Packit a4aae4
  yystate = *yyssp;
Packit a4aae4
  goto yyerrlab1;
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*-------------------------------------------------------------.
Packit a4aae4
| yyerrlab1 -- common code for both syntax error and YYERROR.  |
Packit a4aae4
`-------------------------------------------------------------*/
Packit a4aae4
yyerrlab1:
Packit a4aae4
  yyerrstatus = 3;      /* Each real token shifted decrements this.  */
Packit a4aae4
Packit a4aae4
  for (;;)
Packit a4aae4
    {
Packit a4aae4
      yyn = yypact[yystate];
Packit a4aae4
      if (!yypact_value_is_default (yyn))
Packit a4aae4
        {
Packit a4aae4
          yyn += YYTERROR;
Packit a4aae4
          if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
Packit a4aae4
            {
Packit a4aae4
              yyn = yytable[yyn];
Packit a4aae4
              if (0 < yyn)
Packit a4aae4
                break;
Packit a4aae4
            }
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
      /* Pop the current state because it cannot handle the error token.  */
Packit a4aae4
      if (yyssp == yyss)
Packit a4aae4
        YYABORT;
Packit a4aae4
Packit a4aae4
Packit a4aae4
      yydestruct ("Error: popping",
Packit a4aae4
                  yystos[yystate], yyvsp, arg);
Packit a4aae4
      YYPOPSTACK (1);
Packit a4aae4
      yystate = *yyssp;
Packit a4aae4
      YY_STACK_PRINT (yyss, yyssp);
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
  YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
Packit a4aae4
  *++yyvsp = yylval;
Packit a4aae4
  YY_IGNORE_MAYBE_UNINITIALIZED_END
Packit a4aae4
Packit a4aae4
Packit a4aae4
  /* Shift the error token.  */
Packit a4aae4
  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
Packit a4aae4
Packit a4aae4
  yystate = yyn;
Packit a4aae4
  goto yynewstate;
Packit a4aae4
Packit a4aae4
Packit a4aae4
/*-------------------------------------.
Packit a4aae4
| yyacceptlab -- YYACCEPT comes here.  |
Packit a4aae4
`-------------------------------------*/
Packit a4aae4
yyacceptlab:
Packit a4aae4
  yyresult = 0;
Packit a4aae4
  goto yyreturn;
Packit a4aae4
Packit a4aae4
/*-----------------------------------.
Packit a4aae4
| yyabortlab -- YYABORT comes here.  |
Packit a4aae4
`-----------------------------------*/
Packit a4aae4
yyabortlab:
Packit a4aae4
  yyresult = 1;
Packit a4aae4
  goto yyreturn;
Packit a4aae4
Packit a4aae4
#if !defined yyoverflow || YYERROR_VERBOSE
Packit a4aae4
/*-------------------------------------------------.
Packit a4aae4
| yyexhaustedlab -- memory exhaustion comes here.  |
Packit a4aae4
`-------------------------------------------------*/
Packit a4aae4
yyexhaustedlab:
Packit a4aae4
  yyerror (arg, YY_("memory exhausted"));
Packit a4aae4
  yyresult = 2;
Packit a4aae4
  /* Fall through.  */
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
yyreturn:
Packit a4aae4
  if (yychar != YYEMPTY)
Packit a4aae4
    {
Packit a4aae4
      /* Make sure we have latest lookahead translation.  See comments at
Packit a4aae4
         user semantic actions for why this is necessary.  */
Packit a4aae4
      yytoken = YYTRANSLATE (yychar);
Packit a4aae4
      yydestruct ("Cleanup: discarding lookahead",
Packit a4aae4
                  yytoken, &yylval, arg);
Packit a4aae4
    }
Packit a4aae4
  /* Do not reclaim the symbols of the rule whose action triggered
Packit a4aae4
     this YYABORT or YYACCEPT.  */
Packit a4aae4
  YYPOPSTACK (yylen);
Packit a4aae4
  YY_STACK_PRINT (yyss, yyssp);
Packit a4aae4
  while (yyssp != yyss)
Packit a4aae4
    {
Packit a4aae4
      yydestruct ("Cleanup: popping",
Packit a4aae4
                  yystos[*yyssp], yyvsp, arg);
Packit a4aae4
      YYPOPSTACK (1);
Packit a4aae4
    }
Packit a4aae4
#ifndef yyoverflow
Packit a4aae4
  if (yyss != yyssa)
Packit a4aae4
    YYSTACK_FREE (yyss);
Packit a4aae4
#endif
Packit a4aae4
#if YYERROR_VERBOSE
Packit a4aae4
  if (yymsg != yymsgbuf)
Packit a4aae4
    YYSTACK_FREE (yymsg);
Packit a4aae4
#endif
Packit a4aae4
  return yyresult;
Packit a4aae4
}
Packit a4aae4
#line 832 "ce_expr.yy" /* yacc.c:1906  */
Packit a4aae4
Packit a4aae4
Packit a4aae4
// All these error reporting function now throw instances of Error. The expr
Packit a4aae4
// parser no longer returns an error code to indicate and error. 2/16/2000
Packit a4aae4
// jhrg.
Packit a4aae4
Packit a4aae4
void
Packit a4aae4
ce_exprerror(ce_parser_arg *, const string &s)
Packit a4aae4
{
Packit a4aae4
    string msg = "Constraint expression parse error: " +s;
Packit a4aae4
    throw Error(malformed_expr, msg);
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void ce_exprerror(ce_parser_arg *, const string &s, const string &s2)
Packit a4aae4
{
Packit a4aae4
    string msg = "Constraint expression parse error: " + s + ": " + s2;
Packit a4aae4
    throw Error(malformed_expr, msg);    
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void no_such_ident(ce_parser_arg *arg, const string &name, const string &word)
Packit a4aae4
{
Packit a4aae4
#if 0
Packit a4aae4
    string msg = "No such " + word + " in dataset";
Packit a4aae4
    ce_exprerror(arg, msg , name);
Packit a4aae4
#endif
Packit a4aae4
    string msg = "Constraint expression parse error: No such " + word + " in dataset: " + name;
Packit a4aae4
    throw Error(no_such_variable, msg);    
Packit a4aae4
    
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void no_such_func(ce_parser_arg *arg, const string &name)
Packit a4aae4
{
Packit a4aae4
    ce_exprerror(arg, "Not a registered function", name);
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
/* If we're calling this, assume var is not a Sequence. But assume that the
Packit a4aae4
 name contains a dot and it's a separator. Look for the rightmost dot and
Packit a4aae4
 then look to see if the name to the left is a sequence. Return a pointer
Packit a4aae4
 to the sequence if it is otherwise return null. Uses tail-recursion to
Packit a4aae4
 'walk' back from right to left looking at each dot. This way the sequence
Packit a4aae4
 will be found even if there are structures between the field and the
Packit a4aae4
 Sequence. */
Packit a4aae4
static Sequence *
Packit a4aae4
parent_is_sequence(DDS &table, const string &n)
Packit a4aae4
{
Packit a4aae4
    string::size_type dotpos = n.find_last_of('.');
Packit a4aae4
    if (dotpos == string::npos)
Packit a4aae4
        return 0;
Packit a4aae4
Packit a4aae4
    string s = n.substr(0, dotpos);
Packit a4aae4
Packit a4aae4
    // If the thing returned by table.var is not a Sequence, this cast
Packit a4aae4
    // will yield null.
Packit a4aae4
    Sequence *seq = dynamic_cast<Sequence*> (table.var(s));
Packit a4aae4
    if (seq)
Packit a4aae4
        return seq;
Packit a4aae4
    else
Packit a4aae4
        return parent_is_sequence(table, s);
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
bool bracket_projection(DDS &table, const char *name, int_list_list *indices)
Packit a4aae4
{
Packit a4aae4
    BaseType *var = table.var(name);
Packit a4aae4
    Sequence *seq; // used in last else-if clause
Packit a4aae4
Packit a4aae4
    if (!var)
Packit a4aae4
        return false;
Packit a4aae4
Packit a4aae4
    if (is_array_t(var)) {
Packit a4aae4
        /* calls to set_send_p should be replaced with
Packit a4aae4
         calls to DDS::mark so that arrays of Structures,
Packit a4aae4
         etc. will be processed correctly when individual
Packit a4aae4
         elements are projected using short names.
Packit a4aae4
         9/1/98 jhrg */
Packit a4aae4
        /* var->set_send_p(true); */
Packit a4aae4
        //table.mark(name, true);
Packit a4aae4
        // We don't call mark() here for an array. Instead it is called from
Packit a4aae4
        // within the parser. jhrg 10/10/08
Packit a4aae4
        process_array_indices(var, indices); // throws on error
Packit a4aae4
        delete_array_indices(indices);
Packit a4aae4
    }
Packit a4aae4
    else if (is_grid_t(var)) {
Packit a4aae4
        process_grid_indices(var, indices);
Packit a4aae4
        table.mark(name, true);
Packit a4aae4
        delete_array_indices(indices);
Packit a4aae4
    }
Packit a4aae4
    else if (is_sequence_t(var)) {
Packit a4aae4
        table.mark(name, true);
Packit a4aae4
        process_sequence_indices(var, indices);
Packit a4aae4
        delete_array_indices(indices);
Packit a4aae4
    }
Packit a4aae4
    else if ((seq = parent_is_sequence(table, name))) {
Packit a4aae4
        process_sequence_indices(seq, indices);
Packit a4aae4
        table.mark(name, true);
Packit a4aae4
        delete_array_indices(indices);
Packit a4aae4
    }
Packit a4aae4
    else {
Packit a4aae4
        return false;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    return true;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
// Given three values (I1, I2, I3), all of which must be integers, build an
Packit a4aae4
// int_list which contains those values.
Packit a4aae4
// 
Packit a4aae4
// Note that we added support for * in the rightmost position of an index
Packit a4aae4
// (i.e., [*], [n:*], [n:m:*]) and indicate that star using -1 as an index value.
Packit a4aae4
// Bescause of this change, the test for the type of the rightmost value in
Packit a4aae4
// the index subexpr was changed to include signed int.
Packit a4aae4
// jhrg 12/20/12
Packit a4aae4
//
Packit a4aae4
// Returns: A pointer to an int_list of three integers or NULL if any of the
Packit a4aae4
// values are not integers.
Packit a4aae4
Packit a4aae4
int_list *
Packit a4aae4
make_array_index(value &i1, value &i2, value &i3)
Packit a4aae4
{
Packit a4aae4
    if (i1.type != dods_uint32_c || i2.type != dods_uint32_c || (i3.type != dods_uint32_c && i3.type != dods_int32_c))
Packit a4aae4
        return (int_list *) 0;
Packit a4aae4
Packit a4aae4
    int_list *index = new int_list;
Packit a4aae4
Packit a4aae4
    index->push_back((int) i1.v.i);
Packit a4aae4
    index->push_back((int) i2.v.i);
Packit a4aae4
    index->push_back((int) i3.v.i);
Packit a4aae4
Packit a4aae4
    DBG(cout << "index: ");
Packit a4aae4
    DBG(copy(index->begin(), index->end(), ostream_iterator<int>(cerr, " ")));
Packit a4aae4
    DBG(cerr << endl);
Packit a4aae4
Packit a4aae4
    return index;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
int_list *
Packit a4aae4
make_array_index(value &i1, value &i2)
Packit a4aae4
{
Packit a4aae4
    if (i1.type != dods_uint32_c || (i2.type != dods_uint32_c && i2.type != dods_int32_c))
Packit a4aae4
	return (int_list *) 0;
Packit a4aae4
Packit a4aae4
    int_list *index = new int_list;
Packit a4aae4
Packit a4aae4
    index->push_back((int) i1.v.i);
Packit a4aae4
    index->push_back(1);
Packit a4aae4
    index->push_back((int) i2.v.i);
Packit a4aae4
Packit a4aae4
    DBG(cout << "index: ");
Packit a4aae4
    DBG(copy(index->begin(), index->end(), ostream_iterator<int>(cerr, " ")));
Packit a4aae4
    DBG(cerr << endl);
Packit a4aae4
Packit a4aae4
    return index;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
int_list *
Packit a4aae4
make_array_index(value &i1)
Packit a4aae4
{
Packit a4aae4
    if (i1.type != dods_uint32_c && i1.type != dods_int32_c)
Packit a4aae4
	return (int_list *) 0;
Packit a4aae4
Packit a4aae4
    int_list *index = new int_list;
Packit a4aae4
Packit a4aae4
    // When the CE is Array[*] that means all of the elements, but the value
Packit a4aae4
    // of i1 will be -1. Make the projection triple be 0:1:-1 which is a 
Packit a4aae4
    // pattern that libdap::Array will recognize.
Packit a4aae4
    if (i1.v.i == -1)
Packit a4aae4
        index->push_back(0);
Packit a4aae4
    else
Packit a4aae4
        index->push_back((int) i1.v.i);
Packit a4aae4
    index->push_back(1);
Packit a4aae4
    index->push_back((int) i1.v.i);
Packit a4aae4
Packit a4aae4
    DBG(cout << "index: ");
Packit a4aae4
    DBG(copy(index->begin(), index->end(), ostream_iterator<int>(cerr, " ")));
Packit a4aae4
    DBG(cerr << endl);
Packit a4aae4
Packit a4aae4
    return index;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
int_list_list *
Packit a4aae4
make_array_indices(int_list *index)
Packit a4aae4
{
Packit a4aae4
    int_list_list *indices = new int_list_list;
Packit a4aae4
Packit a4aae4
    DBG(cout << "index: ");
Packit a4aae4
    DBG(copy(index->begin(), index->end(), ostream_iterator<int>(cerr, " ")));
Packit a4aae4
    DBG(cerr << endl);
Packit a4aae4
Packit a4aae4
    assert(index);
Packit a4aae4
    indices->push_back(index);
Packit a4aae4
Packit a4aae4
    return indices;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
int_list_list *
Packit a4aae4
append_array_index(int_list_list *indices, int_list *index)
Packit a4aae4
{
Packit a4aae4
    assert(indices);
Packit a4aae4
    assert(index);
Packit a4aae4
Packit a4aae4
    indices->push_back(index);
Packit a4aae4
Packit a4aae4
    return indices;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
// Delete an array indices list. 
Packit a4aae4
Packit a4aae4
void delete_array_indices(int_list_list *indices)
Packit a4aae4
{
Packit a4aae4
    assert(indices);
Packit a4aae4
Packit a4aae4
    for (int_list_citer i = indices->begin(); i != indices->end(); i++) {
Packit a4aae4
	int_list *il = *i;
Packit a4aae4
	assert(il);
Packit a4aae4
	delete il;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    delete indices;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
bool is_array_t(BaseType *variable)
Packit a4aae4
{
Packit a4aae4
    assert(variable);
Packit a4aae4
Packit a4aae4
    if (variable->type() != dods_array_c)
Packit a4aae4
	return false;
Packit a4aae4
    else
Packit a4aae4
	return true;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
bool is_grid_t(BaseType *variable)
Packit a4aae4
{
Packit a4aae4
    assert(variable);
Packit a4aae4
Packit a4aae4
    if (variable->type() != dods_grid_c)
Packit a4aae4
	return false;
Packit a4aae4
    else
Packit a4aae4
	return true;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
bool is_sequence_t(BaseType *variable)
Packit a4aae4
{
Packit a4aae4
    assert(variable);
Packit a4aae4
Packit a4aae4
    if (variable->type() != dods_sequence_c)
Packit a4aae4
	return false;
Packit a4aae4
    else
Packit a4aae4
	return true;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void process_array_indices(BaseType *variable, int_list_list *indices)
Packit a4aae4
{
Packit a4aae4
    assert(variable);
Packit a4aae4
Packit a4aae4
    Array *a = dynamic_cast<Array *>(variable); // replace with dynamic cast
Packit a4aae4
    if (!a)
Packit a4aae4
        throw Error(malformed_expr,
Packit a4aae4
		    string("The constraint expression evaluator expected an array; ") + variable->name() + " is not an array.");
Packit a4aae4
Packit a4aae4
    if (a->dimensions(true) != (unsigned) indices->size())
Packit a4aae4
        throw Error(malformed_expr,
Packit a4aae4
		    string("Error: The number of dimensions in the constraint for ") + variable->name()
Packit a4aae4
                    + " must match the number in the array.");
Packit a4aae4
Packit a4aae4
    DBG(cerr << "Before applying projection to array:" << endl);
Packit a4aae4
    DBG(a->print_decl(cerr, "", true, false, true));
Packit a4aae4
Packit a4aae4
    assert(indices);
Packit a4aae4
    
Packit a4aae4
    int_list_citer p = indices->begin();
Packit a4aae4
    Array::Dim_iter r = a->dim_begin();
Packit a4aae4
    for (; p != indices->end() && r != a->dim_end(); p++, r++) {
Packit a4aae4
        int_list *index = *p;
Packit a4aae4
        assert(index);
Packit a4aae4
Packit a4aae4
        int_citer q = index->begin();
Packit a4aae4
        assert(q != index->end());
Packit a4aae4
        int start = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        int stride = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        int stop = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        if (q != index->end())
Packit a4aae4
            throw Error(malformed_expr, string("Too many values in index list for ") + a->name() + ".");
Packit a4aae4
Packit a4aae4
        DBG(cerr << "process_array_indices: Setting constraint on " 
Packit a4aae4
            << a->name() << "[" << start << ":" << stop << "]"
Packit a4aae4
            << endl);
Packit a4aae4
Packit a4aae4
        // It's possible that an array will appear more than once in a CE
Packit a4aae4
        // (for example, if an array of structures is constrained so that
Packit a4aae4
        // only two fields are projected and there's an associated hyperslab).
Packit a4aae4
        // However, in this case the two hyperslabs must be equal; test for
Packit a4aae4
        // that here.
Packit a4aae4
        //
Packit a4aae4
        // We added '*' to mean 'the last element' in the array and use an index of -1
Packit a4aae4
        // to indicate that. If 'stop' is -1, don't test it here because dimension_stop()
Packit a4aae4
        // won't be -1 but the actual ending index of the array. jhrg 12/20/12
Packit a4aae4
Packit a4aae4
        if (a->send_p() && (a->dimension_start(r, true) != start || (a->dimension_stop(r, true) != stop && stop != -1)
Packit a4aae4
                            || a->dimension_stride(r, true) != stride))
Packit a4aae4
            throw Error(malformed_expr,
Packit a4aae4
                    string("The Array was already projected differently in the constraint expression: ") + a->name() + ".");
Packit a4aae4
Packit a4aae4
        a->add_constraint(r, start, stride, stop);
Packit a4aae4
Packit a4aae4
        DBG(cerr << "Set Constraint: " << a->dimension_size(r, true) << endl);
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    DBG(cerr << "After applying projection to array:" << endl);
Packit a4aae4
    DBG(a->print_decl(cerr, "", true, false, true));
Packit a4aae4
Packit a4aae4
Packit a4aae4
    if (p != indices->end() && r == a->dim_end())
Packit a4aae4
        throw Error(malformed_expr, string("Too many indices in constraint for ") + a->name() + ".");
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void process_grid_indices(BaseType *variable, int_list_list *indices)
Packit a4aae4
{
Packit a4aae4
    assert(variable);
Packit a4aae4
    assert(variable->type() == dods_grid_c);
Packit a4aae4
    Grid *g = dynamic_cast<Grid *>(variable);
Packit a4aae4
    if (!g)
Packit a4aae4
        throw Error(unknown_error, "Expected a Grid variable");
Packit a4aae4
Packit a4aae4
    Array *a = g->get_array();
Packit a4aae4
Packit a4aae4
    if (a->dimensions(true) != (unsigned) indices->size())
Packit a4aae4
        throw Error(malformed_expr,
Packit a4aae4
		    string("Error: The number of dimensions in the constraint for ") + variable->name()
Packit a4aae4
		    + " must match the number in the grid.");
Packit a4aae4
Packit a4aae4
    // First do the constraints on the ARRAY in the grid.
Packit a4aae4
    process_array_indices(g->array_var(), indices);
Packit a4aae4
Packit a4aae4
    // Now process the maps.
Packit a4aae4
    Grid::Map_iter r = g->map_begin();
Packit a4aae4
Packit a4aae4
    // Suppress all maps by default.
Packit a4aae4
    for (; r != g->map_end(); r++) {
Packit a4aae4
        (*r)->set_send_p(false);
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    // Add specified maps to the current projection.
Packit a4aae4
    assert(indices);
Packit a4aae4
    int_list_citer p = indices->begin();
Packit a4aae4
    r = g->map_begin();
Packit a4aae4
    for (; p != indices->end() && r != g->map_end(); p++, r++) {
Packit a4aae4
        int_list *index = *p;
Packit a4aae4
        assert(index);
Packit a4aae4
Packit a4aae4
        int_citer q = index->begin();
Packit a4aae4
        assert(q != index->end());
Packit a4aae4
        int start = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        int stride = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        int stop = *q;
Packit a4aae4
Packit a4aae4
        BaseType *btp = *r;
Packit a4aae4
        assert(btp);
Packit a4aae4
        assert(btp->type() == dods_array_c);
Packit a4aae4
        Array *a = (Array *) btp;
Packit a4aae4
        a->set_send_p(true);
Packit a4aae4
        a->reset_constraint();
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        if (q != index->end()) {
Packit a4aae4
            throw Error(malformed_expr, string("Too many values in index list for ") + a->name() + ".");
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        DBG(cerr << "process_grid_indices: Setting constraint on "
Packit a4aae4
            << a->name() << "[" << start << ":"
Packit a4aae4
            << stop << "]" << endl);
Packit a4aae4
    
Packit a4aae4
        Array::Dim_iter si = a->dim_begin();
Packit a4aae4
        a->add_constraint(si, start, stride, stop);
Packit a4aae4
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    DBG(cout << "Grid Constraint: ";
Packit a4aae4
	for (Array::Dim_iter dp = ((Array *) g->array_var())->dim_begin();
Packit a4aae4
	     dp != ((Array *) g->array_var())->dim_end(); dp++)
Packit a4aae4
	    cout << ((Array *) g->array_var())->dimension_size(dp, true) << " ";
Packit a4aae4
	    cout << endl
Packit a4aae4
	);
Packit a4aae4
Packit a4aae4
    if (p != indices->end() && r == g->map_end()) {
Packit a4aae4
        throw Error(malformed_expr,
Packit a4aae4
		    string("Too many indices in constraint for ") + (*r)->name() + ".");
Packit a4aae4
    }
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
void process_sequence_indices(BaseType *variable, int_list_list *indices)
Packit a4aae4
{
Packit a4aae4
    assert(variable);
Packit a4aae4
    assert(variable->type() == dods_sequence_c);
Packit a4aae4
    Sequence *s = dynamic_cast<Sequence *> (variable);
Packit a4aae4
    if (!s)
Packit a4aae4
        throw Error(malformed_expr, "Expected a Sequence variable");
Packit a4aae4
Packit a4aae4
    // Add specified maps to the current projection.
Packit a4aae4
    assert(indices);
Packit a4aae4
    for (int_list_citer p = indices->begin(); p != indices->end(); p++) {
Packit a4aae4
        int_list *index = *p;
Packit a4aae4
        assert(index);
Packit a4aae4
Packit a4aae4
        int_citer q = index->begin();
Packit a4aae4
        assert(q != index->end());
Packit a4aae4
        int start = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        int stride = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        int stop = *q;
Packit a4aae4
Packit a4aae4
        q++;
Packit a4aae4
        if (q != index->end()) {
Packit a4aae4
            throw Error(malformed_expr, string("Too many values in index list for ") + s->name() + ".");
Packit a4aae4
        }
Packit a4aae4
Packit a4aae4
        s->set_row_number_constraint(start, stop, stride);
Packit a4aae4
    }
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
// Given a value, wrap it up in a BaseType and return a pointer to the same.
Packit a4aae4
Packit a4aae4
BaseType *
Packit a4aae4
make_variable(ConstraintEvaluator &eval, const value &val)
Packit a4aae4
{
Packit a4aae4
    BaseType *var;
Packit a4aae4
    switch (val.type) {
Packit a4aae4
    case dods_int32_c: {
Packit a4aae4
        var = new Int32("dummy");
Packit a4aae4
        var->val2buf((void *) &val.v.i);
Packit a4aae4
        break;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    case dods_uint32_c: {
Packit a4aae4
        var = new UInt32("dummy");
Packit a4aae4
        var->val2buf((void *) &val.v.i);
Packit a4aae4
        break;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    case dods_float64_c: {
Packit a4aae4
        var = new Float64("dummy");
Packit a4aae4
        var->val2buf((void *) &val.v.f);
Packit a4aae4
        break;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    case dods_str_c: {
Packit a4aae4
        var = new Str("dummy");
Packit a4aae4
        var->val2buf((void *) val.v.s);
Packit a4aae4
        break;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    default:
Packit a4aae4
        var = (BaseType *) 0;
Packit a4aae4
        return var;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    var->set_read_p(true); // ...so the evaluator will know it has data
Packit a4aae4
    eval.append_constant(var);
Packit a4aae4
Packit a4aae4
    return var;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
// Given a string (passed in VAL), consult the DDS CE function lookup table
Packit a4aae4
// to see if a function by that name exists. 
Packit a4aae4
// NB: function arguments are type-checked at run-time.
Packit a4aae4
//
Packit a4aae4
// Returns: A pointer to the function or NULL if not such function exists.
Packit a4aae4
Packit a4aae4
bool_func get_function(const ConstraintEvaluator &eval, const char *name)
Packit a4aae4
{
Packit a4aae4
    bool_func f;
Packit a4aae4
Packit a4aae4
    if (eval.find_function(name, &f))
Packit a4aae4
        return f;
Packit a4aae4
    else
Packit a4aae4
        return 0;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
btp_func get_btp_function(const ConstraintEvaluator &eval, const char *name)
Packit a4aae4
{
Packit a4aae4
    btp_func f;
Packit a4aae4
Packit a4aae4
    if (eval.find_function(name, &f))
Packit a4aae4
        return f;
Packit a4aae4
    else
Packit a4aae4
        return 0;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
proj_func get_proj_function(const ConstraintEvaluator &eval, const char *name)
Packit a4aae4
{
Packit a4aae4
    proj_func f;
Packit a4aae4
Packit a4aae4
    if (eval.find_function(name, &f))
Packit a4aae4
        return f;
Packit a4aae4
    else
Packit a4aae4
        return 0;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
template<class arg_type_list, class arg_type>
Packit a4aae4
arg_type_list
Packit a4aae4
make_fast_arg_list(unsigned long vector_size_hint, arg_type value)
Packit a4aae4
{
Packit a4aae4
    arg_type_list args = new std::vector<arg_type>;
Packit a4aae4
    
Packit a4aae4
    if (vector_size_hint > 0) args->reserve(vector_size_hint);
Packit a4aae4
    
Packit a4aae4
    args->push_back(value);
Packit a4aae4
    return args;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
template<class arg_type_list, class arg_type>
Packit a4aae4
arg_type_list
Packit a4aae4
make_fast_arg_list(arg_type_list values, arg_type value)
Packit a4aae4
{
Packit a4aae4
    values->push_back(value);
Packit a4aae4
    return values;
Packit a4aae4
}
Packit a4aae4
Packit a4aae4
template<class t, class T>
Packit a4aae4
rvalue *build_constant_array(vector<t> *values, DDS *dds)
Packit a4aae4
{
Packit a4aae4
    //vector<t> *values = $5;
Packit a4aae4
            
Packit a4aae4
    T i("");
Packit a4aae4
    Array *array = new Array("", &i);
Packit a4aae4
    array->append_dim(values->size());
Packit a4aae4
    
Packit a4aae4
    // TODO Make set_value_nocopy() methods so that values' pointers can be copied
Packit a4aae4
    // instead of allocating memory twice. jhrg 7/5/13
Packit a4aae4
            
Packit a4aae4
    array->set_value(*values, values->size());
Packit a4aae4
    delete values;
Packit a4aae4
    array->set_read_p(true);
Packit a4aae4
            
Packit a4aae4
    static unsigned long counter = 1;
Packit a4aae4
    string name;
Packit a4aae4
    do {
Packit a4aae4
        name = "g" + long_to_string(counter++);
Packit a4aae4
    } while (dds->var(name));
Packit a4aae4
    array->set_name(name);
Packit a4aae4
            
Packit a4aae4
    return new rvalue(array);
Packit a4aae4
}
Packit a4aae4