sslparser.cpp

Go to the documentation of this file.
00001 #define YY_SSLParser_h_included
00002 
00003 /*  A Bison++ parser, made from sslparser.y  */
00004 
00005  /* with Bison++ version bison++ Version 1.21-8, adapted from GNU bison by coetmeur@icdc.fr
00006   */
00007 
00008 
00009 #line 1 "/usr/local/lib/bison.cc"
00010 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
00011 /* Skeleton output parser for bison,
00012    Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
00013 
00014    This program is free software; you can redistribute it and/or modify
00015    it under the terms of the GNU General Public License as published by
00016    the Free Software Foundation; either version 1, or (at your option)
00017    any later version.
00018 
00019    This program is distributed in the hope that it will be useful,
00020    but WITHOUT ANY WARRANTY; without even the implied warranty of
00021    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00022    GNU General Public License for more details.
00023 
00024    You should have received a copy of the GNU General Public License
00025    along with this program; if not, write to the Free Software
00026    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
00027 
00028 /* HEADER SECTION */
00029 #if defined( _MSDOS ) || defined(MSDOS) || defined(__MSDOS__) 
00030 #define __MSDOS_AND_ALIKE
00031 #endif
00032 #if defined(_WINDOWS) && defined(_MSC_VER)
00033 #define __HAVE_NO_ALLOCA
00034 #define __MSDOS_AND_ALIKE
00035 #endif
00036 
00037 #ifndef alloca
00038 #if defined( __GNUC__)
00039 #define alloca __builtin_alloca
00040 
00041 #elif (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc)  || defined (__sgi)
00042 #include <alloca.h>
00043 
00044 #elif defined (__MSDOS_AND_ALIKE)
00045 #include <malloc.h>
00046 #ifndef __TURBOC__
00047 /* MS C runtime lib */
00048 #define alloca _alloca
00049 #endif
00050 
00051 #elif defined(_AIX)
00052 #include <malloc.h>
00053 #pragma alloca
00054 
00055 #elif defined(__hpux)
00056 #ifdef __cplusplus
00057 extern "C" {
00058 void *alloca (unsigned int);
00059 };
00060 #else /* not __cplusplus */
00061 void *alloca ();
00062 #endif /* not __cplusplus */
00063 
00064 #endif /* not _AIX  not MSDOS, or __TURBOC__ or _AIX, not sparc.  */
00065 #endif /* alloca not defined.  */
00066 #ifdef c_plusplus
00067 #ifndef __cplusplus
00068 #define __cplusplus
00069 #endif
00070 #endif
00071 #ifdef __cplusplus
00072 #ifndef YY_USE_CLASS
00073 #define YY_USE_CLASS
00074 #endif
00075 #else
00076 #ifndef __STDC__
00077 #define const
00078 #endif
00079 #endif
00080 #include <stdio.h>
00081 #define YYBISON 1  
00082 
00083 /* #line 73 "/usr/local/lib/bison.cc" */
00084 #line 85 "sslparser.cpp"
00085 #line 41 "sslparser.y"
00086 
00087 #include "gc.h"
00088 #include <assert.h>
00089 #if defined(_MSC_VER) && _MSC_VER <= 1200
00090 #pragma warning(disable:4786)
00091 #endif 
00092 
00093 #include <sstream>
00094 #include "types.h"
00095 #include "rtl.h"
00096 #include "table.h"
00097 #include "insnameelem.h"
00098 #include "util.h"           // E.g. str()
00099 #include "statement.h"
00100 
00101 #ifdef _WIN32
00102 #include <malloc.h>
00103 #endif
00104 
00105 class SSLScanner;
00106 
00107 #line 68 "sslparser.y"
00108 typedef union {
00109     Exp*            exp;
00110     char*           str;
00111     int             num;
00112     double          dbl;
00113     Statement*      regtransfer;
00114     Type*           typ;
00115     
00116     Table*          tab;
00117     InsNameElem*    insel;
00118     std::list<std::string>*   parmlist;
00119     std::list<std::string>*   strlist;
00120     std::deque<Exp*>*    exprlist;
00121     std::deque<std::string>*  namelist;
00122     std::list<Exp*>*     explist;
00123     RTL*            rtlist;
00124 } yy_SSLParser_stype;
00125 #define YY_SSLParser_STYPE yy_SSLParser_stype
00126 #line 87 "sslparser.y"
00127 
00128 #include "sslscanner.h"
00129 OPER strToTerm(char* s);        // Convert string to a Terminal (if possible)
00130 Exp* listExpToExp(std::list<Exp*>* le);  // Convert a STL list of Exp* to opList
00131 Exp* listStrToExp(std::list<std::string>* ls);// Convert a STL list of strings to opList
00132 #define YY_SSLParser_DEBUG  1 
00133 #define YY_SSLParser_PARSE_PARAM  \
00134     RTLInstDict& Dict
00135 #define YY_SSLParser_CONSTRUCTOR_PARAM  \
00136     const std::string& sslFile, \
00137     bool trace
00138 #define YY_SSLParser_CONSTRUCTOR_INIT  : \
00139    sslFile(sslFile), bFloat(false)
00140 #define YY_SSLParser_CONSTRUCTOR_CODE  \
00141     std::fstream *fin = new std::fstream(sslFile.c_str(), std::ios::in); \
00142     theScanner = NULL; \
00143     if (!*fin) { \
00144         std::cerr << "can't open `" << sslFile << "' for reading\n"; \
00145     return; \
00146     } \
00147     theScanner = new SSLScanner(*fin, trace); \
00148     if (trace) yydebug = 1;
00149 #define YY_SSLParser_MEMBERS  \
00150 public: \
00151         SSLParser(std::istream &in, bool trace); \
00152         virtual ~SSLParser(); \
00153 OPER    strToOper(const char*s); /* Convert string to an operator */ \
00154 static  Statement* parseExp(const char *str); /* Parse an expression or assignment from a string */ \
00155 /* The code for expanding tables and saving to the dictionary */ \
00156 void    expandTables(InsNameElem* iname, std::list<std::string>* params, RTL* o_rtlist, RTLInstDict& Dict); \
00157 Exp*    makeSuccessor(Exp* e);  /* Get successor (of register expression) */ \
00158 \
00159     /* \
00160      * The scanner. \
00161      */ \
00162     SSLScanner* theScanner; \
00163 protected: \
00164 \
00165     /* \
00166      * The file from which the SSL spec is read. \
00167      */ \
00168     std::string sslFile; \
00169 \
00170     /* \
00171      * Result for parsing an assignment. \
00172      */ \
00173     Statement *the_asgn; \
00174 \
00175     /* \
00176      * Maps SSL constants to their values. \
00177      */ \
00178     std::map<std::string,int> ConstTable; \
00179 \
00180     /* \
00181      * maps index names to instruction name-elements \
00182      */ \
00183     std::map<std::string, InsNameElem*> indexrefmap; \
00184 \
00185     /* \
00186      * Maps table names to Table's.\
00187      */ \
00188     std::map<std::string, Table*> TableDict; \
00189 \
00190     /* \
00191      * True when FLOAT keyword seen; false when INTEGER keyword seen \
00192      * (in @REGISTER section) \
00193      */ \
00194     bool bFloat;
00195 
00196 #line 73 "/usr/local/lib/bison.cc"
00197 /* %{ and %header{ and %union, during decl */
00198 #define YY_SSLParser_BISON 1
00199 #ifndef YY_SSLParser_COMPATIBILITY
00200 #ifndef YY_USE_CLASS
00201 #define  YY_SSLParser_COMPATIBILITY 1
00202 #else
00203 #define  YY_SSLParser_COMPATIBILITY 0
00204 #endif
00205 #endif
00206 
00207 #if YY_SSLParser_COMPATIBILITY != 0
00208 /* backward compatibility */
00209 #ifdef YYLTYPE
00210 #ifndef YY_SSLParser_LTYPE
00211 #define YY_SSLParser_LTYPE YYLTYPE
00212 #endif
00213 #endif
00214 #ifdef YYSTYPE
00215 #ifndef YY_SSLParser_STYPE 
00216 #define YY_SSLParser_STYPE YYSTYPE
00217 #endif
00218 #endif
00219 #ifdef YYDEBUG
00220 #ifndef YY_SSLParser_DEBUG
00221 #define  YY_SSLParser_DEBUG YYDEBUG
00222 #endif
00223 #endif
00224 #ifdef YY_SSLParser_STYPE
00225 #ifndef yystype
00226 #define yystype YY_SSLParser_STYPE
00227 #endif
00228 #endif
00229 /* use goto to be compatible */
00230 #ifndef YY_SSLParser_USE_GOTO
00231 #define YY_SSLParser_USE_GOTO 1
00232 #endif
00233 #endif
00234 
00235 /* use no goto to be clean in C++ */
00236 #ifndef YY_SSLParser_USE_GOTO
00237 #define YY_SSLParser_USE_GOTO 0
00238 #endif
00239 
00240 #ifndef YY_SSLParser_PURE
00241 
00242 /* #line 117 "/usr/local/lib/bison.cc" */
00243 #line 244 "sslparser.cpp"
00244 
00245 #line 117 "/usr/local/lib/bison.cc"
00246 /*  YY_SSLParser_PURE */
00247 #endif
00248 
00249 /* section apres lecture def, avant lecture grammaire S2 */
00250 
00251 /* #line 121 "/usr/local/lib/bison.cc" */
00252 #line 253 "sslparser.cpp"
00253 
00254 #line 121 "/usr/local/lib/bison.cc"
00255 /* prefix */
00256 #ifndef YY_SSLParser_DEBUG
00257 
00258 /* #line 123 "/usr/local/lib/bison.cc" */
00259 #line 260 "sslparser.cpp"
00260 
00261 #line 123 "/usr/local/lib/bison.cc"
00262 /* YY_SSLParser_DEBUG */
00263 #endif
00264 
00265 
00266 #ifndef YY_SSLParser_LSP_NEEDED
00267 
00268 /* #line 128 "/usr/local/lib/bison.cc" */
00269 #line 270 "sslparser.cpp"
00270 
00271 #line 128 "/usr/local/lib/bison.cc"
00272  /* YY_SSLParser_LSP_NEEDED*/
00273 #endif
00274 
00275 
00276 
00277 /* DEFAULT LTYPE*/
00278 #ifdef YY_SSLParser_LSP_NEEDED
00279 #ifndef YY_SSLParser_LTYPE
00280 typedef
00281   struct yyltype
00282     {
00283       int timestamp;
00284       int first_line;
00285       int first_column;
00286       int last_line;
00287       int last_column;
00288       char *text;
00289    }
00290   yyltype;
00291 
00292 #define YY_SSLParser_LTYPE yyltype
00293 #endif
00294 #endif
00295 /* DEFAULT STYPE*/
00296       /* We used to use `unsigned long' as YY_SSLParser_STYPE on MSDOS,
00297      but it seems better to be consistent.
00298      Most programs should declare their own type anyway.  */
00299 
00300 #ifndef YY_SSLParser_STYPE
00301 #define YY_SSLParser_STYPE int
00302 #endif
00303 /* DEFAULT MISCELANEOUS */
00304 #ifndef YY_SSLParser_PARSE
00305 #define YY_SSLParser_PARSE yyparse
00306 #endif
00307 #ifndef YY_SSLParser_LEX
00308 #define YY_SSLParser_LEX yylex
00309 #endif
00310 #ifndef YY_SSLParser_LVAL
00311 #define YY_SSLParser_LVAL yylval
00312 #endif
00313 #ifndef YY_SSLParser_LLOC
00314 #define YY_SSLParser_LLOC yylloc
00315 #endif
00316 #ifndef YY_SSLParser_CHAR
00317 #define YY_SSLParser_CHAR yychar
00318 #endif
00319 #ifndef YY_SSLParser_NERRS
00320 #define YY_SSLParser_NERRS yynerrs
00321 #endif
00322 #ifndef YY_SSLParser_DEBUG_FLAG
00323 #define YY_SSLParser_DEBUG_FLAG yydebug
00324 #endif
00325 #ifndef YY_SSLParser_ERROR
00326 #define YY_SSLParser_ERROR yyerror
00327 #endif
00328 #ifndef YY_SSLParser_PARSE_PARAM
00329 #ifndef __STDC__
00330 #ifndef __cplusplus
00331 #ifndef YY_USE_CLASS
00332 #define YY_SSLParser_PARSE_PARAM
00333 #ifndef YY_SSLParser_PARSE_PARAM_DEF
00334 #define YY_SSLParser_PARSE_PARAM_DEF
00335 #endif
00336 #endif
00337 #endif
00338 #endif
00339 #ifndef YY_SSLParser_PARSE_PARAM
00340 #define YY_SSLParser_PARSE_PARAM void
00341 #endif
00342 #endif
00343 #if YY_SSLParser_COMPATIBILITY != 0
00344 /* backward compatibility */
00345 #ifdef YY_SSLParser_LTYPE
00346 #ifndef YYLTYPE
00347 #define YYLTYPE YY_SSLParser_LTYPE
00348 #else
00349 /* WARNING obsolete !!! user defined YYLTYPE not reported into generated header */
00350 #endif
00351 #endif
00352 #ifndef YYSTYPE
00353 #define YYSTYPE YY_SSLParser_STYPE
00354 #else
00355 /* WARNING obsolete !!! user defined YYSTYPE not reported into generated header */
00356 #endif
00357 #ifdef YY_SSLParser_PURE
00358 #ifndef YYPURE
00359 #define YYPURE YY_SSLParser_PURE
00360 #endif
00361 #endif
00362 #ifdef YY_SSLParser_DEBUG
00363 #ifndef YYDEBUG
00364 #define YYDEBUG YY_SSLParser_DEBUG 
00365 #endif
00366 #endif
00367 #ifndef YY_SSLParser_ERROR_VERBOSE
00368 #ifdef YYERROR_VERBOSE
00369 #define YY_SSLParser_ERROR_VERBOSE YYERROR_VERBOSE
00370 #endif
00371 #endif
00372 #ifndef YY_SSLParser_LSP_NEEDED
00373 #ifdef YYLSP_NEEDED
00374 #define YY_SSLParser_LSP_NEEDED YYLSP_NEEDED
00375 #endif
00376 #endif
00377 #endif
00378 #ifndef YY_USE_CLASS
00379 /* TOKEN C */
00380 
00381 /* #line 236 "/usr/local/lib/bison.cc" */
00382 #line 383 "sslparser.cpp"
00383 #define COND_OP 258
00384 #define BIT_OP  259
00385 #define ARITH_OP    260
00386 #define LOG_OP  261
00387 #define NAME    262
00388 #define ASSIGNTYPE  263
00389 #define REG_ID  264
00390 #define REG_NUM 265
00391 #define COND_TNAME  266
00392 #define DECOR   267
00393 #define FARITH_OP   268
00394 #define FPUSH   269
00395 #define FPOP    270
00396 #define TEMP    271
00397 #define SHARES  272
00398 #define CONV_FUNC   273
00399 #define TRUNC_FUNC  274
00400 #define TRANSCEND   275
00401 #define FABS_FUNC   276
00402 #define BIG 277
00403 #define LITTLE  278
00404 #define NAME_CALL   279
00405 #define NAME_LOOKUP 280
00406 #define ENDIANNESS  281
00407 #define COVERS  282
00408 #define INDEX   283
00409 #define NOT 284
00410 #define LNOT    285
00411 #define FNEG    286
00412 #define THEN    287
00413 #define LOOKUP_RDC  288
00414 #define BOGUS   289
00415 #define ASSIGN  290
00416 #define TO  291
00417 #define COLON   292
00418 #define S_E 293
00419 #define AT  294
00420 #define ADDR    295
00421 #define REG_IDX 296
00422 #define EQUATE  297
00423 #define MEM_IDX 298
00424 #define TOK_INTEGER 299
00425 #define TOK_FLOAT   300
00426 #define FAST    301
00427 #define OPERAND 302
00428 #define FETCHEXEC   303
00429 #define CAST_OP 304
00430 #define FLAGMACRO   305
00431 #define SUCCESSOR   306
00432 #define NUM 307
00433 #define FLOATNUM    308
00434 #define FCHS    309
00435 
00436 
00437 #line 236 "/usr/local/lib/bison.cc"
00438  /* #defines tokens */
00439 #else
00440 /* CLASS */
00441 #ifndef YY_SSLParser_CLASS
00442 #define YY_SSLParser_CLASS SSLParser
00443 #endif
00444 #ifndef YY_SSLParser_INHERIT
00445 #define YY_SSLParser_INHERIT
00446 #endif
00447 #ifndef YY_SSLParser_MEMBERS
00448 #define YY_SSLParser_MEMBERS 
00449 #endif
00450 #ifndef YY_SSLParser_LEX_BODY
00451 #define YY_SSLParser_LEX_BODY  
00452 #endif
00453 #ifndef YY_SSLParser_ERROR_BODY
00454 #define YY_SSLParser_ERROR_BODY  
00455 #endif
00456 #ifndef YY_SSLParser_CONSTRUCTOR_PARAM
00457 #define YY_SSLParser_CONSTRUCTOR_PARAM
00458 #endif
00459 #ifndef YY_SSLParser_CONSTRUCTOR_CODE
00460 #define YY_SSLParser_CONSTRUCTOR_CODE
00461 #endif
00462 #ifndef YY_SSLParser_CONSTRUCTOR_INIT
00463 #define YY_SSLParser_CONSTRUCTOR_INIT
00464 #endif
00465 /* choose between enum and const */
00466 #ifndef YY_SSLParser_USE_CONST_TOKEN
00467 #define YY_SSLParser_USE_CONST_TOKEN 0
00468 /* yes enum is more compatible with flex,  */
00469 /* so by default we use it */ 
00470 #endif
00471 #if YY_SSLParser_USE_CONST_TOKEN != 0
00472 #ifndef YY_SSLParser_ENUM_TOKEN
00473 #define YY_SSLParser_ENUM_TOKEN yy_SSLParser_enum_token
00474 #endif
00475 #endif
00476 
00477 class YY_SSLParser_CLASS YY_SSLParser_INHERIT
00478 {
00479 public: 
00480 #if YY_SSLParser_USE_CONST_TOKEN != 0
00481 /* static const int token ... */
00482 
00483 /* #line 280 "/usr/local/lib/bison.cc" */
00484 #line 485 "sslparser.cpp"
00485 static const int COND_OP;
00486 static const int BIT_OP;
00487 static const int ARITH_OP;
00488 static const int LOG_OP;
00489 static const int NAME;
00490 static const int ASSIGNTYPE;
00491 static const int REG_ID;
00492 static const int REG_NUM;
00493 static const int COND_TNAME;
00494 static const int DECOR;
00495 static const int FARITH_OP;
00496 static const int FPUSH;
00497 static const int FPOP;
00498 static const int TEMP;
00499 static const int SHARES;
00500 static const int CONV_FUNC;
00501 static const int TRUNC_FUNC;
00502 static const int TRANSCEND;
00503 static const int FABS_FUNC;
00504 static const int BIG;
00505 static const int LITTLE;
00506 static const int NAME_CALL;
00507 static const int NAME_LOOKUP;
00508 static const int ENDIANNESS;
00509 static const int COVERS;
00510 static const int INDEX;
00511 static const int NOT;
00512 static const int LNOT;
00513 static const int FNEG;
00514 static const int THEN;
00515 static const int LOOKUP_RDC;
00516 static const int BOGUS;
00517 static const int ASSIGN;
00518 static const int TO;
00519 static const int COLON;
00520 static const int S_E;
00521 static const int AT;
00522 static const int ADDR;
00523 static const int REG_IDX;
00524 static const int EQUATE;
00525 static const int MEM_IDX;
00526 static const int TOK_INTEGER;
00527 static const int TOK_FLOAT;
00528 static const int FAST;
00529 static const int OPERAND;
00530 static const int FETCHEXEC;
00531 static const int CAST_OP;
00532 static const int FLAGMACRO;
00533 static const int SUCCESSOR;
00534 static const int NUM;
00535 static const int FLOATNUM;
00536 static const int FCHS;
00537 
00538 
00539 #line 280 "/usr/local/lib/bison.cc"
00540  /* decl const */
00541 #else
00542 enum YY_SSLParser_ENUM_TOKEN { YY_SSLParser_NULL_TOKEN=0
00543 
00544 /* #line 283 "/usr/local/lib/bison.cc" */
00545 #line 546 "sslparser.cpp"
00546     ,COND_OP=258
00547     ,BIT_OP=259
00548     ,ARITH_OP=260
00549     ,LOG_OP=261
00550     ,NAME=262
00551     ,ASSIGNTYPE=263
00552     ,REG_ID=264
00553     ,REG_NUM=265
00554     ,COND_TNAME=266
00555     ,DECOR=267
00556     ,FARITH_OP=268
00557     ,FPUSH=269
00558     ,FPOP=270
00559     ,TEMP=271
00560     ,SHARES=272
00561     ,CONV_FUNC=273
00562     ,TRUNC_FUNC=274
00563     ,TRANSCEND=275
00564     ,FABS_FUNC=276
00565     ,BIG=277
00566     ,LITTLE=278
00567     ,NAME_CALL=279
00568     ,NAME_LOOKUP=280
00569     ,ENDIANNESS=281
00570     ,COVERS=282
00571     ,INDEX=283
00572     ,NOT=284
00573     ,LNOT=285
00574     ,FNEG=286
00575     ,THEN=287
00576     ,LOOKUP_RDC=288
00577     ,BOGUS=289
00578     ,ASSIGN=290
00579     ,TO=291
00580     ,COLON=292
00581     ,S_E=293
00582     ,AT=294
00583     ,ADDR=295
00584     ,REG_IDX=296
00585     ,EQUATE=297
00586     ,MEM_IDX=298
00587     ,TOK_INTEGER=299
00588     ,TOK_FLOAT=300
00589     ,FAST=301
00590     ,OPERAND=302
00591     ,FETCHEXEC=303
00592     ,CAST_OP=304
00593     ,FLAGMACRO=305
00594     ,SUCCESSOR=306
00595     ,NUM=307
00596     ,FLOATNUM=308
00597     ,FCHS=309
00598 
00599 
00600 #line 283 "/usr/local/lib/bison.cc"
00601  /* enum token */
00602      }; /* end of enum declaration */
00603 #endif
00604 public:
00605  int YY_SSLParser_PARSE (YY_SSLParser_PARSE_PARAM);
00606  virtual void YY_SSLParser_ERROR(char *msg) YY_SSLParser_ERROR_BODY;
00607 #ifdef YY_SSLParser_PURE
00608 #ifdef YY_SSLParser_LSP_NEEDED
00609  virtual int  YY_SSLParser_LEX (YY_SSLParser_STYPE *YY_SSLParser_LVAL,YY_SSLParser_LTYPE *YY_SSLParser_LLOC) YY_SSLParser_LEX_BODY;
00610 #else
00611  virtual int  YY_SSLParser_LEX (YY_SSLParser_STYPE *YY_SSLParser_LVAL) YY_SSLParser_LEX_BODY;
00612 #endif
00613 #else
00614  virtual int YY_SSLParser_LEX() YY_SSLParser_LEX_BODY;
00615  YY_SSLParser_STYPE YY_SSLParser_LVAL;
00616 #ifdef YY_SSLParser_LSP_NEEDED
00617  YY_SSLParser_LTYPE YY_SSLParser_LLOC;
00618 #endif
00619  int   YY_SSLParser_NERRS;
00620  int    YY_SSLParser_CHAR;
00621 #endif
00622 #if YY_SSLParser_DEBUG != 0
00623  int YY_SSLParser_DEBUG_FLAG;   /*  nonzero means print parse trace     */
00624 #endif
00625 public:
00626  YY_SSLParser_CLASS(YY_SSLParser_CONSTRUCTOR_PARAM);
00627 public:
00628  YY_SSLParser_MEMBERS 
00629 };
00630 /* other declare folow */
00631 #if YY_SSLParser_USE_CONST_TOKEN != 0
00632 
00633 /* #line 314 "/usr/local/lib/bison.cc" */
00634 #line 635 "sslparser.cpp"
00635 const int YY_SSLParser_CLASS::COND_OP=258;
00636 const int YY_SSLParser_CLASS::BIT_OP=259;
00637 const int YY_SSLParser_CLASS::ARITH_OP=260;
00638 const int YY_SSLParser_CLASS::LOG_OP=261;
00639 const int YY_SSLParser_CLASS::NAME=262;
00640 const int YY_SSLParser_CLASS::ASSIGNTYPE=263;
00641 const int YY_SSLParser_CLASS::REG_ID=264;
00642 const int YY_SSLParser_CLASS::REG_NUM=265;
00643 const int YY_SSLParser_CLASS::COND_TNAME=266;
00644 const int YY_SSLParser_CLASS::DECOR=267;
00645 const int YY_SSLParser_CLASS::FARITH_OP=268;
00646 const int YY_SSLParser_CLASS::FPUSH=269;
00647 const int YY_SSLParser_CLASS::FPOP=270;
00648 const int YY_SSLParser_CLASS::TEMP=271;
00649 const int YY_SSLParser_CLASS::SHARES=272;
00650 const int YY_SSLParser_CLASS::CONV_FUNC=273;
00651 const int YY_SSLParser_CLASS::TRUNC_FUNC=274;
00652 const int YY_SSLParser_CLASS::TRANSCEND=275;
00653 const int YY_SSLParser_CLASS::FABS_FUNC=276;
00654 const int YY_SSLParser_CLASS::BIG=277;
00655 const int YY_SSLParser_CLASS::LITTLE=278;
00656 const int YY_SSLParser_CLASS::NAME_CALL=279;
00657 const int YY_SSLParser_CLASS::NAME_LOOKUP=280;
00658 const int YY_SSLParser_CLASS::ENDIANNESS=281;
00659 const int YY_SSLParser_CLASS::COVERS=282;
00660 const int YY_SSLParser_CLASS::INDEX=283;
00661 const int YY_SSLParser_CLASS::NOT=284;
00662 const int YY_SSLParser_CLASS::LNOT=285;
00663 const int YY_SSLParser_CLASS::FNEG=286;
00664 const int YY_SSLParser_CLASS::THEN=287;
00665 const int YY_SSLParser_CLASS::LOOKUP_RDC=288;
00666 const int YY_SSLParser_CLASS::BOGUS=289;
00667 const int YY_SSLParser_CLASS::ASSIGN=290;
00668 const int YY_SSLParser_CLASS::TO=291;
00669 const int YY_SSLParser_CLASS::COLON=292;
00670 const int YY_SSLParser_CLASS::S_E=293;
00671 const int YY_SSLParser_CLASS::AT=294;
00672 const int YY_SSLParser_CLASS::ADDR=295;
00673 const int YY_SSLParser_CLASS::REG_IDX=296;
00674 const int YY_SSLParser_CLASS::EQUATE=297;
00675 const int YY_SSLParser_CLASS::MEM_IDX=298;
00676 const int YY_SSLParser_CLASS::TOK_INTEGER=299;
00677 const int YY_SSLParser_CLASS::TOK_FLOAT=300;
00678 const int YY_SSLParser_CLASS::FAST=301;
00679 const int YY_SSLParser_CLASS::OPERAND=302;
00680 const int YY_SSLParser_CLASS::FETCHEXEC=303;
00681 const int YY_SSLParser_CLASS::CAST_OP=304;
00682 const int YY_SSLParser_CLASS::FLAGMACRO=305;
00683 const int YY_SSLParser_CLASS::SUCCESSOR=306;
00684 const int YY_SSLParser_CLASS::NUM=307;
00685 const int YY_SSLParser_CLASS::FLOATNUM=308;
00686 const int YY_SSLParser_CLASS::FCHS=309;
00687 
00688 
00689 #line 314 "/usr/local/lib/bison.cc"
00690  /* const YY_SSLParser_CLASS::token */
00691 #endif
00692 /*apres const  */
00693 YY_SSLParser_CLASS::YY_SSLParser_CLASS(YY_SSLParser_CONSTRUCTOR_PARAM) YY_SSLParser_CONSTRUCTOR_INIT
00694 {
00695 #if YY_SSLParser_DEBUG != 0
00696 YY_SSLParser_DEBUG_FLAG=0;
00697 #endif
00698 YY_SSLParser_CONSTRUCTOR_CODE;
00699 };
00700 #endif
00701 
00702 /* #line 325 "/usr/local/lib/bison.cc" */
00703 #line 704 "sslparser.cpp"
00704 
00705 
00706 #define YYFINAL     300
00707 #define YYFLAG      -32768
00708 #define YYNTBASE    68
00709 
00710 #define YYTRANSLATE(x) ((unsigned)(x) <= 309 ? yytranslate[x] : 115)
00711 
00712 static const char yytranslate[] = {     0,
00713      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00714      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00715      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00716      2,     2,     2,    62,     2,    64,     2,     2,    63,    66,
00717     61,     2,     2,    56,     2,     2,     2,     2,     2,     2,
00718      2,     2,     2,     2,     2,     2,     2,     2,    55,     2,
00719      2,     2,    67,     2,     2,     2,     2,     2,     2,     2,
00720      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00721      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00722     59,     2,    60,     2,    65,     2,     2,     2,     2,     2,
00723      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00724      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00725      2,     2,    57,     2,    58,     2,     2,     2,     2,     2,
00726      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00727      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00728      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00729      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00730      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00731      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00732      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00733      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00734      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00735      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00736      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00737      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
00738      2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
00739      6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
00740     16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
00741     26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
00742     36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
00743     46,    47,    48,    49,    50,    51,    52,    53,    54
00744 };
00745 
00746 #if YY_SSLParser_DEBUG != 0
00747 static const short yyprhs[] = {     0,
00748      0,     2,     4,     6,    10,    13,    15,    18,    20,    22,
00749     24,    26,    28,    30,    33,    37,    39,    45,    51,    55,
00750     56,    57,    61,    62,    66,    70,    72,    76,    83,    94,
00751    109,   120,   129,   133,   135,   142,   146,   152,   156,   158,
00752    160,   162,   165,   167,   171,   176,   178,   182,   184,   188,
00753    192,   195,   197,   199,   201,   203,   207,   213,   217,   221,
00754    227,   231,   232,   237,   239,   242,   244,   246,   249,   253,
00755    257,   261,   266,   271,   275,   278,   280,   282,   286,   290,
00756    293,   295,   299,   301,   305,   307,   308,   310,   314,   316,
00757    317,   324,   329,   331,   333,   336,   338,   340,   344,   346,
00758    354,   358,   366,   370,   374,   376,   378,   382,   386,   390,
00759    394,   397,   400,   403,   406,   409,   413,   417,   421,   425,
00760    429,   435,   437,   439,   443,   445,   449,   451,   459,   461,
00761    464,   468,   472,   475,   477,   479,   481,   484,   488,   490
00762 };
00763 
00764 static const short yyrhs[] = {   104,
00765      0,   106,     0,    69,     0,    69,    70,    55,     0,    70,
00766     55,     0,    93,     0,    48,    98,     0,    81,     0,    82,
00767      0,   109,     0,   112,     0,    74,     0,    80,     0,    47,
00768     71,     0,    71,    56,    72,     0,    72,     0,   102,    42,
00769     57,   101,    58,     0,   102,   101,    73,   111,   106,     0,
00770     59,   101,    60,     0,     0,     0,    44,    75,    77,     0,
00771      0,    45,    76,    77,     0,    77,    56,    78,     0,    78,
00772      0,     9,    28,    52,     0,     9,    59,    52,    60,    28,
00773     52,     0,     9,    59,    52,    60,    28,    52,    27,     9,
00774     36,     9,     0,     9,    59,    52,    60,    28,    52,    17,
00775      9,    39,    59,    52,    36,    52,    60,     0,    59,    79,
00776     60,    59,    52,    60,    28,    52,    36,    52,     0,    59,
00777     79,    60,    59,    52,    60,    28,    52,     0,    79,    56,
00778      9,     0,     9,     0,    24,   101,    61,    57,    98,    58,
00779      0,     7,    42,    52,     0,     7,    42,    52,     5,    52,
00780      0,     7,    42,    83,     0,    84,     0,    89,     0,    91,
00781      0,    84,    86,     0,    86,     0,    85,    56,    84,     0,
00782     85,    56,    62,    62,     0,    84,     0,    57,    85,    58,
00783      0,    87,     0,    63,     7,    63,     0,    62,     7,    62,
00784      0,    64,     7,     0,     7,     0,     4,     0,     5,     0,
00785     13,     0,    57,    90,    58,     0,    90,    56,    62,    88,
00786     62,     0,    62,    88,    62,     0,    57,    92,    58,     0,
00787     92,    56,    62,   106,    62,     0,    62,   106,    62,     0,
00788      0,    95,    94,   101,    98,     0,    96,     0,    95,    12,
00789      0,     7,     0,    97,     0,    96,    97,     0,    63,     7,
00790     63,     0,    25,    52,    60,     0,    25,     7,    60,     0,
00791     64,    25,    52,    60,     0,    64,    25,     7,    60,     0,
00792     62,     7,    62,     0,    98,    99,     0,    99,     0,   104,
00793      0,    24,   103,    61,     0,    50,   100,    61,     0,    50,
00794     61,     0,    65,     0,   100,    56,     9,     0,     9,     0,
00795    101,    56,   102,     0,   102,     0,     0,     7,     0,   103,
00796     56,   106,     0,   106,     0,     0,   111,   106,    32,   107,
00797     42,   106,     0,   111,   107,    42,   106,     0,    14,     0,
00798     15,     0,   111,   106,     0,    52,     0,    53,     0,    66,
00799    106,    61,     0,   107,     0,    59,   106,    67,   106,    37,
00800    106,    60,     0,    40,   106,    61,     0,    18,    52,    56,
00801     52,    56,   106,    61,     0,    19,   106,    61,     0,    21,
00802    106,    61,     0,    14,     0,    15,     0,    20,   106,    61,
00803      0,    25,     7,    60,     0,    24,   103,    61,     0,    51,
00804    106,    61,     0,   106,    38,     0,   106,   108,     0,    29,
00805    106,     0,    30,   106,     0,    31,   106,     0,   106,    13,
00806    106,     0,   106,     5,   106,     0,   106,     4,   106,     0,
00807    106,     3,   106,     0,   106,     6,   106,     0,   106,    25,
00808      7,    60,   105,     0,   105,     0,     9,     0,    41,   106,
00809     60,     0,    10,     0,    43,   106,    60,     0,     7,     0,
00810    106,    39,    59,   106,    37,   106,    60,     0,    16,     0,
00811    107,    63,     0,    51,   106,    61,     0,    57,    52,    58,
00812      0,    26,   110,     0,    22,     0,    23,     0,     8,     0,
00813     46,   113,     0,   113,    56,   114,     0,   114,     0,     7,
00814     28,     7,     0
00815 };
00816 
00817 #endif
00818 
00819 #if YY_SSLParser_DEBUG != 0
00820 static const short yyrline[] = { 0,
00821    219,   223,   228,   231,   233,   236,   239,   244,   246,   249,
00822    253,   256,   259,   262,   266,   268,   271,   289,   306,   307,
00823    310,   314,   314,   317,   319,   320,   323,   329,   334,   368,
00824    390,   404,   415,   419,   426,   434,   441,   454,   460,   466,
00825    470,   476,   487,   492,   500,   503,   508,   512,   517,   523,
00826    526,   541,   558,   563,   567,   573,   579,   585,   592,   598,
00827    604,   610,   615,   621,   625,   648,   652,   655,   661,   665,
00828    678,   687,   698,   707,   712,   722,   729,   736,   752,   756,
00829    759,   764,   772,   782,   789,   793,   798,   803,   808,   813,
00830    818,   828,   834,   839,   846,   851,   856,   860,   864,   868,
00831    873,   878,   883,   888,   893,   896,   901,   907,   930,   956,
00832    961,   969,   978,   982,   986,   990,   994,   998,  1002,  1006,
00833   1013,  1036,  1041,  1068,  1072,  1078,  1082,  1099,  1103,  1108,
00834   1111,  1116,  1122,  1127,  1131,  1136,  1165,  1169,  1172,  1176
00835 };
00836 
00837 static const char * const yytname[] = {   "$","error","$illegal.","COND_OP",
00838 "BIT_OP","ARITH_OP","LOG_OP","NAME","ASSIGNTYPE","REG_ID","REG_NUM","COND_TNAME",
00839 "DECOR","FARITH_OP","FPUSH","FPOP","TEMP","SHARES","CONV_FUNC","TRUNC_FUNC",
00840 "TRANSCEND","FABS_FUNC","BIG","LITTLE","NAME_CALL","NAME_LOOKUP","ENDIANNESS",
00841 "COVERS","INDEX","NOT","LNOT","FNEG","THEN","LOOKUP_RDC","BOGUS","ASSIGN","TO",
00842 "COLON","S_E","AT","ADDR","REG_IDX","EQUATE","MEM_IDX","TOK_INTEGER","TOK_FLOAT",
00843 "FAST","OPERAND","FETCHEXEC","CAST_OP","FLAGMACRO","SUCCESSOR","NUM","FLOATNUM",
00844 "FCHS","';'","','","'{'","'}'","'['","']'","')'","'\"'","'\\''","'$'","'_'",
00845 "'('","'?'","specorasgn","specification","parts","operandlist","operand","func_parameter",
00846 "reglist","@1","@2","a_reglists","a_reglist","reg_table","flag_fnc","constants",
00847 "table_assign","table_expr","str_expr","str_array","str_term","name_expand",
00848 "bin_oper","opstr_expr","opstr_array","exprstr_expr","exprstr_array","instr",
00849 "@3","instr_name","instr_elem","name_contract","rt_list","rt","flag_list","list_parameter",
00850 "param","list_actualparameter","assign_rt","exp_term","exp","location","cast",
00851 "endianness","esize","assigntype","fastlist","fastentries","fastentry",""
00852 };
00853 #endif
00854 
00855 static const short yyr1[] = {     0,
00856     68,    68,    68,    69,    69,    70,    70,    70,    70,    70,
00857     70,    70,    70,    70,    71,    71,    72,    72,    73,    73,
00858     75,    74,    76,    74,    77,    77,    78,    78,    78,    78,
00859     78,    78,    79,    79,    80,    81,    81,    82,    83,    83,
00860     83,    84,    84,    85,    85,    85,    86,    86,    87,    87,
00861     87,    87,    88,    88,    88,    89,    90,    90,    91,    92,
00862     92,    94,    93,    95,    95,    96,    96,    96,    97,    97,
00863     97,    97,    97,    97,    98,    98,    99,    99,    99,    99,
00864     99,   100,   100,   101,   101,   101,   102,   103,   103,   103,
00865    104,   104,   104,   104,   104,   105,   105,   105,   105,   105,
00866    105,   105,   105,   105,   105,   105,   105,   105,   105,   105,
00867    106,   106,   106,   106,   106,   106,   106,   106,   106,   106,
00868    106,   106,   107,   107,   107,   107,   107,   107,   107,   107,
00869    107,   108,   109,   110,   110,   111,   112,   113,   113,   114
00870 };
00871 
00872 static const short yyr2[] = {     0,
00873      1,     1,     1,     3,     2,     1,     2,     1,     1,     1,
00874      1,     1,     1,     2,     3,     1,     5,     5,     3,     0,
00875      0,     3,     0,     3,     3,     1,     3,     6,    10,    14,
00876     10,     8,     3,     1,     6,     3,     5,     3,     1,     1,
00877      1,     2,     1,     3,     4,     1,     3,     1,     3,     3,
00878      2,     1,     1,     1,     1,     3,     5,     3,     3,     5,
00879      3,     0,     4,     1,     2,     1,     1,     2,     3,     3,
00880      3,     4,     4,     3,     2,     1,     1,     3,     3,     2,
00881      1,     3,     1,     3,     1,     0,     1,     3,     1,     0,
00882      6,     4,     1,     1,     2,     1,     1,     3,     1,     7,
00883      3,     7,     3,     3,     1,     1,     3,     3,     3,     3,
00884      2,     2,     2,     2,     2,     3,     3,     3,     3,     3,
00885      5,     1,     1,     3,     1,     3,     1,     7,     1,     2,
00886      3,     3,     2,     1,     1,     1,     2,     3,     1,     3
00887 };
00888 
00889 static const short yydefact[] = {     0,
00890     66,   136,   123,   125,   105,   106,   129,     0,     0,     0,
00891      0,    86,     0,     0,     0,     0,     0,     0,     0,     0,
00892     21,    23,     0,     0,     0,     0,    96,    97,     0,     0,
00893      0,     0,     0,     3,     0,    12,    13,     8,     9,     6,
00894     62,    64,    67,     1,   122,     2,    99,    10,     0,    11,
00895      0,     0,   127,   105,   106,    90,     0,     0,     0,     0,
00896    127,     0,    85,     0,    89,     0,     0,   134,   135,   133,
00897    113,   114,   115,     0,     0,     0,     0,     0,     0,   137,
00898    139,    87,    14,    16,    86,    93,    94,    90,     0,    81,
00899      7,    76,    77,     0,     0,     0,     0,     0,     0,    66,
00900     86,     0,     0,     5,    65,    86,    68,     0,     0,     0,
00901      0,     0,     0,   111,     0,     0,   112,   130,    95,    99,
00902     52,    36,     0,     0,     0,     0,    38,    39,    43,    48,
00903     40,    41,     0,     0,   103,   107,   104,     0,     0,     0,
00904    109,    71,    70,   101,   124,   126,     0,     0,    22,    26,
00905     24,     0,     0,     0,     0,    20,     0,    83,    80,     0,
00906     75,   110,     0,    74,    69,     0,     0,    98,     0,     4,
00907      0,   119,   118,   117,   120,   116,     0,     0,     0,     0,
00908      0,     0,     0,     0,    46,     0,     0,     0,     0,     0,
00909     51,    42,     0,   108,    84,     0,    88,     0,     0,    34,
00910      0,     0,   140,   138,    15,    86,    86,     0,    78,     0,
00911     79,     0,    73,    72,    71,    63,     0,     0,   132,     0,
00912     99,    92,    37,    53,    54,   127,    55,     0,     0,     0,
00913     47,     0,    56,     0,    59,    50,    49,     0,     0,    27,
00914      0,     0,     0,    25,     0,     0,     0,    82,     0,   121,
00915      0,     0,    58,    61,     0,    44,     0,     0,     0,    35,
00916      0,    33,     0,    17,    19,    18,     0,     0,    91,    45,
00917      0,     0,   102,     0,     0,   100,   128,    57,    60,    28,
00918      0,     0,     0,     0,     0,     0,    32,     0,     0,     0,
00919      0,    29,    31,     0,     0,     0,    30,     0,     0,     0
00920 };
00921 
00922 static const short yydefgoto[] = {   298,
00923     34,    35,    83,    84,   208,    36,    77,    78,   149,   150,
00924    201,    37,    38,    39,   127,   185,   186,   129,   130,   228,
00925    131,   187,   132,   188,    40,   106,    41,    42,    43,    91,
00926     92,   160,    62,    63,    64,    93,    45,    65,    47,   117,
00927     48,    70,    49,    50,    80,    81
00928 };
00929 
00930 static const short yypact[] = {   146,
00931    463,-32768,-32768,-32768,    28,    35,-32768,   -11,   246,   246,
00932    246,   299,     7,   108,   246,   246,   246,   246,   246,   246,
00933 -32768,-32768,    51,    93,    36,   246,-32768,-32768,   246,   106,
00934    131,    94,   246,   178,    90,-32768,-32768,-32768,-32768,-32768,
00935    156,    80,-32768,-32768,-32768,   610,   110,-32768,   246,-32768,
00936     84,   127,-32768,-32768,-32768,   246,   200,   343,   358,   373,
00937    140,   150,-32768,   159,   610,   158,   168,-32768,-32768,-32768,
00938     82,    82,   610,   388,   449,   478,    -4,    -4,   191,   174,
00939 -32768,-32768,   189,-32768,     5,-32768,-32768,   246,     4,-32768,
00940     36,-32768,-32768,   403,    18,   206,   209,    46,   418,   212,
00941     93,    47,   208,-32768,-32768,    93,-32768,   246,   246,   246,
00942    246,   246,   262,-32768,   214,   222,-32768,-32768,   552,   -17,
00943 -32768,   273,    33,   272,   274,   275,-32768,    95,-32768,-32768,
00944 -32768,-32768,   228,   223,-32768,-32768,-32768,    93,   227,   246,
00945 -32768,   523,-32768,-32768,-32768,-32768,     2,   276,   232,-32768,
00946    232,   283,    51,    93,   234,   187,   160,-32768,-32768,   183,
00947 -32768,     3,   246,-32768,-32768,   233,   235,-32768,   236,-32768,
00948     24,   599,   112,   175,   599,    82,   244,   246,   249,   246,
00949    246,   240,    95,    63,    95,   -22,    13,   192,   254,   231,
00950 -32768,-32768,   255,-32768,-32768,    36,   610,   269,   285,-32768,
00951    171,    -4,-32768,-32768,-32768,    93,    93,   317,-32768,   318,
00952 -32768,   568,-32768,-32768,-32768,    36,   246,   595,-32768,   610,
00953    132,   610,-32768,-32768,-32768,   254,-32768,   264,   297,   172,
00954 -32768,   281,-32768,   282,-32768,-32768,-32768,   246,   529,-32768,
00955    278,   336,   296,-32768,   201,   177,   246,-32768,   246,-32768,
00956    246,   246,-32768,-32768,     1,    95,   119,   246,   433,-32768,
00957    329,-32768,   308,-32768,-32768,   610,   494,   509,   610,-32768,
00958    307,   328,-32768,   320,   310,-32768,-32768,-32768,-32768,    25,
00959    345,   365,   366,   332,   341,   351,   352,   330,   386,   347,
00960    350,-32768,-32768,   367,   353,   354,-32768,   410,   417,-32768
00961 };
00962 
00963 static const short yypgoto[] = {-32768,
00964 -32768,   384,-32768,   266,-32768,-32768,-32768,-32768,   355,   230,
00965 -32768,-32768,-32768,-32768,-32768,   -48,-32768,  -121,-32768,   190,
00966 -32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,   383,  -134,
00967    -90,-32768,   -79,   -20,   356,   429,   218,     0,   -47,-32768,
00968 -32768,-32768,   242,-32768,-32768,   287
00969 };
00970 
00971 
00972 #define YYLAST      667
00973 
00974 
00975 static const short yytable[] = {    46,
00976    161,   120,   128,    85,   147,   156,   192,   189,    58,    59,
00977     60,    82,   158,    66,    71,    72,    73,    74,    75,    76,
00978    108,   109,   110,   111,   181,    94,   171,   -93,    95,   198,
00979    112,     2,    99,   230,   -94,   231,   216,    86,    87,   121,
00980     52,   282,   113,     2,  -131,   118,   155,    88,   119,    86,
00981     87,   283,   166,   169,   148,   114,   115,    79,    67,    88,
00982    199,   239,   270,   192,   159,  -131,   224,   225,   232,   226,
00983    233,     3,     4,    89,   116,   227,    54,    55,     7,   138,
00984      8,     9,    10,    11,   163,    89,    56,    57,    90,   183,
00985    121,    15,    16,    17,   184,   125,   126,   167,    67,    82,
00986     90,   121,    18,    19,   102,    20,   113,   172,   173,   174,
00987    175,   176,    96,    26,    27,    28,   110,   195,    98,   114,
00988    115,    29,   224,   225,   112,   161,   245,   246,    33,    68,
00989     69,   227,   221,    85,   192,   122,   113,    97,   116,   197,
00990    123,    30,    31,    32,   104,   124,   125,   126,   161,   114,
00991    115,   183,     1,     2,     3,     4,   124,   125,   126,     5,
00992      6,     7,   212,     8,     9,    10,    11,   105,   116,    12,
00993     13,    14,   118,   252,    15,    16,    17,   218,   121,   220,
00994    222,   256,   133,   229,   100,    18,    19,   112,    20,    21,
00995     22,    23,    24,    25,   118,   -87,    26,    27,    28,   113,
00996    -87,   101,   102,    14,    29,   138,   134,    30,    31,    32,
00997    139,    33,   114,   115,   140,   140,   220,   142,   152,   141,
00998    209,    21,    22,    23,    24,    25,   242,   143,   183,   153,
00999    243,   116,   138,   255,   125,   126,   265,   259,   210,    30,
01000     31,    32,   138,   211,   154,   207,   266,   234,   267,   235,
01001    268,   269,    53,    51,     3,     4,   138,   272,   264,    54,
01002     55,     7,   170,     8,     9,    10,    11,   164,   177,    56,
01003     57,   165,   178,   179,    15,    16,    17,   182,   189,   193,
01004    190,   191,   194,   196,   200,    18,    19,   202,    20,   203,
01005    206,   223,   213,   237,   214,   215,    26,    27,    28,   108,
01006    109,   110,   111,   217,    29,    61,   219,     3,     4,   112,
01007    238,    33,    54,    55,     7,   236,     8,     9,    10,    11,
01008    240,   113,    56,    57,     2,   253,   248,    15,    16,    17,
01009    108,   109,   110,   111,   114,   115,   241,   261,    18,    19,
01010    112,    20,   257,   258,   262,   108,   109,   110,   111,    26,
01011     27,    28,   113,   116,   263,   112,   274,    29,   254,   275,
01012    108,   109,   110,   111,    33,   114,   115,   113,   278,   281,
01013    112,   280,   284,   285,   286,   108,   109,   110,   111,   288,
01014    114,   115,   113,   287,   116,   112,   289,   290,   291,   279,
01015    108,   109,   110,   111,   292,   114,   115,   113,   293,   116,
01016    112,   294,   295,   135,   296,   108,   109,   110,   111,   299,
01017    114,   115,   113,   297,   116,   112,   300,   103,   136,   205,
01018    108,   109,   110,   111,   107,   114,   115,   113,    44,   116,
01019    112,   244,   151,   137,   250,   108,   109,   110,   111,   204,
01020    114,   115,   113,   157,   116,   112,   271,     0,   144,   247,
01021      0,   108,   109,   110,   111,   114,   115,   113,     0,   116,
01022      0,   112,  -127,   162,     0,  -127,  -127,  -127,  -127,     0,
01023    114,   115,     0,   113,   116,  -127,     0,     0,   168,     0,
01024    108,   109,   110,   111,     0,     0,   114,   115,     0,   116,
01025    112,     0,     0,   273,     0,     0,   108,   109,   110,   111,
01026   -127,  -127,   113,     0,    51,   116,   112,     0,   145,     0,
01027      0,   108,   109,   110,   111,   114,   115,     0,   113,  -127,
01028      0,   112,  -108,     0,     0,  -108,  -108,  -108,  -108,     0,
01029      0,   114,   115,   113,   116,  -108,     2,   146,     0,     0,
01030      0,     0,    86,    87,     0,     0,   114,   115,     0,     0,
01031    116,     0,    88,   276,   108,   109,   110,   111,     0,     0,
01032   -108,  -108,     0,     0,   112,   116,     0,     0,   277,     0,
01033    108,   109,   110,   111,     0,     0,   113,     0,    89,  -108,
01034    112,     0,     0,   180,     0,     0,   260,     0,     0,   114,
01035    115,     0,   113,    90,     0,     0,     0,   108,   109,   110,
01036    111,   108,   109,   110,   249,   114,   115,   112,   116,     0,
01037      0,   112,   108,   109,   110,   111,     0,     0,     0,   113,
01038      0,     0,   112,   113,   116,     0,     0,     0,     0,     0,
01039      0,   251,   114,   115,   113,     0,   114,   115,     0,     0,
01040      0,     0,     0,     0,     0,     0,     0,   114,   115,     0,
01041      0,   116,     0,     0,     0,   116,     0,     0,     0,     0,
01042      0,     0,     0,     0,     0,     0,   116
01043 };
01044 
01045 static const short yycheck[] = {     0,
01046     91,    49,    51,    24,     9,    85,   128,     7,     9,    10,
01047     11,     7,     9,     7,    15,    16,    17,    18,    19,    20,
01048      3,     4,     5,     6,    42,    26,   106,     0,    29,    28,
01049     13,     8,    33,    56,     0,    58,   171,    14,    15,     7,
01050     52,    17,    25,     8,    42,    63,    42,    24,    49,    14,
01051     15,    27,     7,     7,    59,    38,    39,     7,    52,    24,
01052     59,   196,    62,   185,    61,    63,     4,     5,    56,     7,
01053     58,     9,    10,    50,    57,    13,    14,    15,    16,    56,
01054     18,    19,    20,    21,    67,    50,    24,    25,    65,    57,
01055      7,    29,    30,    31,    62,    63,    64,    52,    52,     7,
01056     65,     7,    40,    41,    25,    43,    25,   108,   109,   110,
01057    111,   112,     7,    51,    52,    53,     5,   138,    25,    38,
01058     39,    59,     4,     5,    13,   216,   206,   207,    66,    22,
01059     23,    13,   180,   154,   256,    52,    25,     7,    57,   140,
01060     57,    62,    63,    64,    55,    62,    63,    64,   239,    38,
01061     39,    57,     7,     8,     9,    10,    62,    63,    64,    14,
01062     15,    16,   163,    18,    19,    20,    21,    12,    57,    24,
01063     25,    26,    63,    42,    29,    30,    31,   178,     7,   180,
01064    181,   230,    56,   184,     7,    40,    41,    13,    43,    44,
01065     45,    46,    47,    48,    63,    56,    51,    52,    53,    25,
01066     61,    24,    25,    26,    59,    56,     7,    62,    63,    64,
01067     61,    66,    38,    39,    56,    56,   217,    60,    28,    61,
01068     61,    44,    45,    46,    47,    48,    56,    60,    57,    56,
01069     60,    57,    56,    62,    63,    64,    60,   238,    56,    62,
01070     63,    64,    56,    61,    56,    59,   247,    56,   249,    58,
01071    251,   252,     7,    42,     9,    10,    56,   258,    58,    14,
01072     15,    16,    55,    18,    19,    20,    21,    62,     7,    24,
01073     25,    63,    59,    52,    29,    30,    31,     5,     7,    52,
01074      7,     7,    60,    57,     9,    40,    41,    56,    43,     7,
01075     57,    52,    60,    63,    60,    60,    51,    52,    53,     3,
01076      4,     5,     6,    60,    59,     7,    58,     9,    10,    13,
01077     56,    66,    14,    15,    16,    62,    18,    19,    20,    21,
01078     52,    25,    24,    25,     8,    62,     9,    29,    30,    31,
01079      3,     4,     5,     6,    38,    39,    52,    60,    40,    41,
01080     13,    43,    62,    62,     9,     3,     4,     5,     6,    51,
01081     52,    53,    25,    57,    59,    13,    28,    59,    62,    52,
01082      3,     4,     5,     6,    66,    38,    39,    25,    62,    60,
01083     13,    52,    28,     9,     9,     3,     4,     5,     6,    39,
01084     38,    39,    25,    52,    57,    13,    36,    36,    59,    62,
01085      3,     4,     5,     6,     9,    38,    39,    25,    52,    57,
01086     13,    52,    36,    61,    52,     3,     4,     5,     6,     0,
01087     38,    39,    25,    60,    57,    13,     0,    34,    61,   154,
01088      3,     4,     5,     6,    42,    38,    39,    25,     0,    57,
01089     13,   202,    78,    61,   217,     3,     4,     5,     6,   153,
01090     38,    39,    25,    88,    57,    13,   257,    -1,    61,   208,
01091     -1,     3,     4,     5,     6,    38,    39,    25,    -1,    57,
01092     -1,    13,     0,    61,    -1,     3,     4,     5,     6,    -1,
01093     38,    39,    -1,    25,    57,    13,    -1,    -1,    61,    -1,
01094      3,     4,     5,     6,    -1,    -1,    38,    39,    -1,    57,
01095     13,    -1,    -1,    61,    -1,    -1,     3,     4,     5,     6,
01096     38,    39,    25,    -1,    42,    57,    13,    -1,    60,    -1,
01097     -1,     3,     4,     5,     6,    38,    39,    -1,    25,    57,
01098     -1,    13,     0,    -1,    -1,     3,     4,     5,     6,    -1,
01099     -1,    38,    39,    25,    57,    13,     8,    60,    -1,    -1,
01100     -1,    -1,    14,    15,    -1,    -1,    38,    39,    -1,    -1,
01101     57,    -1,    24,    60,     3,     4,     5,     6,    -1,    -1,
01102     38,    39,    -1,    -1,    13,    57,    -1,    -1,    60,    -1,
01103      3,     4,     5,     6,    -1,    -1,    25,    -1,    50,    57,
01104     13,    -1,    -1,    32,    -1,    -1,    58,    -1,    -1,    38,
01105     39,    -1,    25,    65,    -1,    -1,    -1,     3,     4,     5,
01106      6,     3,     4,     5,    37,    38,    39,    13,    57,    -1,
01107     -1,    13,     3,     4,     5,     6,    -1,    -1,    -1,    25,
01108     -1,    -1,    13,    25,    57,    -1,    -1,    -1,    -1,    -1,
01109     -1,    37,    38,    39,    25,    -1,    38,    39,    -1,    -1,
01110     -1,    -1,    -1,    -1,    -1,    -1,    -1,    38,    39,    -1,
01111     -1,    57,    -1,    -1,    -1,    57,    -1,    -1,    -1,    -1,
01112     -1,    -1,    -1,    -1,    -1,    -1,    57
01113 };
01114 
01115 #line 325 "/usr/local/lib/bison.cc"
01116  /* fattrs + tables */
01117 
01118 /* parser code folow  */
01119 
01120 
01121 /* This is the parser code that is written into each bison parser
01122   when the %semantic_parser declaration is not specified in the grammar.
01123   It was written by Richard Stallman by simplifying the hairy parser
01124   used when %semantic_parser is specified.  */
01125 
01126 /* Note: dollar marks section change
01127    the next  is replaced by the list of actions, each action
01128    as one case of the switch.  */ 
01129 
01130 #if YY_SSLParser_USE_GOTO != 0
01131 /* 
01132  SUPRESSION OF GOTO : on some C++ compiler (sun c++)
01133   the goto is strictly forbidden if any constructor/destructor
01134   is used in the whole function (very stupid isn't it ?)
01135  so goto are to be replaced with a 'while/switch/case construct'
01136  here are the macro to keep some apparent compatibility
01137 */
01138 #define YYGOTO(lb) {yy_gotostate=lb;continue;}
01139 #define YYBEGINGOTO  enum yy_labels yy_gotostate=yygotostart; \
01140                      for(;;) switch(yy_gotostate) { case yygotostart: {
01141 #define YYLABEL(lb) } case lb: {
01142 #define YYENDGOTO } } 
01143 #define YYBEGINDECLARELABEL enum yy_labels {yygotostart
01144 #define YYDECLARELABEL(lb) ,lb
01145 #define YYENDDECLARELABEL  };
01146 #else
01147 /* macro to keep goto */
01148 #define YYGOTO(lb) goto lb
01149 #define YYBEGINGOTO 
01150 #define YYLABEL(lb) lb:
01151 #define YYENDGOTO
01152 #define YYBEGINDECLARELABEL 
01153 #define YYDECLARELABEL(lb)
01154 #define YYENDDECLARELABEL 
01155 #endif
01156 /* LABEL DECLARATION */
01157 YYBEGINDECLARELABEL
01158   YYDECLARELABEL(yynewstate)
01159   YYDECLARELABEL(yybackup)
01160 /* YYDECLARELABEL(yyresume) */
01161   YYDECLARELABEL(yydefault)
01162   YYDECLARELABEL(yyreduce)
01163   YYDECLARELABEL(yyerrlab)   /* here on detecting error */
01164   YYDECLARELABEL(yyerrlab1)   /* here on error raised explicitly by an action */
01165   YYDECLARELABEL(yyerrdefault)  /* current state does not do anything special for the error token. */
01166   YYDECLARELABEL(yyerrpop)   /* pop the current state because it cannot handle the error token */
01167   YYDECLARELABEL(yyerrhandle)  
01168 YYENDDECLARELABEL
01169 /* ALLOCA SIMULATION */
01170 /* __HAVE_NO_ALLOCA */
01171 #ifdef __HAVE_NO_ALLOCA
01172 static int __alloca_free_ptr(char *ptr,char *ref)
01173 {if(ptr!=ref) free(ptr);
01174  return 0;}
01175 
01176 #define __ALLOCA_alloca(size) malloc(size)
01177 #define __ALLOCA_free(ptr,ref) __alloca_free_ptr((char *)ptr,(char *)ref)
01178 
01179 #ifdef YY_SSLParser_LSP_NEEDED
01180 #define __ALLOCA_return(num) \
01181             return( __ALLOCA_free(yyss,yyssa)+\
01182             __ALLOCA_free(yyvs,yyvsa)+\
01183             __ALLOCA_free(yyls,yylsa)+\
01184            (num))
01185 #else
01186 #define __ALLOCA_return(num) \
01187             return( __ALLOCA_free(yyss,yyssa)+\
01188             __ALLOCA_free(yyvs,yyvsa)+\
01189            (num))
01190 #endif
01191 #else
01192 #define __ALLOCA_return(num) return(num)
01193 #define __ALLOCA_alloca(size) alloca(size)
01194 #define __ALLOCA_free(ptr,ref) 
01195 #endif
01196 
01197 /* ENDALLOCA SIMULATION */
01198 
01199 #define yyerrok         (yyerrstatus = 0)
01200 #define yyclearin       (YY_SSLParser_CHAR = YYEMPTY)
01201 #define YYEMPTY         -2
01202 #define YYEOF           0
01203 #define YYACCEPT        __ALLOCA_return(0)
01204 #define YYABORT         __ALLOCA_return(1)
01205 #define YYERROR         YYGOTO(yyerrlab1)
01206 /* Like YYERROR except do call yyerror.
01207    This remains here temporarily to ease the
01208    transition to the new meaning of YYERROR, for GCC.
01209    Once GCC version 2 has supplanted version 1, this can go.  */
01210 #define YYFAIL          YYGOTO(yyerrlab)
01211 #define YYRECOVERING()  (!!yyerrstatus)
01212 #define YYBACKUP(token, value) \
01213 do                                                              \
01214   if (YY_SSLParser_CHAR == YYEMPTY && yylen == 1)                               \
01215     { YY_SSLParser_CHAR = (token), YY_SSLParser_LVAL = (value);                 \
01216       yychar1 = YYTRANSLATE (YY_SSLParser_CHAR);                                \
01217       YYPOPSTACK;                                               \
01218       YYGOTO(yybackup);                                            \
01219     }                                                           \
01220   else                                                          \
01221     { YY_SSLParser_ERROR ("syntax error: cannot back up"); YYERROR; }   \
01222 while (0)
01223 
01224 #define YYTERROR        1
01225 #define YYERRCODE       256
01226 
01227 #ifndef YY_SSLParser_PURE
01228 /* UNPURE */
01229 #define YYLEX           YY_SSLParser_LEX()
01230 #ifndef YY_USE_CLASS
01231 /* If nonreentrant, and not class , generate the variables here */
01232 int     YY_SSLParser_CHAR;                      /*  the lookahead symbol        */
01233 YY_SSLParser_STYPE      YY_SSLParser_LVAL;              /*  the semantic value of the */
01234                 /*  lookahead symbol    */
01235 int YY_SSLParser_NERRS;                 /*  number of parse errors so far */
01236 #ifdef YY_SSLParser_LSP_NEEDED
01237 YY_SSLParser_LTYPE YY_SSLParser_LLOC;   /*  location data for the lookahead     */
01238             /*  symbol                              */
01239 #endif
01240 #endif
01241 
01242 
01243 #else
01244 /* PURE */
01245 #ifdef YY_SSLParser_LSP_NEEDED
01246 #define YYLEX           YY_SSLParser_LEX(&YY_SSLParser_LVAL, &YY_SSLParser_LLOC)
01247 #else
01248 #define YYLEX           YY_SSLParser_LEX(&YY_SSLParser_LVAL)
01249 #endif
01250 #endif
01251 #ifndef YY_USE_CLASS
01252 #if YY_SSLParser_DEBUG != 0
01253 int YY_SSLParser_DEBUG_FLAG;                    /*  nonzero means print parse trace     */
01254 /* Since this is uninitialized, it does not stop multiple parsers
01255    from coexisting.  */
01256 #endif
01257 #endif
01258 
01259 
01260 
01261 /*  YYINITDEPTH indicates the initial size of the parser's stacks       */
01262 
01263 #ifndef YYINITDEPTH
01264 #define YYINITDEPTH 200
01265 #endif
01266 
01267 /*  YYMAXDEPTH is the maximum size the stacks can grow to
01268     (effective only if the built-in stack extension method is used).  */
01269 
01270 #if YYMAXDEPTH == 0
01271 #undef YYMAXDEPTH
01272 #endif
01273 
01274 #ifndef YYMAXDEPTH
01275 #define YYMAXDEPTH 10000
01276 #endif
01277 
01278 
01279 #if __GNUC__ > 1                /* GNU C and GNU C++ define this.  */
01280 #define __yy_bcopy(FROM,TO,COUNT)       __builtin_memcpy(TO,FROM,COUNT)
01281 #else                           /* not GNU C or C++ */
01282 
01283 /* This is the most reliable way to avoid incompatibilities
01284    in available built-in functions on various systems.  */
01285 
01286 #ifdef __cplusplus
01287 static void __yy_bcopy (char *from, char *to, int count)
01288 #else
01289 #ifdef __STDC__
01290 static void __yy_bcopy (char *from, char *to, int count)
01291 #else
01292 static void __yy_bcopy (from, to, count)
01293      char *from;
01294      char *to;
01295      int count;
01296 #endif
01297 #endif
01298 {
01299   register char *f = from;
01300   register char *t = to;
01301   register int i = count;
01302 
01303   while (i-- > 0)
01304     *t++ = *f++;
01305 }
01306 #endif
01307 
01308 int
01309 #ifdef YY_USE_CLASS
01310  YY_SSLParser_CLASS::
01311 #endif
01312      YY_SSLParser_PARSE(YY_SSLParser_PARSE_PARAM)
01313 #ifndef __STDC__
01314 #ifndef __cplusplus
01315 #ifndef YY_USE_CLASS
01316 /* parameter definition without protypes */
01317 YY_SSLParser_PARSE_PARAM_DEF
01318 #endif
01319 #endif
01320 #endif
01321 {
01322   register int yystate;
01323   register int yyn;
01324   register short *yyssp;
01325   register YY_SSLParser_STYPE *yyvsp;
01326   int yyerrstatus;      /*  number of tokens to shift before error messages enabled */
01327   int yychar1=0;          /*  lookahead token as an internal (translated) token number */
01328 
01329   short yyssa[YYINITDEPTH];     /*  the state stack                     */
01330   YY_SSLParser_STYPE yyvsa[YYINITDEPTH];        /*  the semantic value stack            */
01331 
01332   short *yyss = yyssa;          /*  refer to the stacks thru separate pointers */
01333   YY_SSLParser_STYPE *yyvs = yyvsa;     /*  to allow yyoverflow to reallocate them elsewhere */
01334 
01335 #ifdef YY_SSLParser_LSP_NEEDED
01336   YY_SSLParser_LTYPE yylsa[YYINITDEPTH];        /*  the location stack                  */
01337   YY_SSLParser_LTYPE *yyls = yylsa;
01338   YY_SSLParser_LTYPE *yylsp;
01339 
01340 #define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
01341 #else
01342 #define YYPOPSTACK   (yyvsp--, yyssp--)
01343 #endif
01344 
01345   int yystacksize = YYINITDEPTH;
01346 
01347 #ifdef YY_SSLParser_PURE
01348   int YY_SSLParser_CHAR;
01349   YY_SSLParser_STYPE YY_SSLParser_LVAL;
01350   int YY_SSLParser_NERRS;
01351 #ifdef YY_SSLParser_LSP_NEEDED
01352   YY_SSLParser_LTYPE YY_SSLParser_LLOC;
01353 #endif
01354 #endif
01355 
01356   YY_SSLParser_STYPE yyval;             /*  the variable used to return         */
01357                 /*  semantic values from the action     */
01358                 /*  routines                            */
01359 
01360   int yylen;
01361 /* start loop, in which YYGOTO may be used. */
01362 YYBEGINGOTO
01363 
01364 #if YY_SSLParser_DEBUG != 0
01365   if (YY_SSLParser_DEBUG_FLAG)
01366     fprintf(stderr, "Starting parse\n");
01367 #endif
01368   yystate = 0;
01369   yyerrstatus = 0;
01370   YY_SSLParser_NERRS = 0;
01371   YY_SSLParser_CHAR = YYEMPTY;          /* Cause a token to be read.  */
01372 
01373   /* Initialize stack pointers.
01374      Waste one element of value and location stack
01375      so that they stay on the same level as the state stack.
01376      The wasted elements are never initialized.  */
01377 
01378   yyssp = yyss - 1;
01379   yyvsp = yyvs;
01380 #ifdef YY_SSLParser_LSP_NEEDED
01381   yylsp = yyls;
01382 #endif
01383 
01384 /* Push a new state, which is found in  yystate  .  */
01385 /* In all cases, when you get here, the value and location stacks
01386    have just been pushed. so pushing a state here evens the stacks.  */
01387 YYLABEL(yynewstate)
01388 
01389   *++yyssp = yystate;
01390 
01391   if (yyssp >= yyss + yystacksize - 1)
01392     {
01393       /* Give user a chance to reallocate the stack */
01394       /* Use copies of these so that the &'s don't force the real ones into memory. */
01395       YY_SSLParser_STYPE *yyvs1 = yyvs;
01396       short *yyss1 = yyss;
01397 #ifdef YY_SSLParser_LSP_NEEDED
01398       YY_SSLParser_LTYPE *yyls1 = yyls;
01399 #endif
01400 
01401       /* Get the current used size of the three stacks, in elements.  */
01402       int size = yyssp - yyss + 1;
01403 
01404 #ifdef yyoverflow
01405       /* Each stack pointer address is followed by the size of
01406      the data in use in that stack, in bytes.  */
01407 #ifdef YY_SSLParser_LSP_NEEDED
01408       /* This used to be a conditional around just the two extra args,
01409      but that might be undefined if yyoverflow is a macro.  */
01410       yyoverflow("parser stack overflow",
01411          &yyss1, size * sizeof (*yyssp),
01412          &yyvs1, size * sizeof (*yyvsp),
01413          &yyls1, size * sizeof (*yylsp),
01414          &yystacksize);
01415 #else
01416       yyoverflow("parser stack overflow",
01417          &yyss1, size * sizeof (*yyssp),
01418          &yyvs1, size * sizeof (*yyvsp),
01419          &yystacksize);
01420 #endif
01421 
01422       yyss = yyss1; yyvs = yyvs1;
01423 #ifdef YY_SSLParser_LSP_NEEDED
01424       yyls = yyls1;
01425 #endif
01426 #else /* no yyoverflow */
01427       /* Extend the stack our own way.  */
01428       if (yystacksize >= YYMAXDEPTH)
01429     {
01430       YY_SSLParser_ERROR("parser stack overflow");
01431       __ALLOCA_return(2);
01432     }
01433       yystacksize *= 2;
01434       if (yystacksize > YYMAXDEPTH)
01435     yystacksize = YYMAXDEPTH;
01436       yyss = (short *) __ALLOCA_alloca (yystacksize * sizeof (*yyssp));
01437       __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
01438       __ALLOCA_free(yyss1,yyssa);
01439       yyvs = (YY_SSLParser_STYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yyvsp));
01440       __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
01441       __ALLOCA_free(yyvs1,yyvsa);
01442 #ifdef YY_SSLParser_LSP_NEEDED
01443       yyls = (YY_SSLParser_LTYPE *) __ALLOCA_alloca (yystacksize * sizeof (*yylsp));
01444       __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
01445       __ALLOCA_free(yyls1,yylsa);
01446 #endif
01447 #endif /* no yyoverflow */
01448 
01449       yyssp = yyss + size - 1;
01450       yyvsp = yyvs + size - 1;
01451 #ifdef YY_SSLParser_LSP_NEEDED
01452       yylsp = yyls + size - 1;
01453 #endif
01454 
01455 #if YY_SSLParser_DEBUG != 0
01456       if (YY_SSLParser_DEBUG_FLAG)
01457     fprintf(stderr, "Stack size increased to %d\n", yystacksize);
01458 #endif
01459 
01460       if (yyssp >= yyss + yystacksize - 1)
01461     YYABORT;
01462     }
01463 
01464 #if YY_SSLParser_DEBUG != 0
01465   if (YY_SSLParser_DEBUG_FLAG)
01466     fprintf(stderr, "Entering state %d\n", yystate);
01467 #endif
01468 
01469   YYGOTO(yybackup);
01470 YYLABEL(yybackup)
01471 
01472 /* Do appropriate processing given the current state.  */
01473 /* Read a lookahead token if we need one and don't already have one.  */
01474 /* YYLABEL(yyresume) */
01475 
01476   /* First try to decide what to do without reference to lookahead token.  */
01477 
01478   yyn = yypact[yystate];
01479   if (yyn == YYFLAG)
01480     YYGOTO(yydefault);
01481 
01482   /* Not known => get a lookahead token if don't already have one.  */
01483 
01484   /* yychar is either YYEMPTY or YYEOF
01485      or a valid token in external form.  */
01486 
01487   if (YY_SSLParser_CHAR == YYEMPTY)
01488     {
01489 #if YY_SSLParser_DEBUG != 0
01490       if (YY_SSLParser_DEBUG_FLAG)
01491     fprintf(stderr, "Reading a token: ");
01492 #endif
01493       YY_SSLParser_CHAR = YYLEX;
01494     }
01495 
01496   /* Convert token to internal form (in yychar1) for indexing tables with */
01497 
01498   if (YY_SSLParser_CHAR <= 0)           /* This means end of input. */
01499     {
01500       yychar1 = 0;
01501       YY_SSLParser_CHAR = YYEOF;                /* Don't call YYLEX any more */
01502 
01503 #if YY_SSLParser_DEBUG != 0
01504       if (YY_SSLParser_DEBUG_FLAG)
01505     fprintf(stderr, "Now at end of input.\n");
01506 #endif
01507     }
01508   else
01509     {
01510       yychar1 = YYTRANSLATE(YY_SSLParser_CHAR);
01511 
01512 #if YY_SSLParser_DEBUG != 0
01513       if (YY_SSLParser_DEBUG_FLAG)
01514     {
01515       fprintf (stderr, "Next token is %d (%s", YY_SSLParser_CHAR, yytname[yychar1]);
01516       /* Give the individual parser a way to print the precise meaning
01517          of a token, for further debugging info.  */
01518 #ifdef YYPRINT
01519       YYPRINT (stderr, YY_SSLParser_CHAR, YY_SSLParser_LVAL);
01520 #endif
01521       fprintf (stderr, ")\n");
01522     }
01523 #endif
01524     }
01525 
01526   yyn += yychar1;
01527   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
01528     YYGOTO(yydefault);
01529 
01530   yyn = yytable[yyn];
01531 
01532   /* yyn is what to do for this token type in this state.
01533      Negative => reduce, -yyn is rule number.
01534      Positive => shift, yyn is new state.
01535        New state is final state => don't bother to shift,
01536        just return success.
01537      0, or most negative number => error.  */
01538 
01539   if (yyn < 0)
01540     {
01541       if (yyn == YYFLAG)
01542     YYGOTO(yyerrlab);
01543       yyn = -yyn;
01544       YYGOTO(yyreduce);
01545     }
01546   else if (yyn == 0)
01547     YYGOTO(yyerrlab);
01548 
01549   if (yyn == YYFINAL)
01550     YYACCEPT;
01551 
01552   /* Shift the lookahead token.  */
01553 
01554 #if YY_SSLParser_DEBUG != 0
01555   if (YY_SSLParser_DEBUG_FLAG)
01556     fprintf(stderr, "Shifting token %d (%s), ", YY_SSLParser_CHAR, yytname[yychar1]);
01557 #endif
01558 
01559   /* Discard the token being shifted unless it is eof.  */
01560   if (YY_SSLParser_CHAR != YYEOF)
01561     YY_SSLParser_CHAR = YYEMPTY;
01562 
01563   *++yyvsp = YY_SSLParser_LVAL;
01564 #ifdef YY_SSLParser_LSP_NEEDED
01565   *++yylsp = YY_SSLParser_LLOC;
01566 #endif
01567 
01568   /* count tokens shifted since error; after three, turn off error status.  */
01569   if (yyerrstatus) yyerrstatus--;
01570 
01571   yystate = yyn;
01572   YYGOTO(yynewstate);
01573 
01574 /* Do the default action for the current state.  */
01575 YYLABEL(yydefault)
01576 
01577   yyn = yydefact[yystate];
01578   if (yyn == 0)
01579     YYGOTO(yyerrlab);
01580 
01581 /* Do a reduction.  yyn is the number of a rule to reduce with.  */
01582 YYLABEL(yyreduce)
01583   yylen = yyr2[yyn];
01584   if (yylen > 0)
01585     yyval = yyvsp[1-yylen]; /* implement default value of the action */
01586 
01587 #if YY_SSLParser_DEBUG != 0
01588   if (YY_SSLParser_DEBUG_FLAG)
01589     {
01590       int i;
01591 
01592       fprintf (stderr, "Reducing via rule %d (line %d), ",
01593            yyn, yyrline[yyn]);
01594 
01595       /* Print the symbols being reduced, and their result.  */
01596       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
01597     fprintf (stderr, "%s ", yytname[yyrhs[i]]);
01598       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
01599     }
01600 #endif
01601 
01602 
01603 /* #line 811 "/usr/local/lib/bison.cc" */
01604 #line 1605 "sslparser.cpp"
01605 
01606   switch (yyn) {
01607 
01608 case 1:
01609 #line 220 "sslparser.y"
01610 {
01611             the_asgn = yyvsp[0].regtransfer;
01612         ;
01613     break;}
01614 case 2:
01615 #line 223 "sslparser.y"
01616 {
01617             the_asgn = new Assign(
01618                 new Terminal(opNil),
01619                 yyvsp[0].exp);
01620         ;
01621     break;}
01622 case 7:
01623 #line 239 "sslparser.y"
01624 {
01625             Dict.fetchExecCycle = yyvsp[0].rtlist;
01626         ;
01627     break;}
01628 case 14:
01629 #line 262 "sslparser.y"
01630 { Dict.fixupParams(); ;
01631     break;}
01632 case 17:
01633 #line 275 "sslparser.y"
01634 {
01635             // Note: the below copies the list of strings!
01636             Dict.DetParamMap[yyvsp[-4].str].params = *yyvsp[-1].parmlist;
01637             Dict.DetParamMap[yyvsp[-4].str].kind = PARAM_VARIANT;
01638             //delete $4;
01639         ;
01640     break;}
01641 case 18:
01642 #line 289 "sslparser.y"
01643 {
01644             std::map<std::string, InsNameElem*> m;
01645             ParamEntry &param = Dict.DetParamMap[yyvsp[-4].str];
01646             Statement* asgn = new Assign(yyvsp[-1].typ, new Terminal(opNil), yyvsp[0].exp);
01647             // Note: The below 2 copy lists of strings (to be deleted below!)
01648             param.params = *yyvsp[-3].parmlist;
01649             param.funcParams = *yyvsp[-2].parmlist;
01650             param.asgn = asgn;
01651             param.kind = PARAM_ASGN;
01652             
01653             if( param.funcParams.size() != 0 )
01654                 param.kind = PARAM_LAMBDA;
01655             //delete $2;
01656             //delete $3;
01657         ;
01658     break;}
01659 case 19:
01660 #line 306 "sslparser.y"
01661 { yyval.parmlist = yyvsp[-1].parmlist; ;
01662     break;}
01663 case 20:
01664 #line 307 "sslparser.y"
01665 { yyval.parmlist = new std::list<std::string>(); ;
01666     break;}
01667 case 21:
01668 #line 311 "sslparser.y"
01669 {
01670                     bFloat = false;
01671                 ;
01672     break;}
01673 case 23:
01674 #line 314 "sslparser.y"
01675 {
01676                     bFloat = true;
01677                 ;
01678     break;}
01679 case 27:
01680 #line 324 "sslparser.y"
01681 {
01682                 if (Dict.RegMap.find(yyvsp[-2].str) != Dict.RegMap.end())
01683                     yyerror("Name reglist decared twice\n");
01684                 Dict.RegMap[yyvsp[-2].str] = yyvsp[0].num;
01685             ;
01686     break;}
01687 case 28:
01688 #line 329 "sslparser.y"
01689 {
01690                 if (Dict.RegMap.find(yyvsp[-5].str) != Dict.RegMap.end())
01691                     yyerror("Name reglist declared twice\n");
01692                 Dict.addRegister( yyvsp[-5].str, yyvsp[0].num, yyvsp[-3].num, bFloat);
01693             ;
01694     break;}
01695 case 29:
01696 #line 334 "sslparser.y"
01697 {
01698                 if (Dict.RegMap.find(yyvsp[-9].str) != Dict.RegMap.end())
01699                     yyerror("Name reglist declared twice\n");
01700                 Dict.RegMap[yyvsp[-9].str] = yyvsp[-4].num;
01701                 // Now for detailed Reg information
01702                 if (Dict.DetRegMap.find(yyvsp[-4].num) != Dict.DetRegMap.end())
01703                     yyerror("Index used for more than one register\n");
01704                 Dict.DetRegMap[yyvsp[-4].num].s_name(yyvsp[-9].str);
01705                 Dict.DetRegMap[yyvsp[-4].num].s_size(yyvsp[-7].num);
01706                 Dict.DetRegMap[yyvsp[-4].num].s_address(NULL);
01707                 // check range is legitimate for size. 8,10
01708                 if ((Dict.RegMap.find(yyvsp[-2].str) == Dict.RegMap.end()) || (Dict.RegMap.find(yyvsp[0].str) == Dict.RegMap.end()))
01709                     yyerror("Undefined range\n");
01710                 else {
01711                     int bitsize = Dict.DetRegMap[Dict.RegMap[yyvsp[0].str]].g_size();
01712                     for (int i = Dict.RegMap[yyvsp[-2].str]; i != Dict.RegMap[yyvsp[0].str]; i++) {
01713                         if (Dict.DetRegMap.find(i) == Dict.DetRegMap.end()) {
01714                             yyerror("Not all regesters in range defined\n");
01715                             break;
01716                         }
01717                         bitsize += Dict.DetRegMap[i].g_size();
01718                         if (bitsize > yyvsp[-7].num) {
01719                             yyerror("Range exceeds size of register\n");
01720                             break;
01721                         }
01722                     }
01723                 if (bitsize < yyvsp[-7].num) 
01724                     yyerror("Register size is exceeds regesters in range\n");
01725                     // copy information
01726                 }
01727                 Dict.DetRegMap[yyvsp[-4].num].s_mappedIndex(Dict.RegMap[yyvsp[-2].str]);
01728                 Dict.DetRegMap[yyvsp[-4].num].s_mappedOffset(0);
01729                 Dict.DetRegMap[yyvsp[-4].num].s_float(bFloat);
01730             ;
01731     break;}
01732 case 30:
01733 #line 368 "sslparser.y"
01734 {
01735                 if (Dict.RegMap.find(yyvsp[-13].str) != Dict.RegMap.end())
01736                     yyerror("Name reglist declared twice\n");
01737                 Dict.RegMap[yyvsp[-13].str] = yyvsp[-8].num;
01738                 // Now for detailed Reg information
01739                 if (Dict.DetRegMap.find(yyvsp[-8].num) != Dict.DetRegMap.end())
01740                     yyerror("Index used for more than one register\n");
01741                 Dict.DetRegMap[yyvsp[-8].num].s_name(yyvsp[-13].str);
01742                 Dict.DetRegMap[yyvsp[-8].num].s_size(yyvsp[-11].num);
01743                 Dict.DetRegMap[yyvsp[-8].num].s_address(NULL);
01744                 // Do checks
01745                 if (yyvsp[-11].num != (yyvsp[-1].num - yyvsp[-3].num) + 1) 
01746                     yyerror("Size does not equal range\n");
01747                     if (Dict.RegMap.find(yyvsp[-6].str) != Dict.RegMap.end()) {
01748                         if (yyvsp[-1].num >= Dict.DetRegMap[Dict.RegMap[yyvsp[-6].str]].g_size())
01749                             yyerror("Range extends over target register\n");
01750                     } else 
01751                         yyerror("Shared index not yet defined\n");
01752                 Dict.DetRegMap[yyvsp[-8].num].s_mappedIndex(Dict.RegMap[yyvsp[-6].str]);
01753                 Dict.DetRegMap[yyvsp[-8].num].s_mappedOffset(yyvsp[-3].num);
01754                 Dict.DetRegMap[yyvsp[-8].num].s_float(bFloat);
01755             ;
01756     break;}
01757 case 31:
01758 #line 390 "sslparser.y"
01759 {
01760                 if ((int)yyvsp[-8].strlist->size() != (yyvsp[0].num - yyvsp[-2].num + 1)) {
01761                     std::cerr << "size of register array does not match mapping to r[" << yyvsp[-2].num << ".." << yyvsp[0].num << "]\n";
01762                     exit(1);
01763                 } else {
01764                     std::list<std::string>::iterator loc = yyvsp[-8].strlist->begin();
01765                     for (int x = yyvsp[-2].num; x <= yyvsp[0].num; x++, loc++) {
01766                         if (Dict.RegMap.find(*loc) != Dict.RegMap.end())
01767                             yyerror("Name reglist declared twice\n");
01768                         Dict.addRegister( loc->c_str(), x, yyvsp[-5].num, bFloat);
01769                     }
01770                     //delete $2;
01771                 }
01772             ;
01773     break;}
01774 case 32:
01775 #line 404 "sslparser.y"
01776 {
01777                 std::list<std::string>::iterator loc = yyvsp[-6].strlist->begin();
01778                 for (; loc != yyvsp[-6].strlist->end(); loc++) {
01779                     if (Dict.RegMap.find(*loc) != Dict.RegMap.end())
01780                         yyerror("Name reglist declared twice\n");
01781                     Dict.addRegister(loc->c_str(), yyvsp[0].num, yyvsp[-3].num, bFloat);
01782                 }
01783                 //delete $2;
01784             ;
01785     break;}
01786 case 33:
01787 #line 416 "sslparser.y"
01788 {
01789                 yyvsp[-2].strlist->push_back(yyvsp[0].str);
01790             ;
01791     break;}
01792 case 34:
01793 #line 419 "sslparser.y"
01794 {
01795                 yyval.strlist = new std::list<std::string>;
01796                 yyval.strlist->push_back(yyvsp[0].str);
01797             ;
01798     break;}
01799 case 35:
01800 #line 428 "sslparser.y"
01801 {
01802                 // Note: $2 is a list of strings
01803                 Dict.FlagFuncs[yyvsp[-5].str] = new FlagDef(listStrToExp(yyvsp[-4].parmlist), yyvsp[-1].rtlist);
01804             ;
01805     break;}
01806 case 36:
01807 #line 435 "sslparser.y"
01808 {
01809                 if (ConstTable.find(yyvsp[-2].str) != ConstTable.end())
01810                     yyerror("Constant declared twice");
01811                 ConstTable[std::string(yyvsp[-2].str)] = yyvsp[0].num;
01812             ;
01813     break;}
01814 case 37:
01815 #line 441 "sslparser.y"
01816 {
01817                 if (ConstTable.find(yyvsp[-4].str) != ConstTable.end())
01818                     yyerror("Constant declared twice");
01819                 else if (yyvsp[-1].str == std::string("-"))
01820                     ConstTable[std::string(yyvsp[-4].str)] = yyvsp[-2].num - yyvsp[0].num;
01821                 else if (yyvsp[-1].str == std::string("+"))
01822                     ConstTable[std::string(yyvsp[-4].str)] = yyvsp[-2].num + yyvsp[0].num;
01823                 else
01824                     yyerror("Constant expression must be NUM + NUM or NUM - NUM");
01825             ;
01826     break;}
01827 case 38:
01828 #line 455 "sslparser.y"
01829 {
01830             TableDict[yyvsp[-2].str] = yyvsp[0].tab;
01831         ;
01832     break;}
01833 case 39:
01834 #line 461 "sslparser.y"
01835 {
01836             yyval.tab = new Table(*yyvsp[0].namelist);
01837             //delete $1;
01838         ;
01839     break;}
01840 case 40:
01841 #line 466 "sslparser.y"
01842 {
01843             yyval.tab = new OpTable(*yyvsp[0].namelist);
01844             //delete $1;
01845         ;
01846     break;}
01847 case 41:
01848 #line 470 "sslparser.y"
01849 {
01850             yyval.tab = new ExprTable(*yyvsp[0].exprlist);
01851             //delete $1;
01852         ;
01853     break;}
01854 case 42:
01855 #line 477 "sslparser.y"
01856 {
01857             // cross-product of two str_expr's
01858             std::deque<std::string>::iterator i, j;
01859             yyval.namelist = new std::deque<std::string>;
01860             for (i = yyvsp[-1].namelist->begin(); i != yyvsp[-1].namelist->end(); i++)
01861                 for (j = yyvsp[0].namelist->begin(); j != yyvsp[0].namelist->end(); j++)
01862                     yyval.namelist->push_back((*i) + (*j));
01863             //delete $1;
01864             //delete $2;
01865         ;
01866     break;}
01867 case 43:
01868 #line 487 "sslparser.y"
01869 {
01870             yyval.namelist = yyvsp[0].namelist;
01871         ;
01872     break;}
01873 case 44:
01874 #line 493 "sslparser.y"
01875 {
01876             // want to append $3 to $1
01877             // The following causes a massive warning message about mixing signed and unsigned
01878             yyvsp[-2].namelist->insert(yyvsp[-2].namelist->end(), yyvsp[0].namelist->begin(), yyvsp[0].namelist->end());
01879             //delete $3;
01880             yyval.namelist = yyvsp[-2].namelist;
01881         ;
01882     break;}
01883 case 45:
01884 #line 500 "sslparser.y"
01885 {
01886             yyvsp[-3].namelist->push_back("");
01887         ;
01888     break;}
01889 case 46:
01890 #line 503 "sslparser.y"
01891 {
01892             yyval.namelist = yyvsp[0].namelist;
01893         ;
01894     break;}
01895 case 47:
01896 #line 509 "sslparser.y"
01897 {
01898             yyval.namelist = yyvsp[-1].namelist;
01899         ;
01900     break;}
01901 case 48:
01902 #line 512 "sslparser.y"
01903 {
01904             yyval.namelist = yyvsp[0].namelist;
01905         ;
01906     break;}
01907 case 49:
01908 #line 518 "sslparser.y"
01909 {
01910             yyval.namelist = new std::deque<std::string>;
01911             yyval.namelist->push_back("");
01912             yyval.namelist->push_back(yyvsp[-1].str);
01913         ;
01914     break;}
01915 case 50:
01916 #line 523 "sslparser.y"
01917 {
01918             yyval.namelist = new std::deque<std::string>(1, yyvsp[-1].str);
01919         ;
01920     break;}
01921 case 51:
01922 #line 526 "sslparser.y"
01923 {
01924             std::ostringstream o;
01925             // expand $2 from table of names
01926             if (TableDict.find(yyvsp[0].str) != TableDict.end())
01927                 if (TableDict[yyvsp[0].str]->getType() == NAMETABLE)
01928                     yyval.namelist = new std::deque<std::string>(TableDict[yyvsp[0].str]->records);
01929                 else {
01930                     o << "name " << yyvsp[0].str << " is not a NAMETABLE.\n";
01931                     yyerror(STR(o));
01932                 }
01933             else {
01934                 o << "could not dereference name " << yyvsp[0].str << "\n";
01935                 yyerror(STR(o));
01936             }
01937         ;
01938     break;}
01939 case 52:
01940 #line 541 "sslparser.y"
01941 {
01942             // try and expand $1 from table of names. if fail, expand using '"' NAME '"' rule
01943             if (TableDict.find(yyvsp[0].str) != TableDict.end())
01944                 if (TableDict[yyvsp[0].str]->getType() == NAMETABLE)
01945                     yyval.namelist = new std::deque<std::string>(TableDict[yyvsp[0].str]->records);
01946                 else {
01947                     std::ostringstream o;
01948                     o << "name " << yyvsp[0].str << " is not a NAMETABLE.\n";
01949                     yyerror(STR(o));
01950                 }
01951             else {
01952                 yyval.namelist = new std::deque<std::string>;
01953                 yyval.namelist->push_back(yyvsp[0].str);
01954             }
01955         ;
01956     break;}
01957 case 53:
01958 #line 559 "sslparser.y"
01959 {
01960             yyval.str = yyvsp[0].str;
01961         ;
01962     break;}
01963 case 54:
01964 #line 563 "sslparser.y"
01965 {
01966             yyval.str = yyvsp[0].str;
01967         ;
01968     break;}
01969 case 55:
01970 #line 567 "sslparser.y"
01971 {
01972             yyval.str = yyvsp[0].str;
01973         ;
01974     break;}
01975 case 56:
01976 #line 574 "sslparser.y"
01977 {
01978             yyval.namelist = yyvsp[-1].namelist;
01979         ;
01980     break;}
01981 case 57:
01982 #line 581 "sslparser.y"
01983 {
01984             yyval.namelist = yyvsp[-4].namelist;
01985             yyval.namelist->push_back(yyvsp[-1].str);
01986         ;
01987     break;}
01988 case 58:
01989 #line 585 "sslparser.y"
01990 {
01991             yyval.namelist = new std::deque<std::string>;
01992             yyval.namelist->push_back(yyvsp[-1].str);
01993         ;
01994     break;}
01995 case 59:
01996 #line 593 "sslparser.y"
01997 {
01998             yyval.exprlist = yyvsp[-1].exprlist;
01999         ;
02000     break;}
02001 case 60:
02002 #line 600 "sslparser.y"
02003 {
02004             yyval.exprlist = yyvsp[-4].exprlist;
02005             yyval.exprlist->push_back(yyvsp[-1].exp);
02006         ;
02007     break;}
02008 case 61:
02009 #line 604 "sslparser.y"
02010 {
02011             yyval.exprlist = new std::deque<Exp*>;
02012             yyval.exprlist->push_back(yyvsp[-1].exp);
02013         ;
02014     break;}
02015 case 62:
02016 #line 612 "sslparser.y"
02017 {
02018             yyvsp[0].insel->getrefmap(indexrefmap);
02019         //     $3           $4
02020         ;
02021     break;}
02022 case 63:
02023 #line 615 "sslparser.y"
02024 {
02025             // This function expands the tables and saves the expanded RTLs to the dictionary
02026             expandTables(yyvsp[-3].insel, yyvsp[-1].parmlist, yyvsp[0].rtlist, Dict);
02027         ;
02028     break;}
02029 case 64:
02030 #line 622 "sslparser.y"
02031 {
02032             yyval.insel = yyvsp[0].insel;
02033         ;
02034     break;}
02035 case 65:
02036 #line 625 "sslparser.y"
02037 {
02038             unsigned i;
02039             InsNameElem *temp;
02040             std::string nm = yyvsp[0].str;
02041             
02042             if (nm[0] == '^')
02043                 nm.replace(0, 1, "");
02044 
02045             // remove all " and _, from the decoration
02046             while ((i = nm.find("\"")) != nm.npos)
02047                 nm.replace(i,1,"");
02048             // replace all '.' with '_'s from the decoration
02049             while ((i = nm.find(".")) != nm.npos)
02050                 nm.replace(i,1,"_");
02051             while ((i = nm.find("_")) != nm.npos)
02052                 nm.replace(i,1,"");
02053  
02054             temp = new InsNameElem(nm.c_str());
02055             yyval.insel = yyvsp[-1].insel;
02056             yyval.insel->append(temp);
02057         ;
02058     break;}
02059 case 66:
02060 #line 649 "sslparser.y"
02061 {
02062             yyval.insel = new InsNameElem(yyvsp[0].str);
02063         ;
02064     break;}
02065 case 67:
02066 #line 652 "sslparser.y"
02067 {
02068             yyval.insel = yyvsp[0].insel;
02069         ;
02070     break;}
02071 case 68:
02072 #line 655 "sslparser.y"
02073 {
02074             yyval.insel = yyvsp[-1].insel;
02075             yyval.insel->append(yyvsp[0].insel);
02076         ;
02077     break;}
02078 case 69:
02079 #line 662 "sslparser.y"
02080 {
02081             yyval.insel = new InsOptionElem(yyvsp[-1].str);
02082         ;
02083     break;}
02084 case 70:
02085 #line 665 "sslparser.y"
02086 {
02087             std::ostringstream o;
02088             if (TableDict.find(yyvsp[-2].str) == TableDict.end()) {
02089                 o << "Table " << yyvsp[-2].str << " has not been declared.\n";
02090                 yyerror(STR(o));
02091             } else if ((yyvsp[-1].num < 0) || (yyvsp[-1].num >= (int)TableDict[yyvsp[-2].str]->records.size())) {
02092                 o << "Can't get element " << yyvsp[-1].num << " of table " << yyvsp[-2].str << ".\n";
02093                 yyerror(STR(o));
02094             } else
02095                 yyval.insel = new InsNameElem(TableDict[yyvsp[-2].str]->records[yyvsp[-1].num].c_str());
02096         ;
02097     break;}
02098 case 71:
02099 #line 678 "sslparser.y"
02100 {
02101             std::ostringstream o;
02102             if (TableDict.find(yyvsp[-2].str) == TableDict.end()) {
02103                 o << "Table " << yyvsp[-2].str << " has not been declared.\n";
02104                 yyerror(STR(o));
02105             } else
02106                 yyval.insel = new InsListElem(yyvsp[-2].str, TableDict[yyvsp[-2].str], yyvsp[-1].str);
02107         ;
02108     break;}
02109 case 72:
02110 #line 687 "sslparser.y"
02111 {
02112             std::ostringstream o;
02113             if (TableDict.find(yyvsp[-2].str) == TableDict.end()) {
02114                 o << "Table " << yyvsp[-2].str << " has not been declared.\n";
02115                 yyerror(STR(o));
02116             } else if ((yyvsp[-1].num < 0) || (yyvsp[-1].num >= (int)TableDict[yyvsp[-2].str]->records.size())) {
02117                 o << "Can't get element " << yyvsp[-1].num << " of table " << yyvsp[-2].str << ".\n";
02118                 yyerror(STR(o));
02119             } else
02120                 yyval.insel = new InsNameElem(TableDict[yyvsp[-2].str]->records[yyvsp[-1].num].c_str());
02121         ;
02122     break;}
02123 case 73:
02124 #line 698 "sslparser.y"
02125 {
02126             std::ostringstream o;
02127             if (TableDict.find(yyvsp[-2].str) == TableDict.end()) {
02128                 o << "Table " << yyvsp[-2].str << " has not been declared.\n";
02129                 yyerror(STR(o));
02130             } else
02131                 yyval.insel = new InsListElem(yyvsp[-2].str, TableDict[yyvsp[-2].str], yyvsp[-1].str);
02132         ;
02133     break;}
02134 case 74:
02135 #line 707 "sslparser.y"
02136 {
02137             yyval.insel = new InsNameElem(yyvsp[-1].str);
02138         ;
02139     break;}
02140 case 75:
02141 #line 713 "sslparser.y"
02142 {
02143             // append any automatically generated register transfers and clear the list they were stored in.
02144             // Do nothing for a NOP (i.e. $2 = 0)
02145             if (yyvsp[0].regtransfer != NULL) {
02146                 yyvsp[-1].rtlist->appendStmt(yyvsp[0].regtransfer);
02147             }
02148             yyval.rtlist = yyvsp[-1].rtlist;
02149         ;
02150     break;}
02151 case 76:
02152 #line 722 "sslparser.y"
02153 {
02154             yyval.rtlist = new RTL(STMT_ASSIGN);
02155             if (yyvsp[0].regtransfer != NULL)
02156                 yyval.rtlist->appendStmt(yyvsp[0].regtransfer);
02157         ;
02158     break;}
02159 case 77:
02160 #line 730 "sslparser.y"
02161 {
02162             yyval.regtransfer = yyvsp[0].regtransfer;
02163         ;
02164     break;}
02165 case 78:
02166 #line 736 "sslparser.y"
02167 {
02168             std::ostringstream o;
02169             if (Dict.FlagFuncs.find(yyvsp[-2].str) != Dict.FlagFuncs.end()) {
02170                 // Note: SETFFLAGS assigns to the floating point flags. All others to the integer flags
02171                 bool bFloat = strcmp(yyvsp[-2].str, "SETFFLAGS") == 0;
02172                 OPER op = bFloat ? opFflags : opFlags;
02173                 yyval.regtransfer = new Assign(
02174                     new Terminal(op),
02175                     new Binary(opFlagCall,
02176                         new Const(yyvsp[-2].str),
02177                         listExpToExp(yyvsp[-1].explist)));
02178             } else {
02179                 o << yyvsp[-2].str << " is not declared as a flag function.\n";
02180                 yyerror(STR(o));
02181             }
02182         ;
02183     break;}
02184 case 79:
02185 #line 752 "sslparser.y"
02186 {
02187             yyval.regtransfer = 0;
02188         ;
02189     break;}
02190 case 80:
02191 #line 756 "sslparser.y"
02192 {
02193             yyval.regtransfer = 0;
02194         ;
02195     break;}
02196 case 81:
02197 #line 759 "sslparser.y"
02198 {
02199         yyval.regtransfer = NULL;
02200     ;
02201     break;}
02202 case 82:
02203 #line 765 "sslparser.y"
02204 {
02205             // Not sure why the below is commented out (MVE)
02206 /*          Location* pFlag = Location::regOf(Dict.RegMap[$3]);
02207             $1->push_back(pFlag);
02208             $$ = $1;
02209 */          yyval.explist = 0;
02210         ;
02211     break;}
02212 case 83:
02213 #line 772 "sslparser.y"
02214 {
02215 /*          std::list<Exp*>* tmp = new std::list<Exp*>;
02216             Unary* pFlag = new Unary(opIdRegOf, Dict.RegMap[$1]);
02217             tmp->push_back(pFlag);
02218             $$ = tmp;
02219 */          yyval.explist = 0;
02220         ;
02221     break;}
02222 case 84:
02223 #line 783 "sslparser.y"
02224 {
02225             assert(yyvsp[0].str != 0);
02226             yyvsp[-2].parmlist->push_back(yyvsp[0].str);
02227             yyval.parmlist = yyvsp[-2].parmlist;
02228         ;
02229     break;}
02230 case 85:
02231 #line 789 "sslparser.y"
02232 {
02233             yyval.parmlist = new std::list<std::string>;
02234             yyval.parmlist->push_back(yyvsp[0].str);
02235         ;
02236     break;}
02237 case 86:
02238 #line 793 "sslparser.y"
02239 {
02240             yyval.parmlist = new std::list<std::string>;
02241         ;
02242     break;}
02243 case 87:
02244 #line 798 "sslparser.y"
02245 {
02246             Dict.ParamSet.insert(yyvsp[0].str);     // MVE: Likely wrong. Likely supposed to be OPERAND params only
02247             yyval.str = yyvsp[0].str;
02248         ;
02249     break;}
02250 case 88:
02251 #line 804 "sslparser.y"
02252 {
02253             yyval.explist->push_back(yyvsp[0].exp);
02254         ;
02255     break;}
02256 case 89:
02257 #line 808 "sslparser.y"
02258 {
02259             yyval.explist = new std::list<Exp*>;
02260             yyval.explist->push_back(yyvsp[0].exp);
02261         ;
02262     break;}
02263 case 90:
02264 #line 813 "sslparser.y"
02265 {
02266             yyval.explist = new std::list<Exp*>;
02267         ;
02268     break;}
02269 case 91:
02270 #line 821 "sslparser.y"
02271 {
02272             Assign* a = new Assign(yyvsp[-5].typ, yyvsp[-2].exp, yyvsp[0].exp);
02273             a->setGuard(yyvsp[-4].exp);
02274             yyval.regtransfer = a;
02275         ;
02276     break;}
02277 case 92:
02278 #line 828 "sslparser.y"
02279 {
02280             // update the size of any generated RT's
02281             yyval.regtransfer = new Assign(yyvsp[-3].typ, yyvsp[-2].exp, yyvsp[0].exp);
02282         ;
02283     break;}
02284 case 93:
02285 #line 834 "sslparser.y"
02286 {
02287             yyval.regtransfer = new Assign(
02288                 new Terminal(opNil),
02289                 new Terminal(opFpush));
02290         ;
02291     break;}
02292 case 94:
02293 #line 839 "sslparser.y"
02294 {
02295             yyval.regtransfer = new Assign(
02296                 new Terminal(opNil),
02297                 new Terminal(opFpop));
02298         ;
02299     break;}
02300 case 95:
02301 #line 846 "sslparser.y"
02302 {
02303             yyval.regtransfer = new Assign(yyvsp[-1].typ, NULL, yyvsp[0].exp);
02304         ;
02305     break;}
02306 case 96:
02307 #line 852 "sslparser.y"
02308 {
02309             yyval.exp = new Const(yyvsp[0].num);
02310         ;
02311     break;}
02312 case 97:
02313 #line 856 "sslparser.y"
02314 {
02315             yyval.exp = new Const(yyvsp[0].dbl);
02316         ;
02317     break;}
02318 case 98:
02319 #line 860 "sslparser.y"
02320 {
02321             yyval.exp = yyvsp[-1].exp;
02322         ;
02323     break;}
02324 case 99:
02325 #line 864 "sslparser.y"
02326 {
02327             yyval.exp = yyvsp[0].exp;
02328         ;
02329     break;}
02330 case 100:
02331 #line 868 "sslparser.y"
02332 {
02333             yyval.exp = new Ternary(opTern, yyvsp[-5].exp, yyvsp[-3].exp, yyvsp[-1].exp);
02334         ;
02335     break;}
02336 case 101:
02337 #line 873 "sslparser.y"
02338 {
02339             yyval.exp = new Unary(opAddrOf, yyvsp[-1].exp);
02340         ;
02341     break;}
02342 case 102:
02343 #line 878 "sslparser.y"
02344 {
02345             yyval.exp = new Ternary(strToOper(yyvsp[-6].str), new Const(yyvsp[-5].num), new Const(yyvsp[-3].num), yyvsp[-1].exp);
02346         ;
02347     break;}
02348 case 103:
02349 #line 883 "sslparser.y"
02350 {
02351             yyval.exp = new Unary(opFtrunc, yyvsp[-1].exp);
02352         ;
02353     break;}
02354 case 104:
02355 #line 888 "sslparser.y"
02356 {
02357             yyval.exp = new Unary(opFabs, yyvsp[-1].exp);
02358         ;
02359     break;}
02360 case 105:
02361 #line 893 "sslparser.y"
02362 {
02363             yyval.exp = new Terminal(opFpush);
02364         ;
02365     break;}
02366 case 106:
02367 #line 896 "sslparser.y"
02368 {
02369             yyval.exp = new Terminal(opFpop);
02370         ;
02371     break;}
02372 case 107:
02373 #line 901 "sslparser.y"
02374 {
02375             yyval.exp = new Unary(strToOper(yyvsp[-2].str), yyvsp[-1].exp);
02376         ;
02377     break;}
02378 case 108:
02379 #line 907 "sslparser.y"
02380 {
02381             std::ostringstream o;
02382             if (indexrefmap.find(yyvsp[-1].str) == indexrefmap.end()) {
02383                 o << "index " << yyvsp[-1].str << " not declared for use.\n";
02384                 yyerror(STR(o));
02385             } else if (TableDict.find(yyvsp[-2].str) == TableDict.end()) {
02386                 o << "table " << yyvsp[-2].str << " not declared for use.\n";
02387                 yyerror(STR(o));
02388             } else if (TableDict[yyvsp[-2].str]->getType() != EXPRTABLE) {
02389                 o << "table " << yyvsp[-2].str << " is not an expression table but appears to be used as one.\n";
02390                 yyerror(STR(o));
02391             } else if ((int)((ExprTable*)TableDict[yyvsp[-2].str])->expressions.size() < indexrefmap[yyvsp[-1].str]->ntokens()) {
02392                 o << "table " << yyvsp[-2].str << " (" << ((ExprTable*)TableDict[yyvsp[-2].str])->expressions.size() <<
02393                     ") is too small to use " << yyvsp[-1].str << " (" << indexrefmap[yyvsp[-1].str]->ntokens() << ") as an index.\n";
02394                 yyerror(STR(o));
02395             }
02396             // $1 is a map from string to Table*; $2 is a map from string to InsNameElem*
02397             yyval.exp = new Binary(opExpTable, new Const(yyvsp[-2].str), new Const(yyvsp[-1].str));
02398         ;
02399     break;}
02400 case 109:
02401 #line 930 "sslparser.y"
02402 {
02403         std::ostringstream o;
02404         if (Dict.ParamSet.find(yyvsp[-2].str) != Dict.ParamSet.end() ) {
02405             if (Dict.DetParamMap.find(yyvsp[-2].str) != Dict.DetParamMap.end()) {
02406                 ParamEntry& param = Dict.DetParamMap[yyvsp[-2].str];
02407                 if (yyvsp[-1].explist->size() != param.funcParams.size() ) {
02408                     o << yyvsp[-2].str << " requires " << param.funcParams.size() << " parameters, but received " << yyvsp[-1].explist->size()
02409                         << ".\n";
02410                     yyerror(STR(o));
02411                 } else {
02412                     // Everything checks out. *phew* 
02413                     // Note: the below may not be right! (MVE)
02414                     yyval.exp = new Binary(opFlagDef,
02415                             new Const(yyvsp[-2].str),
02416                             listExpToExp(yyvsp[-1].explist));
02417                     //delete $2;            // Delete the list of char*s
02418                 }
02419             } else {
02420                 o << yyvsp[-2].str << " is not defined as a OPERAND function.\n";
02421                 yyerror(STR(o));
02422             }
02423         } else {
02424             o << "Unrecognized name " << yyvsp[-2].str << " in lambda call.\n";
02425         }
02426     ;
02427     break;}
02428 case 110:
02429 #line 956 "sslparser.y"
02430 {
02431             yyval.exp = makeSuccessor(yyvsp[-1].exp);
02432         ;
02433     break;}
02434 case 111:
02435 #line 962 "sslparser.y"
02436 {
02437             yyval.exp = new Unary(opSignExt, yyvsp[-1].exp);
02438         ;
02439     break;}
02440 case 112:
02441 #line 969 "sslparser.y"
02442 {
02443             // size casts and the opSize operator were generally deprecated, but now opSize is used to transmit
02444             // the size of operands that could be memOfs from the decoder to type analysis
02445             if (yyvsp[0].num == STD_SIZE)
02446                 yyval.exp = yyvsp[-1].exp;
02447             else
02448                 yyval.exp = new Binary(opSize, new Const(yyvsp[0].num), yyvsp[-1].exp);
02449         ;
02450     break;}
02451 case 113:
02452 #line 978 "sslparser.y"
02453 {
02454             yyval.exp = new Unary(opNot, yyvsp[0].exp);
02455         ;
02456     break;}
02457 case 114:
02458 #line 982 "sslparser.y"
02459 {
02460             yyval.exp = new Unary(opLNot, yyvsp[0].exp);
02461         ;
02462     break;}
02463 case 115:
02464 #line 986 "sslparser.y"
02465 {
02466             yyval.exp = new Unary(opFNeg, yyvsp[0].exp);
02467         ;
02468     break;}
02469 case 116:
02470 #line 990 "sslparser.y"
02471 {
02472             yyval.exp = new Binary(strToOper(yyvsp[-1].str), yyvsp[-2].exp, yyvsp[0].exp);
02473         ;
02474     break;}
02475 case 117:
02476 #line 994 "sslparser.y"
02477 {
02478             yyval.exp = new Binary(strToOper(yyvsp[-1].str), yyvsp[-2].exp, yyvsp[0].exp);
02479         ;
02480     break;}
02481 case 118:
02482 #line 998 "sslparser.y"
02483 {
02484             yyval.exp = new Binary(strToOper(yyvsp[-1].str), yyvsp[-2].exp, yyvsp[0].exp);
02485         ;
02486     break;}
02487 case 119:
02488 #line 1002 "sslparser.y"
02489 {
02490             yyval.exp = new Binary(strToOper(yyvsp[-1].str), yyvsp[-2].exp, yyvsp[0].exp);
02491         ;
02492     break;}
02493 case 120:
02494 #line 1006 "sslparser.y"
02495 {
02496             yyval.exp = new Binary(strToOper(yyvsp[-1].str), yyvsp[-2].exp, yyvsp[0].exp);
02497         ;
02498     break;}
02499 case 121:
02500 #line 1013 "sslparser.y"
02501 {
02502             std::ostringstream o;
02503             if (indexrefmap.find(yyvsp[-2].str) == indexrefmap.end()) {
02504                 o << "index " << yyvsp[-2].str << " not declared for use.\n";
02505                 yyerror(STR(o));
02506             } else if (TableDict.find(yyvsp[-3].str) == TableDict.end()) {
02507                 o << "table " << yyvsp[-3].str << " not declared for use.\n";
02508                 yyerror(STR(o));
02509             } else if (TableDict[yyvsp[-3].str]->getType() != OPTABLE) {
02510                 o << "table " << yyvsp[-3].str << " is not an operator table but appears to be used as one.\n";
02511                 yyerror(STR(o));
02512             } else if ((int)TableDict[yyvsp[-3].str]->records.size() < indexrefmap[yyvsp[-2].str]->ntokens()) {
02513                 o << "table " << yyvsp[-3].str << " is too small to use with " << yyvsp[-2].str << " as an index.\n";
02514                 yyerror(STR(o));
02515             }
02516             yyval.exp = new Ternary(opOpTable, new Const(yyvsp[-3].str), new Const(yyvsp[-2].str),
02517                 new Binary(opList,
02518                     yyvsp[-4].exp,
02519                     new Binary(opList,
02520                         yyvsp[0].exp,
02521                         new Terminal(opNil))));
02522         ;
02523     break;}
02524 case 122:
02525 #line 1036 "sslparser.y"
02526 {
02527             yyval.exp = yyvsp[0].exp;
02528         ;
02529     break;}
02530 case 123:
02531 #line 1045 "sslparser.y"
02532 {
02533             bool isFlag = strstr(yyvsp[0].str, "flags") != 0;
02534             std::map<std::string, int>::const_iterator it = Dict.RegMap.find(yyvsp[0].str);
02535             if (it == Dict.RegMap.end() && !isFlag) {
02536                 std::ostringstream ost;
02537                 ost << "register `" << yyvsp[0].str << "' is undefined";
02538                 yyerror(STR(ost));
02539             } else if (isFlag || it->second == -1) {
02540                 // A special register, e.g. %npc or %CF. Return a Terminal for it
02541                 OPER op = strToTerm(yyvsp[0].str);
02542                 if (op) {
02543                     yyval.exp = new Terminal(op);
02544                 } else {
02545                     yyval.exp = new Unary(opMachFtr,     // Machine specific feature
02546                             new Const(yyvsp[0].str));
02547                 }
02548             }
02549             else {
02550                 // A register with a constant reg nmber, e.g. %g2.  In this case, we want to return r[const 2]
02551                 yyval.exp = Location::regOf(it->second);
02552             }
02553         ;
02554     break;}
02555 case 124:
02556 #line 1068 "sslparser.y"
02557 {
02558             yyval.exp = Location::regOf(yyvsp[-1].exp);
02559         ;
02560     break;}
02561 case 125:
02562 #line 1072 "sslparser.y"
02563 {
02564             int regNum;
02565             sscanf(yyvsp[0].str, "r%d", &regNum);
02566             yyval.exp = Location::regOf(regNum);
02567         ;
02568     break;}
02569 case 126:
02570 #line 1078 "sslparser.y"
02571 {
02572             yyval.exp = Location::memOf(yyvsp[-1].exp);
02573         ;
02574     break;}
02575 case 127:
02576 #line 1082 "sslparser.y"
02577 {
02578         // This is a mixture of the param: PARM {} match and the value_op: NAME {} match
02579             Exp* s;
02580             std::set<std::string>::iterator it = Dict.ParamSet.find(yyvsp[0].str);
02581             if (it != Dict.ParamSet.end()) {
02582                 s = new Location(opParam, new Const(yyvsp[0].str), NULL);
02583             } else if (ConstTable.find(yyvsp[0].str) != ConstTable.end()) {
02584                 s = new Const(ConstTable[yyvsp[0].str]);
02585             } else {
02586                 std::ostringstream ost;
02587                 ost << "`" << yyvsp[0].str << "' is not a constant, definition or a parameter of this instruction\n";
02588                 yyerror(STR(ost));
02589                 s = new Const(0);
02590             }
02591             yyval.exp = s;
02592         ;
02593     break;}
02594 case 128:
02595 #line 1099 "sslparser.y"
02596 {
02597             yyval.exp = new Ternary(opAt, yyvsp[-6].exp, yyvsp[-3].exp, yyvsp[-1].exp);
02598         ;
02599     break;}
02600 case 129:
02601 #line 1103 "sslparser.y"
02602 {
02603             yyval.exp = Location::tempOf(new Const(yyvsp[0].str));
02604         ;
02605     break;}
02606 case 130:
02607 #line 1108 "sslparser.y"
02608 {
02609             yyval.exp = new Unary(opPostVar, yyvsp[-1].exp);
02610         ;
02611     break;}
02612 case 131:
02613 #line 1111 "sslparser.y"
02614 {
02615             yyval.exp = makeSuccessor(yyvsp[-1].exp);
02616         ;
02617     break;}
02618 case 132:
02619 #line 1117 "sslparser.y"
02620 {
02621             yyval.num = yyvsp[-1].num;
02622         ;
02623     break;}
02624 case 133:
02625 #line 1123 "sslparser.y"
02626 {
02627             Dict.bigEndian = (strcmp(yyvsp[0].str, "BIG") == 0);
02628         ;
02629     break;}
02630 case 134:
02631 #line 1128 "sslparser.y"
02632 {
02633             yyval.str = yyvsp[0].str;
02634         ;
02635     break;}
02636 case 135:
02637 #line 1131 "sslparser.y"
02638 {
02639             yyval.str = yyvsp[0].str;
02640         ;
02641     break;}
02642 case 136:
02643 #line 1137 "sslparser.y"
02644 {
02645             char c = yyvsp[0].str[1];
02646             if (c == '*') yyval.typ = new SizeType(0); // MVE: should remove these
02647             else if (isdigit(c)) {
02648                 int size;
02649                 // Skip star (hence +1)
02650                 sscanf(yyvsp[0].str+1, "%d", &size);
02651                 yyval.typ = new SizeType(size);
02652             } else {
02653                 int size;
02654                 // Skip star and letter
02655                 sscanf(yyvsp[0].str+2, "%d", &size);
02656                 if (size == 0) size = STD_SIZE;
02657                 switch (c) {
02658                     case 'i': yyval.typ = new IntegerType(size, 1); break;
02659                     case 'j': yyval.typ = new IntegerType(size, 0); break;
02660                     case 'u': yyval.typ = new IntegerType(size, -1); break;
02661                     case 'f': yyval.typ = new FloatType(size); break;
02662                     case 'c': yyval.typ = new CharType; break;
02663                     default:
02664                         std::cerr << "Unexpected char " << c << " in assign type\n";
02665                         yyval.typ = new IntegerType;
02666                 }
02667             }
02668         ;
02669     break;}
02670 case 140:
02671 #line 1177 "sslparser.y"
02672 {
02673             Dict.fastMap[std::string(yyvsp[-2].str)] = std::string(yyvsp[0].str);
02674         ;
02675     break;}
02676 }
02677 
02678 #line 811 "/usr/local/lib/bison.cc"
02679    /* the action file gets copied in in place of this dollarsign  */
02680   yyvsp -= yylen;
02681   yyssp -= yylen;
02682 #ifdef YY_SSLParser_LSP_NEEDED
02683   yylsp -= yylen;
02684 #endif
02685 
02686 #if YY_SSLParser_DEBUG != 0
02687   if (YY_SSLParser_DEBUG_FLAG)
02688     {
02689       short *ssp1 = yyss - 1;
02690       fprintf (stderr, "state stack now");
02691       while (ssp1 != yyssp)
02692     fprintf (stderr, " %d", *++ssp1);
02693       fprintf (stderr, "\n");
02694     }
02695 #endif
02696 
02697   *++yyvsp = yyval;
02698 
02699 #ifdef YY_SSLParser_LSP_NEEDED
02700   yylsp++;
02701   if (yylen == 0)
02702     {
02703       yylsp->first_line = YY_SSLParser_LLOC.first_line;
02704       yylsp->first_column = YY_SSLParser_LLOC.first_column;
02705       yylsp->last_line = (yylsp-1)->last_line;
02706       yylsp->last_column = (yylsp-1)->last_column;
02707       yylsp->text = 0;
02708     }
02709   else
02710     {
02711       yylsp->last_line = (yylsp+yylen-1)->last_line;
02712       yylsp->last_column = (yylsp+yylen-1)->last_column;
02713     }
02714 #endif
02715 
02716   /* Now "shift" the result of the reduction.
02717      Determine what state that goes to,
02718      based on the state we popped back to
02719      and the rule number reduced by.  */
02720 
02721   yyn = yyr1[yyn];
02722 
02723   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
02724   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
02725     yystate = yytable[yystate];
02726   else
02727     yystate = yydefgoto[yyn - YYNTBASE];
02728 
02729   YYGOTO(yynewstate);
02730 
02731 YYLABEL(yyerrlab)   /* here on detecting error */
02732 
02733   if (! yyerrstatus)
02734     /* If not already recovering from an error, report this error.  */
02735     {
02736       ++YY_SSLParser_NERRS;
02737 
02738 #ifdef YY_SSLParser_ERROR_VERBOSE
02739       yyn = yypact[yystate];
02740 
02741       if (yyn > YYFLAG && yyn < YYLAST)
02742     {
02743       int size = 0;
02744       char *msg;
02745       int x, count;
02746 
02747       count = 0;
02748       /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
02749       for (x = (yyn < 0 ? -yyn : 0);
02750            x < (sizeof(yytname) / sizeof(char *)); x++)
02751         if (yycheck[x + yyn] == x)
02752           size += strlen(yytname[x]) + 15, count++;
02753       msg = (char *) malloc(size + 15);
02754       if (msg != 0)
02755         {
02756           strcpy(msg, "parse error");
02757 
02758           if (count < 5)
02759         {
02760           count = 0;
02761           for (x = (yyn < 0 ? -yyn : 0);
02762                x < (sizeof(yytname) / sizeof(char *)); x++)
02763             if (yycheck[x + yyn] == x)
02764               {
02765             strcat(msg, count == 0 ? ", expecting `" : " or `");
02766             strcat(msg, yytname[x]);
02767             strcat(msg, "'");
02768             count++;
02769               }
02770         }
02771           YY_SSLParser_ERROR(msg);
02772           free(msg);
02773         }
02774       else
02775         YY_SSLParser_ERROR ("parse error; also virtual memory exceeded");
02776     }
02777       else
02778 #endif /* YY_SSLParser_ERROR_VERBOSE */
02779     YY_SSLParser_ERROR("parse error");
02780     }
02781 
02782   YYGOTO(yyerrlab1);
02783 YYLABEL(yyerrlab1)   /* here on error raised explicitly by an action */
02784 
02785   if (yyerrstatus == 3)
02786     {
02787       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
02788 
02789       /* return failure if at end of input */
02790       if (YY_SSLParser_CHAR == YYEOF)
02791     YYABORT;
02792 
02793 #if YY_SSLParser_DEBUG != 0
02794       if (YY_SSLParser_DEBUG_FLAG)
02795     fprintf(stderr, "Discarding token %d (%s).\n", YY_SSLParser_CHAR, yytname[yychar1]);
02796 #endif
02797 
02798       YY_SSLParser_CHAR = YYEMPTY;
02799     }
02800 
02801   /* Else will try to reuse lookahead token
02802      after shifting the error token.  */
02803 
02804   yyerrstatus = 3;              /* Each real token shifted decrements this */
02805 
02806   YYGOTO(yyerrhandle);
02807 
02808 YYLABEL(yyerrdefault)  /* current state does not do anything special for the error token. */
02809 
02810 #if 0
02811   /* This is wrong; only states that explicitly want error tokens
02812      should shift them.  */
02813   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
02814   if (yyn) YYGOTO(yydefault);
02815 #endif
02816 
02817 YYLABEL(yyerrpop)   /* pop the current state because it cannot handle the error token */
02818 
02819   if (yyssp == yyss) YYABORT;
02820   yyvsp--;
02821   yystate = *--yyssp;
02822 #ifdef YY_SSLParser_LSP_NEEDED
02823   yylsp--;
02824 #endif
02825 
02826 #if YY_SSLParser_DEBUG != 0
02827   if (YY_SSLParser_DEBUG_FLAG)
02828     {
02829       short *ssp1 = yyss - 1;
02830       fprintf (stderr, "Error: state stack now");
02831       while (ssp1 != yyssp)
02832     fprintf (stderr, " %d", *++ssp1);
02833       fprintf (stderr, "\n");
02834     }
02835 #endif
02836 
02837 YYLABEL(yyerrhandle)
02838 
02839   yyn = yypact[yystate];
02840   if (yyn == YYFLAG)
02841     YYGOTO(yyerrdefault);
02842 
02843   yyn += YYTERROR;
02844   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
02845     YYGOTO(yyerrdefault);
02846 
02847   yyn = yytable[yyn];
02848   if (yyn < 0)
02849     {
02850       if (yyn == YYFLAG)
02851     YYGOTO(yyerrpop);
02852       yyn = -yyn;
02853       YYGOTO(yyreduce);
02854     }
02855   else if (yyn == 0)
02856     YYGOTO(yyerrpop);
02857 
02858   if (yyn == YYFINAL)
02859     YYACCEPT;
02860 
02861 #if YY_SSLParser_DEBUG != 0
02862   if (YY_SSLParser_DEBUG_FLAG)
02863     fprintf(stderr, "Shifting error token, ");
02864 #endif
02865 
02866   *++yyvsp = YY_SSLParser_LVAL;
02867 #ifdef YY_SSLParser_LSP_NEEDED
02868   *++yylsp = YY_SSLParser_LLOC;
02869 #endif
02870 
02871   yystate = yyn;
02872   YYGOTO(yynewstate);
02873 /* end loop, in which YYGOTO may be used. */
02874   YYENDGOTO
02875 }
02876 
02877 /* END */
02878 
02879 /* #line 1010 "/usr/local/lib/bison.cc" */
02880 #line 2881 "sslparser.cpp"
02881 #line 1180 "sslparser.y"
02882 
02883 
02884 /*==============================================================================
02885  * FUNCTION:        SSLParser::SSLParser
02886  * OVERVIEW:        Constructor for an existing stream.
02887  * PARAMETERS:      The stream, whether or not to debug
02888  * RETURNS:         <nothing>
02889  *============================================================================*/
02890 SSLParser::SSLParser(std::istream &in, bool trace) : sslFile("input"), bFloat(false)
02891 {
02892     theScanner = new SSLScanner(in, trace);
02893     if (trace) yydebug = 1; else yydebug=0;
02894 }
02895 
02896 /*==============================================================================
02897  * FUNCTION:        SSLParser::parseExp
02898  * OVERVIEW:        Parses an assignment from a string.
02899  * PARAMETERS:      the string
02900  * RETURNS:         an Assignment or NULL.
02901  *============================================================================*/
02902 Statement* SSLParser::parseExp(const char *str) {
02903     std::istringstream ss(str);
02904     SSLParser p(ss, false);     // Second arg true for debugging
02905     RTLInstDict d;
02906     p.yyparse(d);
02907     return p.the_asgn;
02908 }
02909 
02910 /*==============================================================================
02911  * FUNCTION:        SSLParser::~SSLParser
02912  * OVERVIEW:        Destructor.
02913  * PARAMETERS:      <none>
02914  * RETURNS:         <nothing>
02915  *============================================================================*/
02916 SSLParser::~SSLParser()
02917 {
02918     std::map<std::string, Table*>::iterator loc;
02919     if (theScanner != NULL)
02920         delete theScanner;
02921     for(loc = TableDict.begin(); loc != TableDict.end(); loc++)
02922         delete loc->second;
02923 }
02924 
02925 /*==============================================================================
02926  * FUNCTION:        SSLParser::yyerror
02927  * OVERVIEW:        Display an error message and exit.
02928  * PARAMETERS:      msg - an error message
02929  * RETURNS:         <nothing>
02930  *============================================================================*/
02931 void SSLParser::yyerror(char* msg)
02932 {
02933     std::cerr << sslFile << ":" << theScanner->theLine << ": " << msg << std::endl;
02934 }
02935 
02936 /*==============================================================================
02937  * FUNCTION:        SSLParser::yylex
02938  * OVERVIEW:        The scanner driver than returns the next token.
02939  * PARAMETERS:      <none>
02940  * RETURNS:         the next token
02941  *============================================================================*/
02942 int SSLParser::yylex()
02943 {
02944     int token = theScanner->yylex(yylval);
02945     return token;
02946 }
02947 
02948 /*==============================================================================
02949  * FUNCTION:        SSLParser::strToOper
02950  * OVERVIEW:        Convert a string operator (e.g. "+f") to an OPER (opFPlus)
02951  * NOTE:            An attempt is made to make this moderately efficient, else we might have a skip chain of string
02952  *                  comparisons
02953  * NOTE:            This is a member of SSLParser so we can call yyerror and have line number etc printed out
02954  * PARAMETERS:      s: pointer to the operator C string
02955  * RETURNS:         An OPER, or -1 if not found (enum opWild)
02956  *============================================================================*/
02957 OPER SSLParser::strToOper(const char* s) {
02958     switch (s[0]) {
02959         case '*':
02960             // Could be *, *!, *f, *fsd, *fdq, *f[sdq]
02961             switch (s[1]) {
02962                 case '\0': return opMult;
02963                 case '!' : return opMults;
02964                 case 'f' :
02965                     if ((s[2] == 's') && (s[3] == 'd')) return opFMultsd;
02966                     if ((s[2] == 'd') && (s[3] == 'q')) return opFMultdq;
02967                     return opFMult;
02968                 default: break;
02969             }
02970             break;
02971         case '/':
02972             // Could be /, /!, /f, /f[sdq]
02973             switch (s[1]) {
02974                 case '\0': return opDiv;
02975                 case '!' : return opDivs;
02976                 case 'f' : return opFDiv;
02977                 default: break;
02978             }
02979             break;
02980         case '%':
02981             // Could be %, %!
02982             switch (s[1]) {
02983                 case '\0': return opMod;
02984                 case '!' : return opMods;
02985                 default: break;
02986             }
02987             break;
02988         case '+':
02989             // Could be +, +f, +f[sdq]
02990             switch (s[1]) {
02991                 case '\0': return opPlus;
02992                 case 'f' : return opFPlus;
02993                 default: break;
02994             }
02995             break;
02996         case '-':
02997             // Could be -, -f, -f[sdq]
02998             switch (s[1]) {
02999                 case '\0': return opMinus;
03000                 case 'f' : return opFMinus;
03001                 default: break;
03002             }
03003             break;
03004         case 'a':
03005             // and, arctan, addr
03006             if (s[1] == 'n') return opAnd;
03007             if (s[1] == 'r') return opArcTan;
03008             if (s[1] == 'd') return opAddrOf;
03009                 break;
03010         case 'c':
03011             // cos
03012             return opCos;
03013         case 'e':
03014             // execute
03015             return opExecute;
03016         case 'f':
03017             // fsize, ftoi, fround NOTE: ftrunc handled separately because it is a unary
03018             if (s[1] == 's') return opFsize;
03019             if (s[1] == 't') return opFtoi;
03020             if (s[1] == 'r') return opFround;
03021             break;
03022         case 'i':
03023             // itof
03024             return opItof;
03025         case 'l':
03026             // log2, log10, loge
03027             if (s[3] == '2') return opLog2;
03028             if (s[3] == '1') return opLog10;
03029             if (s[3] == 'e') return opLoge;
03030             break;
03031         case 'o':
03032             // or
03033             return opOr;
03034         case 'p':
03035             // pow
03036             return opPow;
03037         case 'r':
03038             // rlc, rrc, rl, rr
03039             if (s[1] == 'l') {
03040                 if (s[2] == 'c') return opRotateLC;
03041                 return opRotateL;
03042             } else if (s[1] == 'r') {
03043                 if (s[2] == 'c') return opRotateRC;
03044                 return opRotateR;
03045             }
03046             break;
03047         case 's':
03048             // sgnex, sin, sqrt
03049             if (s[1] == 'g') return opSgnEx;
03050             if (s[1] == 'i') return opSin;
03051             if (s[1] == 'q') return opSqrt;
03052             break;
03053         case 't':
03054             // truncu, truncs, tan
03055             // 012345
03056             if (s[1] == 'a') return opTan;
03057             if (s[5] == 'u') return opTruncu;
03058             if (s[5] == 's') return opTruncs;
03059             break;
03060         case 'z':
03061             // zfill
03062             return opZfill;
03063 
03064         case '>':
03065             // >, >u, >=, >=u, >>, >>A
03066             switch (s[1]) {
03067                 case '\0': return opGtr;
03068                 case 'u': return opGtrUns;
03069                 case '=':
03070                     if (s[2] == '\0') return opGtrEq;
03071                     return opGtrEqUns;
03072                 case '>':
03073                     if (s[2] == '\0') return opShiftR;
03074                     return opShiftRA;
03075                 default: break;
03076             }
03077             break;
03078         case '<':
03079             // <, <u, <=, <=u, <<
03080             switch (s[1]) {
03081                 case '\0': return opLess;
03082                 case 'u': return opLessUns;
03083                 case '=':
03084                     if (s[2] == '\0') return opLessEq;
03085                     return opLessEqUns;
03086                 case '<':
03087                     return opShiftL;
03088                 default: break;
03089             }
03090             break;
03091         case '=':
03092             // =
03093             return opEquals;
03094         case '!':
03095             // !
03096             return opSgnEx;
03097             break;
03098         case '~':
03099             // ~=, ~
03100             if (s[1] == '=') return opNotEqual;
03101             return opNot;       // Bit inversion
03102         case '@': return opAt;
03103         case '&': return opBitAnd;
03104         case '|': return opBitOr;
03105         case '^': return opBitXor;
03106  
03107         default: break; 
03108     }
03109     std::ostringstream ost;
03110     ost << "Unknown operator " << s << std::endl;
03111     yyerror(STR(ost));
03112     return opWild;
03113 }
03114 
03115 OPER strToTerm(char* s) {
03116     // s could be %pc, %afp, %agp, %CF, %ZF, %OF, %NF, %DF, %flags, %fflags
03117     if (s[2] == 'F') {
03118         if (s[1] <= 'N') {
03119             if (s[1] == 'C') return opCF;
03120             if (s[1] == 'N') return opNF;
03121             return opDF;
03122         } else {
03123             if (s[1] == 'O') return opOF;
03124             return opZF;
03125         }
03126     }
03127     if (s[1] == 'p') return opPC;
03128     if (s[1] == 'a') {
03129         if (s[2] == 'f') return opAFP;
03130         if (s[2] == 'g') return opAGP;
03131     } else if (s[1] == 'f') {
03132         if (s[2] == 'l') return opFlags;
03133         if (s[2] == 'f') return opFflags;
03134     }
03135     return (OPER) 0;
03136 }
03137 
03138 /*==============================================================================
03139  * FUNCTION:        listExpToExp
03140  * OVERVIEW:        Convert a list of actual parameters in the form of a STL list of Exps into one expression
03141  *                    (using opList)
03142  * NOTE:            The expressions in the list are not cloned; they are simply copied to the new opList
03143  * PARAMETERS:      le: the list of expressions
03144  * RETURNS:         The opList Expression
03145  *============================================================================*/
03146 Exp* listExpToExp(std::list<Exp*>* le) {
03147     Exp* e;
03148     Exp** cur = &e;
03149     Exp *end = new Terminal(opNil);         // Terminate the chain
03150     for (std::list<Exp*>::iterator it = le->begin(); it != le->end(); it++) {
03151         *cur = new Binary(opList, *it, end);
03152         // cur becomes the address of the address of the second subexpression
03153         // In other words, cur becomes a reference to the second subexp ptr
03154         // Note that declaring cur as a reference doesn't work (remains a reference to e)
03155         cur = &(*cur)->refSubExp2();
03156     }
03157     return e;
03158 }
03159 
03160 /*==============================================================================
03161  * FUNCTION:        listStrToExp
03162  * OVERVIEW:        Convert a list of formal parameters in the form of a STL list of strings into one expression
03163  *                    (using opList)
03164  * PARAMETERS:      ls - the list of strings
03165  * RETURNS:         The opList expression
03166  *============================================================================*/
03167 Exp* listStrToExp(std::list<std::string>* ls) {
03168     Exp* e;
03169     Exp** cur = &e;
03170     Exp *end = new Terminal(opNil);          // Terminate the chain
03171     for (std::list<std::string>::iterator it = ls->begin(); it != ls->end(); it++) {
03172         *cur = new Binary(opList, new Location(opParam, new Const((char*)(*it).c_str()), NULL), end);
03173         cur = &(*cur)->refSubExp2();
03174     }
03175     *cur = new Terminal(opNil);          // Terminate the chain
03176     return e;
03177 }
03178 
03179 /*==============================================================================
03180  * FUNCTION:        SSLParser::expandTables
03181  * OVERVIEW:        Expand tables in an RTL and save to dictionary
03182  * NOTE:            This may generate many entries
03183  * PARAMETERS:      iname: Parser object representing the instruction name
03184  *                  params: Parser object representing the instruction params
03185  *                  o_rtlist: Original rtlist object (before expanding)
03186  *                  Dict: Ref to the dictionary that will contain the results of the parse
03187  * RETURNS:         <nothing>
03188  *============================================================================*/
03189 static Exp* srchExpr = new Binary(opExpTable,
03190         new Terminal(opWild),
03191         new Terminal(opWild));
03192 static Exp* srchOp = new Ternary(opOpTable,
03193         new Terminal(opWild),
03194         new Terminal(opWild),
03195         new Terminal(opWild));
03196 void init_sslparser() {
03197 #ifndef NO_GARBAGE_COLLECTOR
03198     static Exp** gc_pointers = (Exp**) GC_MALLOC_UNCOLLECTABLE(2 * sizeof(Exp*));
03199     gc_pointers[0] = srchExpr;
03200     gc_pointers[1] = srchOp;
03201 #endif
03202 }
03203 
03204 void SSLParser::expandTables(InsNameElem* iname, std::list<std::string>* params, RTL* o_rtlist, RTLInstDict& Dict) {
03205     int i, m;
03206     std::string nam;
03207     std::ostringstream o;
03208     m = iname->ninstructions();
03209     // Expand the tables (if any) in this instruction
03210     for (i = 0, iname->reset(); i < m; i++, iname->increment()) {
03211         nam = iname->getinstruction();
03212         // Need to make substitutions to a copy of the RTL
03213         RTL* rtl = o_rtlist->clone();
03214         int n = rtl->getNumStmt();
03215         for (int j=0; j < n; j++) {
03216             Statement* s = rtl->elementAt(j);
03217             std::list<Exp*> le;
03218             // Expression tables
03219             assert(s->getKind() == STMT_ASSIGN);
03220             if (((Assign*)s)->searchAll(srchExpr, le)) {
03221                 std::list<Exp*>::iterator it;
03222                 for (it = le.begin(); it != le.end(); it++) {
03223                     char* tbl = ((Const*)((Binary*)*it)->getSubExp1())->getStr();
03224                     char* idx = ((Const*)((Binary*)*it)->getSubExp2())->getStr();
03225                     Exp* repl =((ExprTable*)(TableDict[tbl]))->expressions[indexrefmap[idx]->getvalue()];
03226                     s->searchAndReplace(*it, repl);
03227                 }
03228             }
03229             // Operator tables
03230             Exp* res;
03231             while (s->search(srchOp, res)) {
03232                 Ternary* t;
03233                 if (res->getOper() == opTypedExp)
03234                     t = (Ternary *)res->getSubExp1();
03235                 else
03236                     t = (Ternary *)res;
03237                 assert(t->getOper() == opOpTable);
03238                 // The ternary opOpTable has a table and index name as strings, then a list of 2 expressions
03239                 // (and we want to replace it with e1 OP e2)
03240                 char* tbl = ((Const*)t->getSubExp1()) ->getStr();
03241                 char* idx = ((Const*)t->getSubExp2()) ->getStr();
03242                 // The expressions to operate on are in the list
03243                 Binary* b = (Binary*)t->getSubExp3();
03244                 assert(b->getOper() == opList);
03245                 Exp* e1 = b->getSubExp1();
03246                 Exp* e2 = b->getSubExp2();      // This should be an opList too
03247                 assert(b->getOper() == opList);
03248                 e2 = ((Binary*)e2)->getSubExp1();
03249                 const char* ops = ((OpTable*)(TableDict[tbl]))->records[indexrefmap[idx]->getvalue()].c_str();
03250                 Exp* repl = new Binary(strToOper(ops), e1->clone(),
03251                 e2->clone());                   // FIXME!
03252                 s->searchAndReplace(res, repl);
03253             }
03254         }
03255  
03256         if (Dict.appendToDict(nam, *params, *rtl) != 0) {
03257             o << "Pattern " << iname->getinspattern() << " conflicts with an earlier declaration of " << nam << ".\n";
03258             yyerror(STR(o));
03259         }
03260     }
03261     indexrefmap.erase(indexrefmap.begin(), indexrefmap.end());
03262 }
03263 
03264 /*==============================================================================
03265  * FUNCTION:        SSLParser::makeSuccessor
03266  * OVERVIEW:        Make the successor of the given expression, e.g. given r[2], return succ( r[2] )
03267  *                    (using opSuccessor)
03268  *                  We can't do the successor operation here, because the parameters are not yet instantiated
03269  *                    (still of the form param(rd)). Actual successor done in Exp::fixSuccessor()
03270  * NOTE:            The given expression should be of the form  r[const]
03271  * NOTE:            The parameter expresion is copied (not cloned) in the result
03272  * PARAMETERS:      The expression to find the successor of
03273  * RETURNS:         The modified expression
03274  *============================================================================*/
03275 Exp* SSLParser::makeSuccessor(Exp* e) {
03276     return new Unary(opSuccessor, e);
03277 }

Generated on Tue Sep 19 21:18:33 2006 for Boomerang by  doxygen 1.4.6