
/*  A Bison parser, made from /Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y
    by GNU Bison version 1.28  */

#define YYBISON 1  /* Identify Bison output.  */

#define yyparse Fileparse
#define yylex Filelex
#define yyerror Fileerror
#define yylval Filelval
#define yychar Filechar
#define yydebug Filedebug
#define yynerrs Filenerrs
#define	INT	257
#define	BIT	258
#define	STRING	259
#define	BITS	260
#define	LIST	261
#define	CODE	262
#define	DAG	263
#define	CLASS	264
#define	DEF	265
#define	MULTICLASS	266
#define	DEFM	267
#define	FIELD	268
#define	LET	269
#define	IN	270
#define	CONCATTOK	271
#define	SHLTOK	272
#define	SRATOK	273
#define	SRLTOK	274
#define	STRCONCATTOK	275
#define	INTVAL	276
#define	ID	277
#define	VARNAME	278
#define	STRVAL	279
#define	CODEFRAGMENT	280

#line 14 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"

#include "Record.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/Streams.h"
#include <algorithm>
#include <cstdio>
#define YYERROR_VERBOSE 1

int yyerror(const char *ErrorMsg);
int yylex();

namespace llvm {
  struct MultiClass {
    Record Rec;  // Placeholder for template args and Name.
    std::vector<Record*> DefPrototypes;
    
    MultiClass(const std::string &Name) : Rec(Name) {}
  };

  
static std::map<std::string, MultiClass*> MultiClasses;
  
extern int Filelineno;
static MultiClass *CurMultiClass = 0;    // Set while parsing a multiclass.
static std::string *CurDefmPrefix = 0;   // Set while parsing defm.
static Record *CurRec = 0;
static bool ParsingTemplateArgs = false;

typedef std::pair<Record*, std::vector<Init*>*> SubClassRefTy;

struct LetRecord {
  std::string Name;
  std::vector<unsigned> Bits;
  Init *Value;
  bool HasBits;
  LetRecord(const std::string &N, std::vector<unsigned> *B, Init *V)
    : Name(N), Value(V), HasBits(B != 0) {
    if (HasBits) Bits = *B;
  }
};

static std::vector<std::vector<LetRecord> > LetStack;


extern std::ostream &err();

/// getActiveRec - If inside a def/class definition, return the def/class.
/// Otherwise, if within a multidef, return it.
static Record *getActiveRec() {
  return CurRec ? CurRec : &CurMultiClass->Rec;
}

static void addValue(const RecordVal &RV) {
  Record *TheRec = getActiveRec();
  
  if (RecordVal *ERV = TheRec->getValue(RV.getName())) {
    // The value already exists in the class, treat this as a set...
    if (ERV->setValue(RV.getValue())) {
      err() << "New definition of '" << RV.getName() << "' of type '"
            << *RV.getType() << "' is incompatible with previous "
            << "definition of type '" << *ERV->getType() << "'!\n";
      exit(1);
    }
  } else {
    TheRec->addValue(RV);
  }
}

static void addSuperClass(Record *SC) {
  if (CurRec->isSubClassOf(SC)) {
    err() << "Already subclass of '" << SC->getName() << "'!\n";
    exit(1);
  }
  CurRec->addSuperClass(SC);
}

static void setValue(const std::string &ValName, 
                     std::vector<unsigned> *BitList, Init *V) {
  if (!V) return;

  Record *TheRec = getActiveRec();
  RecordVal *RV = TheRec->getValue(ValName);
  if (RV == 0) {
    err() << "Value '" << ValName << "' unknown!\n";
    exit(1);
  }

  // Do not allow assignments like 'X = X'.  This will just cause infinite loops
  // in the resolution machinery.
  if (!BitList)
    if (VarInit *VI = dynamic_cast<VarInit*>(V))
      if (VI->getName() == ValName)
        return;
  
  // If we are assigning to a subset of the bits in the value... then we must be
  // assigning to a field of BitsRecTy, which must have a BitsInit
  // initializer...
  //
  if (BitList) {
    BitsInit *CurVal = dynamic_cast<BitsInit*>(RV->getValue());
    if (CurVal == 0) {
      err() << "Value '" << ValName << "' is not a bits type!\n";
      exit(1);
    }

    // Convert the incoming value to a bits type of the appropriate size...
    Init *BI = V->convertInitializerTo(new BitsRecTy(BitList->size()));
    if (BI == 0) {
      V->convertInitializerTo(new BitsRecTy(BitList->size()));
      err() << "Initializer '" << *V << "' not compatible with bit range!\n";
      exit(1);
    }

    // We should have a BitsInit type now...
    assert(dynamic_cast<BitsInit*>(BI) != 0 || (cerr << *BI).stream() == 0);
    BitsInit *BInit = (BitsInit*)BI;

    BitsInit *NewVal = new BitsInit(CurVal->getNumBits());

    // Loop over bits, assigning values as appropriate...
    for (unsigned i = 0, e = BitList->size(); i != e; ++i) {
      unsigned Bit = (*BitList)[i];
      if (NewVal->getBit(Bit)) {
        err() << "Cannot set bit #" << Bit << " of value '" << ValName
              << "' more than once!\n";
        exit(1);
      }
      NewVal->setBit(Bit, BInit->getBit(i));
    }

    for (unsigned i = 0, e = CurVal->getNumBits(); i != e; ++i)
      if (NewVal->getBit(i) == 0)
        NewVal->setBit(i, CurVal->getBit(i));

    V = NewVal;
  }

  if (RV->setValue(V)) {
    err() << "Value '" << ValName << "' of type '" << *RV->getType()
	  << "' is incompatible with initializer '" << *V << "'!\n";
    exit(1);
  }
}

// addSubClass - Add SC as a subclass to CurRec, resolving TemplateArgs as SC's
// template arguments.
static void addSubClass(Record *SC, const std::vector<Init*> &TemplateArgs) {
  // Add all of the values in the subclass into the current class...
  const std::vector<RecordVal> &Vals = SC->getValues();
  for (unsigned i = 0, e = Vals.size(); i != e; ++i)
    addValue(Vals[i]);

  const std::vector<std::string> &TArgs = SC->getTemplateArgs();

  // Ensure that an appropriate number of template arguments are specified...
  if (TArgs.size() < TemplateArgs.size()) {
    err() << "ERROR: More template args specified than expected!\n";
    exit(1);
  }
  
  // Loop over all of the template arguments, setting them to the specified
  // value or leaving them as the default if necessary.
  for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
    if (i < TemplateArgs.size()) {  // A value is specified for this temp-arg?
      // Set it now.
      setValue(TArgs[i], 0, TemplateArgs[i]);

      // Resolve it next.
      CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i]));
                                  
      
      // Now remove it.
      CurRec->removeValue(TArgs[i]);

    } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) {
      err() << "ERROR: Value not specified for template argument #"
            << i << " (" << TArgs[i] << ") of subclass '" << SC->getName()
            << "'!\n";
      exit(1);
    }
  }

  // Since everything went well, we can now set the "superclass" list for the
  // current record.
  const std::vector<Record*> &SCs = SC->getSuperClasses();
  for (unsigned i = 0, e = SCs.size(); i != e; ++i)
    addSuperClass(SCs[i]);
  addSuperClass(SC);
}

} // End llvm namespace

using namespace llvm;


#line 210 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
typedef union {
  std::string*                StrVal;
  int                         IntVal;
  llvm::RecTy*                Ty;
  llvm::Init*                 Initializer;
  std::vector<llvm::Init*>*   FieldList;
  std::vector<unsigned>*      BitList;
  llvm::Record*               Rec;
  std::vector<llvm::Record*>* RecList;
  SubClassRefTy*              SubClassRef;
  std::vector<SubClassRefTy>* SubClassList;
  std::vector<std::pair<llvm::Init*, std::string> >* DagValueList;
} YYSTYPE;
#include <stdio.h>

#ifndef __cplusplus
#ifndef __STDC__
#define const
#endif
#endif



#define	YYFINAL		194
#define	YYFLAG		-32768
#define	YYNTBASE	42

#define YYTRANSLATE(x) ((unsigned)(x) <= 280 ? yytranslate[x] : 91)

static const char yytranslate[] = {     0,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,    36,
    37,     2,     2,    38,    40,    35,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,    39,    41,    27,
    29,    28,    30,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
    33,     2,    34,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,    31,     2,    32,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
     7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
    17,    18,    19,    20,    21,    22,    23,    24,    25,    26
};

#if YYDEBUG != 0
static const short yyprhs[] = {     0,
     0,     2,     4,     6,    11,    13,    18,    20,    22,    24,
    25,    27,    28,    31,    33,    35,    37,    39,    41,    43,
    47,    52,    57,    61,    65,    70,    75,    82,    89,    96,
   103,   110,   111,   114,   117,   122,   123,   125,   127,   131,
   134,   138,   144,   149,   151,   152,   156,   157,   159,   161,
   165,   170,   173,   180,   181,   184,   186,   190,   192,   197,
   199,   203,   204,   207,   209,   213,   217,   218,   220,   222,
   223,   225,   227,   229,   230,   234,   235,   236,   243,   247,
   249,   251,   254,   256,   257,   258,   267,   268,   275,   277,
   279,   281,   283,   288,   290,   294,   295,   300,   305,   308,
   310,   313
};

static const short yyrhs[] = {    23,
     0,     5,     0,     4,     0,     6,    27,    22,    28,     0,
     3,     0,     7,    27,    43,    28,     0,     8,     0,     9,
     0,    42,     0,     0,    14,     0,     0,    29,    47,     0,
    23,     0,    46,     0,    22,     0,    25,     0,    26,     0,
    30,     0,    31,    54,    32,     0,    23,    27,    55,    28,
     0,    47,    31,    52,    32,     0,    33,    54,    34,     0,
    47,    35,    23,     0,    36,    46,    50,    37,     0,    47,
    33,    52,    34,     0,    17,    36,    47,    38,    47,    37,
     0,    18,    36,    47,    38,    47,    37,     0,    19,    36,
    47,    38,    47,    37,     0,    20,    36,    47,    38,    47,
    37,     0,    21,    36,    47,    38,    47,    37,     0,     0,
    39,    24,     0,    47,    48,     0,    49,    38,    47,    48,
     0,     0,    49,     0,    22,     0,    22,    40,    22,     0,
    22,    22,     0,    51,    38,    22,     0,    51,    38,    22,
    40,    22,     0,    51,    38,    22,    22,     0,    51,     0,
     0,    31,    52,    32,     0,     0,    55,     0,    47,     0,
    55,    38,    47,     0,    44,    43,    23,    45,     0,    56,
    41,     0,    15,    23,    53,    29,    47,    41,     0,     0,
    58,    57,     0,    41,     0,    31,    58,    32,     0,    42,
     0,    42,    27,    55,    28,     0,    60,     0,    61,    38,
    60,     0,     0,    39,    61,     0,    56,     0,    63,    38,
    56,     0,    27,    63,    28,     0,     0,    64,     0,    23,
     0,     0,    66,     0,    67,     0,    67,     0,     0,    62,
    71,    59,     0,     0,     0,    10,    68,    73,    65,    74,
    70,     0,    11,    69,    70,     0,    75,     0,    76,     0,
    77,    76,     0,    23,     0,     0,     0,    12,    78,    80,
    65,    81,    31,    77,    32,     0,     0,    13,    23,    83,
    39,    60,    41,     0,    72,     0,    75,     0,    79,     0,
    82,     0,    23,    53,    29,    47,     0,    85,     0,    86,
    38,    85,     0,     0,    15,    88,    86,    16,     0,    87,
    31,    89,    32,     0,    87,    84,     0,    84,     0,    89,
    84,     0,    89,     0
};

#endif

#if YYDEBUG != 0
static const short yyrline[] = { 0,
   246,   268,   270,   272,   274,   276,   278,   280,   282,   286,
   286,   288,   288,   290,   313,   315,   317,   320,   323,   325,
   338,   366,   373,   376,   383,   386,   394,   396,   398,   400,
   402,   406,   409,   413,   418,   424,   427,   430,   433,   446,
   460,   462,   475,   491,   493,   493,   497,   499,   503,   506,
   510,   527,   529,   535,   535,   536,   536,   538,   540,   544,
   549,   554,   557,   561,   564,   569,   570,   570,   572,   572,
   574,   581,   599,   624,   638,   643,   645,   647,   651,   661,
   675,   678,   682,   693,   695,   697,   702,   702,   776,   776,
   777,   777,   779,   784,   784,   787,   787,   790,   793,   797,
   797,   799
};
#endif


#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)

static const char * const yytname[] = {   "$","error","$undefined.","INT","BIT",
"STRING","BITS","LIST","CODE","DAG","CLASS","DEF","MULTICLASS","DEFM","FIELD",
"LET","IN","CONCATTOK","SHLTOK","SRATOK","SRLTOK","STRCONCATTOK","INTVAL","ID",
"VARNAME","STRVAL","CODEFRAGMENT","'<'","'>'","'='","'?'","'{'","'}'","'['",
"']'","'.'","'('","')'","','","':'","'-'","';'","ClassID","Type","OptPrefix",
"OptValue","IDValue","Value","OptVarName","DagArgListNE","DagArgList","RBitList",
"BitList","OptBitList","ValueList","ValueListNE","Declaration","BodyItem","BodyList",
"Body","SubClassRef","ClassListNE","ClassList","DeclListNE","TemplateArgList",
"OptTemplateArgList","OptID","ObjectName","ClassName","DefName","ObjectBody",
"@1","ClassInst","@2","@3","DefInst","MultiClassDef","MultiClassBody","MultiClassName",
"MultiClassInst","@4","@5","DefMInst","@6","Object","LETItem","LETList","LETCommand",
"@7","ObjectList","File", NULL
};
#endif

static const short yyr1[] = {     0,
    42,    43,    43,    43,    43,    43,    43,    43,    43,    44,
    44,    45,    45,    46,    47,    47,    47,    47,    47,    47,
    47,    47,    47,    47,    47,    47,    47,    47,    47,    47,
    47,    48,    48,    49,    49,    50,    50,    51,    51,    51,
    51,    51,    51,    52,    53,    53,    54,    54,    55,    55,
    56,    57,    57,    58,    58,    59,    59,    60,    60,    61,
    61,    62,    62,    63,    63,    64,    65,    65,    66,    66,
    67,    68,    69,    71,    70,    73,    74,    72,    75,    76,
    77,    77,    78,    80,    81,    79,    83,    82,    84,    84,
    84,    84,    85,    86,    86,    88,    87,    84,    84,    89,
    89,    90
};

static const short yyr2[] = {     0,
     1,     1,     1,     4,     1,     4,     1,     1,     1,     0,
     1,     0,     2,     1,     1,     1,     1,     1,     1,     3,
     4,     4,     3,     3,     4,     4,     6,     6,     6,     6,
     6,     0,     2,     2,     4,     0,     1,     1,     3,     2,
     3,     5,     4,     1,     0,     3,     0,     1,     1,     3,
     4,     2,     6,     0,     2,     1,     3,     1,     4,     1,
     3,     0,     2,     1,     3,     3,     0,     1,     1,     0,
     1,     1,     1,     0,     3,     0,     0,     6,     3,     1,
     1,     2,     1,     0,     0,     8,     0,     6,     1,     1,
     1,     1,     4,     1,     3,     0,     4,     4,     2,     1,
     2,     1
};

static const short yydefact[] = {     0,
    70,    70,     0,     0,    96,    89,    90,    91,    92,   100,
     0,   102,    69,    71,    72,    76,    73,    62,    83,    84,
    87,     0,     0,    99,   101,    67,     0,    74,    79,    67,
     0,    45,    94,     0,     0,    10,    68,    77,     1,    58,
    60,    63,     0,    85,     0,     0,     0,    97,     0,    98,
    11,     0,    64,     0,    62,     0,     0,    54,    56,    75,
     0,     0,    38,    44,     0,     0,    95,     5,     3,     2,
     0,     0,     7,     8,     9,     0,    66,    10,    78,     0,
     0,     0,     0,     0,    16,    14,    17,    18,    19,    47,
    47,     0,    15,    49,     0,    61,    10,     0,    88,    40,
     0,     0,    46,    93,     0,     0,    12,    65,     0,     0,
     0,     0,     0,     0,     0,    48,     0,    14,    36,     0,
     0,     0,    59,     0,     0,    57,     0,    55,    80,    81,
     0,    39,    41,     0,     0,     0,    51,     0,     0,     0,
     0,     0,     0,    20,    23,    32,    37,     0,     0,     0,
    24,    50,    45,    52,    86,    82,    43,     0,     4,     6,
    13,     0,     0,     0,     0,     0,    21,     0,    34,     0,
    25,    22,    26,     0,    42,     0,     0,     0,     0,     0,
    33,    32,     0,    27,    28,    29,    30,    31,    35,     0,
    53,     0,     0,     0
};

static const short yydefgoto[] = {    40,
    76,    52,   137,    93,    94,   169,   147,   148,    64,    65,
    47,   115,   116,    53,   128,    97,    60,    41,    42,    28,
    54,    37,    38,    14,    15,    16,    18,    29,    43,     6,
    26,    55,     7,   130,   131,    20,     8,    30,    61,     9,
    31,    10,    33,    34,    11,    22,    12,   192
};

static const short yypact[] = {   147,
   -17,   -17,     8,    12,-32768,-32768,-32768,-32768,-32768,-32768,
     3,   147,-32768,-32768,-32768,-32768,-32768,   -13,-32768,-32768,
-32768,    17,   147,-32768,-32768,    21,    58,-32768,-32768,    21,
    45,    55,-32768,    -5,    -3,    77,-32768,-32768,-32768,    68,
-32768,    64,    -4,-32768,    58,    84,    81,-32768,    17,-32768,
-32768,    16,-32768,    13,   -13,    43,    58,-32768,-32768,-32768,
    88,    74,    10,    83,    93,    43,-32768,-32768,-32768,-32768,
   100,   104,-32768,-32768,-32768,   110,-32768,    77,-32768,   117,
   125,   127,   128,   129,-32768,   139,-32768,-32768,-32768,    43,
    43,   132,-32768,    59,    14,-32768,    40,   156,-32768,-32768,
   146,   148,-32768,    59,   149,    16,   140,-32768,    43,    43,
    43,    43,    43,    43,   141,   134,   142,-32768,    43,    84,
    84,   151,-32768,    43,   152,-32768,   136,-32768,-32768,-32768,
     6,-32768,    35,   150,   153,    43,-32768,    70,    76,    85,
    91,    97,    39,-32768,-32768,    54,   144,   143,   154,   145,
-32768,    59,    55,-32768,-32768,-32768,-32768,   161,-32768,-32768,
    59,    43,    43,    43,    43,    43,-32768,   160,-32768,    43,
-32768,-32768,-32768,   158,-32768,   103,   106,   111,   114,   119,
-32768,    54,    43,-32768,-32768,-32768,-32768,-32768,-32768,    47,
-32768,   185,   188,-32768
};

static const short yypgoto[] = {   -50,
    86,-32768,-32768,    98,   -66,     7,-32768,-32768,-32768,    -8,
    38,   102,   -55,   -48,-32768,-32768,-32768,    26,-32768,-32768,
-32768,-32768,   164,-32768,   193,-32768,-32768,   155,-32768,-32768,
-32768,-32768,   -95,    65,-32768,-32768,-32768,-32768,-32768,-32768,
-32768,    -7,   157,-32768,-32768,-32768,   174,-32768
};


#define	YYLAST		210


static const short yytable[] = {   104,
    95,    75,   129,    24,    25,    13,     1,     2,     3,     4,
    48,     5,     1,     2,     3,     4,     2,     5,    68,    69,
    70,    71,    72,    73,    74,    27,    58,    25,    50,   108,
    19,   100,    49,    23,    21,   129,    59,   155,    39,    32,
    77,   123,   138,   139,   140,   141,   142,    36,   127,   101,
    78,   124,   146,    51,   125,    75,   157,   152,   143,    80,
    81,    82,    83,    84,    85,    86,   167,    87,    88,   161,
    62,   126,    89,    90,   158,    91,   124,   120,    92,   121,
    39,   122,    96,    45,   120,    46,   121,   191,   122,   120,
    51,   121,   168,   122,    56,   176,   177,   178,   179,   180,
   120,    57,   121,   182,   122,    63,   120,   162,   121,    66,
   122,   149,   150,   163,    99,   120,   190,   121,    98,   122,
   102,   120,   164,   121,   103,   122,   105,   120,   165,   121,
   106,   122,   107,   120,   166,   121,   120,   122,   121,   184,
   122,   120,   185,   121,   120,   122,   121,   186,   122,   120,
   187,   121,   109,   122,   118,   188,     1,     2,     3,     4,
   110,     5,   111,   112,   113,   114,     2,   132,   136,   133,
   134,   124,   144,   151,   153,   145,   154,   159,   173,   171,
   160,   170,   175,   181,   193,   172,   183,   194,   189,   119,
   174,   135,   117,    44,    17,   156,    35,     0,     0,     0,
     0,     0,     0,     0,     0,    67,     0,     0,     0,    79
};

static const short yycheck[] = {    66,
    56,    52,    98,    11,    12,    23,    10,    11,    12,    13,
    16,    15,    10,    11,    12,    13,    11,    15,     3,     4,
     5,     6,     7,     8,     9,    39,    31,    35,    32,    78,
    23,    22,    38,    31,    23,   131,    41,    32,    23,    23,
    28,    28,   109,   110,   111,   112,   113,    27,    97,    40,
    38,    38,   119,    14,    15,   106,    22,   124,   114,    17,
    18,    19,    20,    21,    22,    23,    28,    25,    26,   136,
    45,    32,    30,    31,    40,    33,    38,    31,    36,    33,
    23,    35,    57,    39,    31,    31,    33,    41,    35,    31,
    14,    33,    39,    35,    27,   162,   163,   164,   165,   166,
    31,    38,    33,   170,    35,    22,    31,    38,    33,    29,
    35,   120,   121,    38,    41,    31,   183,    33,    31,    35,
    38,    31,    38,    33,    32,    35,    27,    31,    38,    33,
    27,    35,    23,    31,    38,    33,    31,    35,    33,    37,
    35,    31,    37,    33,    31,    35,    33,    37,    35,    31,
    37,    33,    36,    35,    23,    37,    10,    11,    12,    13,
    36,    15,    36,    36,    36,    27,    11,    22,    29,    22,
    22,    38,    32,    23,    23,    34,    41,    28,    34,    37,
    28,    38,    22,    24,     0,    32,    29,     0,   182,    92,
   153,   106,    91,    30,     2,   131,    23,    -1,    -1,    -1,
    -1,    -1,    -1,    -1,    -1,    49,    -1,    -1,    -1,    55
};
/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
#line 3 "/usr/share/bison.simple"
/* This file comes from bison-1.28.  */

/* Skeleton output parser for bison,
   Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.  */

/* As a special exception, when this file is copied by Bison into a
   Bison output file, you may use that output file without restriction.
   This special exception was added by the Free Software Foundation
   in version 1.24 of Bison.  */

/* This is the parser code that is written into each bison parser
  when the %semantic_parser declaration is not specified in the grammar.
  It was written by Richard Stallman by simplifying the hairy parser
  used when %semantic_parser is specified.  */

#ifndef YYSTACK_USE_ALLOCA
#ifdef alloca
#define YYSTACK_USE_ALLOCA
#else /* alloca not defined */
#ifdef __GNUC__
#define YYSTACK_USE_ALLOCA
#define alloca __builtin_alloca
#else /* not GNU C.  */
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
#define YYSTACK_USE_ALLOCA
#include <alloca.h>
#else /* not sparc */
/* We think this test detects Watcom and Microsoft C.  */
/* This used to test MSDOS, but that is a bad idea
   since that symbol is in the user namespace.  */
#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
#if 0 /* No need for malloc.h, which pollutes the namespace;
	 instead, just don't use alloca.  */
#include <malloc.h>
#endif
#else /* not MSDOS, or __TURBOC__ */
#if defined(_AIX)
/* I don't know what this was needed for, but it pollutes the namespace.
   So I turned it off.   rms, 2 May 1997.  */
/* #include <malloc.h>  */
 #pragma alloca
#define YYSTACK_USE_ALLOCA
#else /* not MSDOS, or __TURBOC__, or _AIX */
#if 0
#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
		 and on HPUX 10.  Eventually we can turn this on.  */
#define YYSTACK_USE_ALLOCA
#define alloca __builtin_alloca
#endif /* __hpux */
#endif
#endif /* not _AIX */
#endif /* not MSDOS, or __TURBOC__ */
#endif /* not sparc */
#endif /* not GNU C */
#endif /* alloca not defined */
#endif /* YYSTACK_USE_ALLOCA not defined */

#ifdef YYSTACK_USE_ALLOCA
#define YYSTACK_ALLOC alloca
#else
#define YYSTACK_ALLOC malloc
#endif

/* Note: there must be only one dollar sign in this file.
   It is replaced by the list of actions, each action
   as one case of the switch.  */

#define yyerrok		(yyerrstatus = 0)
#define yyclearin	(yychar = YYEMPTY)
#define YYEMPTY		-2
#define YYEOF		0
#define YYACCEPT	goto yyacceptlab
#define YYABORT 	goto yyabortlab
#define YYERROR		goto yyerrlab1
/* Like YYERROR except do call yyerror.
   This remains here temporarily to ease the
   transition to the new meaning of YYERROR, for GCC.
   Once GCC version 2 has supplanted version 1, this can go.  */
#define YYFAIL		goto yyerrlab
#define YYRECOVERING()  (!!yyerrstatus)
#define YYBACKUP(token, value) \
do								\
  if (yychar == YYEMPTY && yylen == 1)				\
    { yychar = (token), yylval = (value);			\
      yychar1 = YYTRANSLATE (yychar);				\
      YYPOPSTACK;						\
      goto yybackup;						\
    }								\
  else								\
    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
while (0)

#define YYTERROR	1
#define YYERRCODE	256

#ifndef YYPURE
#define YYLEX		yylex()
#endif

#ifdef YYPURE
#ifdef YYLSP_NEEDED
#ifdef YYLEX_PARAM
#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
#else
#define YYLEX		yylex(&yylval, &yylloc)
#endif
#else /* not YYLSP_NEEDED */
#ifdef YYLEX_PARAM
#define YYLEX		yylex(&yylval, YYLEX_PARAM)
#else
#define YYLEX		yylex(&yylval)
#endif
#endif /* not YYLSP_NEEDED */
#endif

/* If nonreentrant, generate the variables here */

#ifndef YYPURE

int	yychar;			/*  the lookahead symbol		*/
YYSTYPE	yylval;			/*  the semantic value of the		*/
				/*  lookahead symbol			*/

#ifdef YYLSP_NEEDED
YYLTYPE yylloc;			/*  location data for the lookahead	*/
				/*  symbol				*/
#endif

int yynerrs;			/*  number of parse errors so far       */
#endif  /* not YYPURE */

#if YYDEBUG != 0
int yydebug;			/*  nonzero means print parse trace	*/
/* Since this is uninitialized, it does not stop multiple parsers
   from coexisting.  */
#endif

/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/

#ifndef	YYINITDEPTH
#define YYINITDEPTH 200
#endif

/*  YYMAXDEPTH is the maximum size the stacks can grow to
    (effective only if the built-in stack extension method is used).  */

#if YYMAXDEPTH == 0
#undef YYMAXDEPTH
#endif

#ifndef YYMAXDEPTH
#define YYMAXDEPTH 10000
#endif

/* Define __yy_memcpy.  Note that the size argument
   should be passed with type unsigned int, because that is what the non-GCC
   definitions require.  With GCC, __builtin_memcpy takes an arg
   of type size_t, but it can handle unsigned int.  */

#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
#else				/* not GNU C or C++ */
#ifndef __cplusplus

/* This is the most reliable way to avoid incompatibilities
   in available built-in functions on various systems.  */
static void
__yy_memcpy (to, from, count)
     char *to;
     char *from;
     unsigned int count;
{
  register char *f = from;
  register char *t = to;
  register int i = count;

  while (i-- > 0)
    *t++ = *f++;
}

#else /* __cplusplus */

/* This is the most reliable way to avoid incompatibilities
   in available built-in functions on various systems.  */
static void
__yy_memcpy (char *to, char *from, unsigned int count)
{
  register char *t = to;
  register char *f = from;
  register int i = count;

  while (i-- > 0)
    *t++ = *f++;
}

#endif
#endif

#line 217 "/usr/share/bison.simple"

/* The user can define YYPARSE_PARAM as the name of an argument to be passed
   into yyparse.  The argument should have type void *.
   It should actually point to an object.
   Grammar actions can access the variable by casting it
   to the proper pointer type.  */

#ifdef YYPARSE_PARAM
#ifdef __cplusplus
#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
#define YYPARSE_PARAM_DECL
#else /* not __cplusplus */
#define YYPARSE_PARAM_ARG YYPARSE_PARAM
#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
#endif /* not __cplusplus */
#else /* not YYPARSE_PARAM */
#define YYPARSE_PARAM_ARG
#define YYPARSE_PARAM_DECL
#endif /* not YYPARSE_PARAM */

/* Prevent warning if -Wstrict-prototypes.  */
#ifdef __GNUC__
#ifdef YYPARSE_PARAM
int yyparse (void *);
#else
int yyparse (void);
#endif
#endif

int
yyparse(YYPARSE_PARAM_ARG)
     YYPARSE_PARAM_DECL
{
  register int yystate;
  register int yyn;
  register short *yyssp;
  register YYSTYPE *yyvsp;
  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */

  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/

  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */

#ifdef YYLSP_NEEDED
  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
  YYLTYPE *yyls = yylsa;
  YYLTYPE *yylsp;

#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
#else
#define YYPOPSTACK   (yyvsp--, yyssp--)
#endif

  int yystacksize = YYINITDEPTH;
  int yyfree_stacks = 0;

#ifdef YYPURE
  int yychar;
  YYSTYPE yylval;
  int yynerrs;
#ifdef YYLSP_NEEDED
  YYLTYPE yylloc;
#endif
#endif

  YYSTYPE yyval;		/*  the variable used to return		*/
				/*  semantic values from the action	*/
				/*  routines				*/

  int yylen;

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Starting parse\n");
#endif

  yystate = 0;
  yyerrstatus = 0;
  yynerrs = 0;
  yychar = YYEMPTY;		/* Cause a token to be read.  */

  /* Initialize stack pointers.
     Waste one element of value and location stack
     so that they stay on the same level as the state stack.
     The wasted elements are never initialized.  */

  yyssp = yyss - 1;
  yyvsp = yyvs;
#ifdef YYLSP_NEEDED
  yylsp = yyls;
#endif

/* Push a new state, which is found in  yystate  .  */
/* In all cases, when you get here, the value and location stacks
   have just been pushed. so pushing a state here evens the stacks.  */
yynewstate:

  *++yyssp = yystate;

  if (yyssp >= yyss + yystacksize - 1)
    {
      /* Give user a chance to reallocate the stack */
      /* Use copies of these so that the &'s don't force the real ones into memory. */
      YYSTYPE *yyvs1 = yyvs;
      short *yyss1 = yyss;
#ifdef YYLSP_NEEDED
      YYLTYPE *yyls1 = yyls;
#endif

      /* Get the current used size of the three stacks, in elements.  */
      int size = yyssp - yyss + 1;

#ifdef yyoverflow
      /* Each stack pointer address is followed by the size of
	 the data in use in that stack, in bytes.  */
#ifdef YYLSP_NEEDED
      /* This used to be a conditional around just the two extra args,
	 but that might be undefined if yyoverflow is a macro.  */
      yyoverflow("parser stack overflow",
		 &yyss1, size * sizeof (*yyssp),
		 &yyvs1, size * sizeof (*yyvsp),
		 &yyls1, size * sizeof (*yylsp),
		 &yystacksize);
#else
      yyoverflow("parser stack overflow",
		 &yyss1, size * sizeof (*yyssp),
		 &yyvs1, size * sizeof (*yyvsp),
		 &yystacksize);
#endif

      yyss = yyss1; yyvs = yyvs1;
#ifdef YYLSP_NEEDED
      yyls = yyls1;
#endif
#else /* no yyoverflow */
      /* Extend the stack our own way.  */
      if (yystacksize >= YYMAXDEPTH)
	{
	  yyerror("parser stack overflow");
	  if (yyfree_stacks)
	    {
	      free (yyss);
	      free (yyvs);
#ifdef YYLSP_NEEDED
	      free (yyls);
#endif
	    }
	  return 2;
	}
      yystacksize *= 2;
      if (yystacksize > YYMAXDEPTH)
	yystacksize = YYMAXDEPTH;
#ifndef YYSTACK_USE_ALLOCA
      yyfree_stacks = 1;
#endif
      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
      __yy_memcpy ((char *)yyss, (char *)yyss1,
		   size * (unsigned int) sizeof (*yyssp));
      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
		   size * (unsigned int) sizeof (*yyvsp));
#ifdef YYLSP_NEEDED
      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
      __yy_memcpy ((char *)yyls, (char *)yyls1,
		   size * (unsigned int) sizeof (*yylsp));
#endif
#endif /* no yyoverflow */

      yyssp = yyss + size - 1;
      yyvsp = yyvs + size - 1;
#ifdef YYLSP_NEEDED
      yylsp = yyls + size - 1;
#endif

#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
#endif

      if (yyssp >= yyss + yystacksize - 1)
	YYABORT;
    }

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Entering state %d\n", yystate);
#endif

  goto yybackup;
 yybackup:

/* Do appropriate processing given the current state.  */
/* Read a lookahead token if we need one and don't already have one.  */
/* yyresume: */

  /* First try to decide what to do without reference to lookahead token.  */

  yyn = yypact[yystate];
  if (yyn == YYFLAG)
    goto yydefault;

  /* Not known => get a lookahead token if don't already have one.  */

  /* yychar is either YYEMPTY or YYEOF
     or a valid token in external form.  */

  if (yychar == YYEMPTY)
    {
#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Reading a token: ");
#endif
      yychar = YYLEX;
    }

  /* Convert token to internal form (in yychar1) for indexing tables with */

  if (yychar <= 0)		/* This means end of input. */
    {
      yychar1 = 0;
      yychar = YYEOF;		/* Don't call YYLEX any more */

#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Now at end of input.\n");
#endif
    }
  else
    {
      yychar1 = YYTRANSLATE(yychar);

#if YYDEBUG != 0
      if (yydebug)
	{
	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
	  /* Give the individual parser a way to print the precise meaning
	     of a token, for further debugging info.  */
#ifdef YYPRINT
	  YYPRINT (stderr, yychar, yylval);
#endif
	  fprintf (stderr, ")\n");
	}
#endif
    }

  yyn += yychar1;
  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
    goto yydefault;

  yyn = yytable[yyn];

  /* yyn is what to do for this token type in this state.
     Negative => reduce, -yyn is rule number.
     Positive => shift, yyn is new state.
       New state is final state => don't bother to shift,
       just return success.
     0, or most negative number => error.  */

  if (yyn < 0)
    {
      if (yyn == YYFLAG)
	goto yyerrlab;
      yyn = -yyn;
      goto yyreduce;
    }
  else if (yyn == 0)
    goto yyerrlab;

  if (yyn == YYFINAL)
    YYACCEPT;

  /* Shift the lookahead token.  */

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
#endif

  /* Discard the token being shifted unless it is eof.  */
  if (yychar != YYEOF)
    yychar = YYEMPTY;

  *++yyvsp = yylval;
#ifdef YYLSP_NEEDED
  *++yylsp = yylloc;
#endif

  /* count tokens shifted since error; after three, turn off error status.  */
  if (yyerrstatus) yyerrstatus--;

  yystate = yyn;
  goto yynewstate;

/* Do the default action for the current state.  */
yydefault:

  yyn = yydefact[yystate];
  if (yyn == 0)
    goto yyerrlab;

/* Do a reduction.  yyn is the number of a rule to reduce with.  */
yyreduce:
  yylen = yyr2[yyn];
  if (yylen > 0)
    yyval = yyvsp[1-yylen]; /* implement default value of the action */

#if YYDEBUG != 0
  if (yydebug)
    {
      int i;

      fprintf (stderr, "Reducing via rule %d (line %d), ",
	       yyn, yyrline[yyn]);

      /* Print the symbols being reduced, and their result.  */
      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
    }
#endif


  switch (yyn) {

case 1:
#line 246 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    if (CurDefmPrefix) {
      // If CurDefmPrefix is set, we're parsing a defm, which means that this is
      // actually the name of a multiclass.
      MultiClass *MC = MultiClasses[*yyvsp[0].StrVal];
      if (MC == 0) {
        err() << "Couldn't find class '" << *yyvsp[0].StrVal << "'!\n";
        exit(1);
      }
      yyval.Rec = &MC->Rec;
    } else {
      yyval.Rec = Records.getClass(*yyvsp[0].StrVal);
    }
    if (yyval.Rec == 0) {
      err() << "Couldn't find class '" << *yyvsp[0].StrVal << "'!\n";
      exit(1);
    }
    delete yyvsp[0].StrVal;
  ;
    break;}
case 2:
#line 268 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{                       // string type
    yyval.Ty = new StringRecTy();
  ;
    break;}
case 3:
#line 270 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{                           // bit type
    yyval.Ty = new BitRecTy();
  ;
    break;}
case 4:
#line 272 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{           // bits<x> type
    yyval.Ty = new BitsRecTy(yyvsp[-1].IntVal);
  ;
    break;}
case 5:
#line 274 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{                           // int type
    yyval.Ty = new IntRecTy();
  ;
    break;}
case 6:
#line 276 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{          // list<x> type
    yyval.Ty = new ListRecTy(yyvsp[-1].Ty);
  ;
    break;}
case 7:
#line 278 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{                          // code type
    yyval.Ty = new CodeRecTy();
  ;
    break;}
case 8:
#line 280 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{                           // dag type
    yyval.Ty = new DagRecTy();
  ;
    break;}
case 9:
#line 282 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{                       // Record Type
    yyval.Ty = new RecordRecTy(yyvsp[0].Rec);
  ;
    break;}
case 10:
#line 286 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.IntVal = 0; ;
    break;}
case 11:
#line 286 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.IntVal = 1; ;
    break;}
case 12:
#line 288 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.Initializer = 0; ;
    break;}
case 13:
#line 288 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.Initializer = yyvsp[0].Initializer; ;
    break;}
case 14:
#line 290 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  if (const RecordVal *RV = (CurRec ? CurRec->getValue(*yyvsp[0].StrVal) : 0)) {
    yyval.Initializer = new VarInit(*yyvsp[0].StrVal, RV->getType());
  } else if (CurRec && CurRec->isTemplateArg(CurRec->getName()+":"+*yyvsp[0].StrVal)) {
    const RecordVal *RV = CurRec->getValue(CurRec->getName()+":"+*yyvsp[0].StrVal);
    assert(RV && "Template arg doesn't exist??");
    yyval.Initializer = new VarInit(CurRec->getName()+":"+*yyvsp[0].StrVal, RV->getType());
  } else if (CurMultiClass &&
      CurMultiClass->Rec.isTemplateArg(CurMultiClass->Rec.getName()+"::"+*yyvsp[0].StrVal)) {
    std::string Name = CurMultiClass->Rec.getName()+"::"+*yyvsp[0].StrVal;
    const RecordVal *RV = CurMultiClass->Rec.getValue(Name);
    assert(RV && "Template arg doesn't exist??");
    yyval.Initializer = new VarInit(Name, RV->getType());
  } else if (Record *D = Records.getDef(*yyvsp[0].StrVal)) {
    yyval.Initializer = new DefInit(D);
  } else {
    err() << "Variable not defined: '" << *yyvsp[0].StrVal << "'!\n";
    exit(1);
  }
  
  delete yyvsp[0].StrVal;
;
    break;}
case 15:
#line 313 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = yyvsp[0].Initializer;
  ;
    break;}
case 16:
#line 315 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = new IntInit(yyvsp[0].IntVal);
  ;
    break;}
case 17:
#line 317 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = new StringInit(*yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
  ;
    break;}
case 18:
#line 320 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = new CodeInit(*yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
  ;
    break;}
case 19:
#line 323 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = new UnsetInit();
  ;
    break;}
case 20:
#line 325 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    BitsInit *Init = new BitsInit(yyvsp[-1].FieldList->size());
    for (unsigned i = 0, e = yyvsp[-1].FieldList->size(); i != e; ++i) {
      struct Init *Bit = (*yyvsp[-1].FieldList)[i]->convertInitializerTo(new BitRecTy());
      if (Bit == 0) {
        err() << "Element #" << i << " (" << *(*yyvsp[-1].FieldList)[i]
       	      << ") is not convertable to a bit!\n";
        exit(1);
      }
      Init->setBit(yyvsp[-1].FieldList->size()-i-1, Bit);
    }
    yyval.Initializer = Init;
    delete yyvsp[-1].FieldList;
  ;
    break;}
case 21:
#line 338 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    // This is a CLASS<initvalslist> expression.  This is supposed to synthesize
    // a new anonymous definition, deriving from CLASS<initvalslist> with no
    // body.
    Record *Class = Records.getClass(*yyvsp[-3].StrVal);
    if (!Class) {
      err() << "Expected a class, got '" << *yyvsp[-3].StrVal << "'!\n";
      exit(1);
    }
    delete yyvsp[-3].StrVal;
    
    static unsigned AnonCounter = 0;
    Record *OldRec = CurRec;  // Save CurRec.
    
    // Create the new record, set it as CurRec temporarily.
    CurRec = new Record("anonymous.val."+utostr(AnonCounter++));
    addSubClass(Class, *yyvsp[-1].FieldList);    // Add info about the subclass to CurRec.
    delete yyvsp[-1].FieldList;  // Free up the template args.
    
    CurRec->resolveReferences();
    
    Records.addDef(CurRec);
    
    // The result of the expression is a reference to the new record.
    yyval.Initializer = new DefInit(CurRec);
    
    // Restore the old CurRec
    CurRec = OldRec;
  ;
    break;}
case 22:
#line 366 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = yyvsp[-3].Initializer->convertInitializerBitRange(*yyvsp[-1].BitList);
    if (yyval.Initializer == 0) {
      err() << "Invalid bit range for value '" << *yyvsp[-3].Initializer << "'!\n";
      exit(1);
    }
    delete yyvsp[-1].BitList;
  ;
    break;}
case 23:
#line 373 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = new ListInit(*yyvsp[-1].FieldList);
    delete yyvsp[-1].FieldList;
  ;
    break;}
case 24:
#line 376 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    if (!yyvsp[-2].Initializer->getFieldType(*yyvsp[0].StrVal)) {
      err() << "Cannot access field '" << *yyvsp[0].StrVal << "' of value '" << *yyvsp[-2].Initializer << "!\n";
      exit(1);
    }
    yyval.Initializer = new FieldInit(yyvsp[-2].Initializer, *yyvsp[0].StrVal);
    delete yyvsp[0].StrVal;
  ;
    break;}
case 25:
#line 383 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = new DagInit(yyvsp[-2].Initializer, *yyvsp[-1].DagValueList);
    delete yyvsp[-1].DagValueList;
  ;
    break;}
case 26:
#line 386 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    std::reverse(yyvsp[-1].BitList->begin(), yyvsp[-1].BitList->end());
    yyval.Initializer = yyvsp[-3].Initializer->convertInitListSlice(*yyvsp[-1].BitList);
    if (yyval.Initializer == 0) {
      err() << "Invalid list slice for value '" << *yyvsp[-3].Initializer << "'!\n";
      exit(1);
    }
    delete yyvsp[-1].BitList;
  ;
    break;}
case 27:
#line 394 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = (new BinOpInit(BinOpInit::CONCAT, yyvsp[-3].Initializer, yyvsp[-1].Initializer))->Fold();
  ;
    break;}
case 28:
#line 396 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = (new BinOpInit(BinOpInit::SHL, yyvsp[-3].Initializer, yyvsp[-1].Initializer))->Fold();
  ;
    break;}
case 29:
#line 398 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = (new BinOpInit(BinOpInit::SRA, yyvsp[-3].Initializer, yyvsp[-1].Initializer))->Fold();
  ;
    break;}
case 30:
#line 400 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = (new BinOpInit(BinOpInit::SRL, yyvsp[-3].Initializer, yyvsp[-1].Initializer))->Fold();
  ;
    break;}
case 31:
#line 402 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.Initializer = (new BinOpInit(BinOpInit::STRCONCAT, yyvsp[-3].Initializer, yyvsp[-1].Initializer))->Fold();
  ;
    break;}
case 32:
#line 406 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.StrVal = new std::string();
  ;
    break;}
case 33:
#line 409 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.StrVal = yyvsp[0].StrVal;
  ;
    break;}
case 34:
#line 413 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.DagValueList = new std::vector<std::pair<Init*, std::string> >();
    yyval.DagValueList->push_back(std::make_pair(yyvsp[-1].Initializer, *yyvsp[0].StrVal));
    delete yyvsp[0].StrVal;
  ;
    break;}
case 35:
#line 418 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyvsp[-3].DagValueList->push_back(std::make_pair(yyvsp[-1].Initializer, *yyvsp[0].StrVal));
    delete yyvsp[0].StrVal;
    yyval.DagValueList = yyvsp[-3].DagValueList;
  ;
    break;}
case 36:
#line 424 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.DagValueList = new std::vector<std::pair<Init*, std::string> >();
  ;
    break;}
case 37:
#line 427 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.DagValueList = yyvsp[0].DagValueList; ;
    break;}
case 38:
#line 430 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.BitList = new std::vector<unsigned>();
    yyval.BitList->push_back(yyvsp[0].IntVal);
  ;
    break;}
case 39:
#line 433 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    if (yyvsp[-2].IntVal < 0 || yyvsp[0].IntVal < 0) {
      err() << "Invalid range: " << yyvsp[-2].IntVal << "-" << yyvsp[0].IntVal << "!\n";
      exit(1);
    }
    yyval.BitList = new std::vector<unsigned>();
    if (yyvsp[-2].IntVal < yyvsp[0].IntVal) {
      for (int i = yyvsp[-2].IntVal; i <= yyvsp[0].IntVal; ++i)
        yyval.BitList->push_back(i);
    } else {
      for (int i = yyvsp[-2].IntVal; i >= yyvsp[0].IntVal; --i)
        yyval.BitList->push_back(i);
    }
  ;
    break;}
case 40:
#line 446 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyvsp[0].IntVal = -yyvsp[0].IntVal;
    if (yyvsp[-1].IntVal < 0 || yyvsp[0].IntVal < 0) {
      err() << "Invalid range: " << yyvsp[-1].IntVal << "-" << yyvsp[0].IntVal << "!\n";
      exit(1);
    }
    yyval.BitList = new std::vector<unsigned>();
    if (yyvsp[-1].IntVal < yyvsp[0].IntVal) {
      for (int i = yyvsp[-1].IntVal; i <= yyvsp[0].IntVal; ++i)
        yyval.BitList->push_back(i);
    } else {
      for (int i = yyvsp[-1].IntVal; i >= yyvsp[0].IntVal; --i)
        yyval.BitList->push_back(i);
    }
  ;
    break;}
case 41:
#line 460 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    (yyval.BitList=yyvsp[-2].BitList)->push_back(yyvsp[0].IntVal);
  ;
    break;}
case 42:
#line 462 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    if (yyvsp[-2].IntVal < 0 || yyvsp[0].IntVal < 0) {
      err() << "Invalid range: " << yyvsp[-2].IntVal << "-" << yyvsp[0].IntVal << "!\n";
      exit(1);
    }
    yyval.BitList = yyvsp[-4].BitList;
    if (yyvsp[-2].IntVal < yyvsp[0].IntVal) {
      for (int i = yyvsp[-2].IntVal; i <= yyvsp[0].IntVal; ++i)
        yyval.BitList->push_back(i);
    } else {
      for (int i = yyvsp[-2].IntVal; i >= yyvsp[0].IntVal; --i)
        yyval.BitList->push_back(i);
    }
  ;
    break;}
case 43:
#line 475 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyvsp[0].IntVal = -yyvsp[0].IntVal;
    if (yyvsp[-1].IntVal < 0 || yyvsp[0].IntVal < 0) {
      err() << "Invalid range: " << yyvsp[-1].IntVal << "-" << yyvsp[0].IntVal << "!\n";
      exit(1);
    }
    yyval.BitList = yyvsp[-3].BitList;
    if (yyvsp[-1].IntVal < yyvsp[0].IntVal) {
      for (int i = yyvsp[-1].IntVal; i <= yyvsp[0].IntVal; ++i)
        yyval.BitList->push_back(i);
    } else {
      for (int i = yyvsp[-1].IntVal; i >= yyvsp[0].IntVal; --i)
        yyval.BitList->push_back(i);
    }
  ;
    break;}
case 44:
#line 491 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.BitList = yyvsp[0].BitList; std::reverse(yyvsp[0].BitList->begin(), yyvsp[0].BitList->end()); ;
    break;}
case 45:
#line 493 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.BitList = 0; ;
    break;}
case 46:
#line 493 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.BitList = yyvsp[-1].BitList; ;
    break;}
case 47:
#line 497 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.FieldList = new std::vector<Init*>();
  ;
    break;}
case 48:
#line 499 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.FieldList = yyvsp[0].FieldList;
  ;
    break;}
case 49:
#line 503 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.FieldList = new std::vector<Init*>();
    yyval.FieldList->push_back(yyvsp[0].Initializer);
  ;
    break;}
case 50:
#line 506 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    (yyval.FieldList = yyvsp[-2].FieldList)->push_back(yyvsp[0].Initializer);
  ;
    break;}
case 51:
#line 510 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  std::string DecName = *yyvsp[-1].StrVal;
  if (ParsingTemplateArgs) {
    if (CurRec) {
      DecName = CurRec->getName() + ":" + DecName;
    } else {
      assert(CurMultiClass);
    }
    if (CurMultiClass)
      DecName = CurMultiClass->Rec.getName() + "::" + DecName;
  }

  addValue(RecordVal(DecName, yyvsp[-2].Ty, yyvsp[-3].IntVal));
  setValue(DecName, 0, yyvsp[0].Initializer);
  yyval.StrVal = new std::string(DecName);
;
    break;}
case 52:
#line 527 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  delete yyvsp[-1].StrVal;
;
    break;}
case 53:
#line 529 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  setValue(*yyvsp[-4].StrVal, yyvsp[-3].BitList, yyvsp[-1].Initializer);
  delete yyvsp[-4].StrVal;
  delete yyvsp[-3].BitList;
;
    break;}
case 58:
#line 538 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.SubClassRef = new SubClassRefTy(yyvsp[0].Rec, new std::vector<Init*>());
  ;
    break;}
case 59:
#line 540 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.SubClassRef = new SubClassRefTy(yyvsp[-3].Rec, yyvsp[-1].FieldList);
  ;
    break;}
case 60:
#line 544 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.SubClassList = new std::vector<SubClassRefTy>();
    yyval.SubClassList->push_back(*yyvsp[0].SubClassRef);
    delete yyvsp[0].SubClassRef;
  ;
    break;}
case 61:
#line 549 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    (yyval.SubClassList=yyvsp[-2].SubClassList)->push_back(*yyvsp[0].SubClassRef);
    delete yyvsp[0].SubClassRef;
  ;
    break;}
case 62:
#line 554 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.SubClassList = new std::vector<SubClassRefTy>();
  ;
    break;}
case 63:
#line 557 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    yyval.SubClassList = yyvsp[0].SubClassList;
  ;
    break;}
case 64:
#line 561 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  getActiveRec()->addTemplateArg(*yyvsp[0].StrVal);
  delete yyvsp[0].StrVal;
;
    break;}
case 65:
#line 564 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  getActiveRec()->addTemplateArg(*yyvsp[0].StrVal);
  delete yyvsp[0].StrVal;
;
    break;}
case 66:
#line 569 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
    break;}
case 69:
#line 572 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.StrVal = yyvsp[0].StrVal; ;
    break;}
case 70:
#line 572 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ yyval.StrVal = new std::string(); ;
    break;}
case 71:
#line 574 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  static unsigned AnonCounter = 0;
  if (yyvsp[0].StrVal->empty())
    *yyvsp[0].StrVal = "anonymous."+utostr(AnonCounter++);
  yyval.StrVal = yyvsp[0].StrVal;
;
    break;}
case 72:
#line 581 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  // If a class of this name already exists, it must be a forward ref.
  if ((CurRec = Records.getClass(*yyvsp[0].StrVal))) {
    // If the body was previously defined, this is an error.
    if (!CurRec->getValues().empty() ||
        !CurRec->getSuperClasses().empty() ||
        !CurRec->getTemplateArgs().empty()) {
      err() << "Class '" << CurRec->getName() << "' already defined!\n";
      exit(1);
    }
  } else {
    // If this is the first reference to this class, create and add it.
    CurRec = new Record(*yyvsp[0].StrVal);
    Records.addClass(CurRec);
  }
  delete yyvsp[0].StrVal;
;
    break;}
case 73:
#line 599 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  CurRec = new Record(*yyvsp[0].StrVal);
  delete yyvsp[0].StrVal;
  
  if (!CurMultiClass) {
    // Top-level def definition.
    
    // Ensure redefinition doesn't happen.
    if (Records.getDef(CurRec->getName())) {
      err() << "def '" << CurRec->getName() << "' already defined!\n";
      exit(1);
    }
    Records.addDef(CurRec);
  } else {
    // Otherwise, a def inside a multiclass, add it to the multiclass.
    for (unsigned i = 0, e = CurMultiClass->DefPrototypes.size(); i != e; ++i)
      if (CurMultiClass->DefPrototypes[i]->getName() == CurRec->getName()) {
        err() << "def '" << CurRec->getName()
              << "' already defined in this multiclass!\n";
        exit(1);
      }
    CurMultiClass->DefPrototypes.push_back(CurRec);
  }
;
    break;}
case 74:
#line 624 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
           for (unsigned i = 0, e = yyvsp[0].SubClassList->size(); i != e; ++i) {
             addSubClass((*yyvsp[0].SubClassList)[i].first, *(*yyvsp[0].SubClassList)[i].second);
             // Delete the template arg values for the class
             delete (*yyvsp[0].SubClassList)[i].second;
           }
           delete yyvsp[0].SubClassList;   // Delete the class list.
  
           // Process any variables on the let stack.
           for (unsigned i = 0, e = LetStack.size(); i != e; ++i)
             for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j)
               setValue(LetStack[i][j].Name,
                        LetStack[i][j].HasBits ? &LetStack[i][j].Bits : 0,
                        LetStack[i][j].Value);
         ;
    break;}
case 75:
#line 638 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
           yyval.Rec = CurRec;
           CurRec = 0;
         ;
    break;}
case 76:
#line 643 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
                ParsingTemplateArgs = true;
            ;
    break;}
case 77:
#line 645 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
                ParsingTemplateArgs = false;
            ;
    break;}
case 78:
#line 647 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
        yyval.Rec = yyvsp[0].Rec;
     ;
    break;}
case 79:
#line 651 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  if (CurMultiClass == 0)  // Def's in multiclasses aren't really defs.
    yyvsp[0].Rec->resolveReferences();

  // If ObjectBody has template arguments, it's an error.
  assert(yyvsp[0].Rec->getTemplateArgs().empty() && "How'd this get template args?");
  yyval.Rec = yyvsp[0].Rec;
;
    break;}
case 80:
#line 661 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  yyval.Rec = yyvsp[0].Rec;
  // Copy the template arguments for the multiclass into the def.
  const std::vector<std::string> &TArgs = CurMultiClass->Rec.getTemplateArgs();
  
  for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
    const RecordVal *RV = CurMultiClass->Rec.getValue(TArgs[i]);
    assert(RV && "Template arg doesn't exist?");
    yyval.Rec->addValue(*RV);
  }
;
    break;}
case 81:
#line 675 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  yyval.RecList = new std::vector<Record*>();
  yyval.RecList->push_back(yyvsp[0].Rec);
;
    break;}
case 82:
#line 678 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  yyval.RecList->push_back(yyvsp[0].Rec);  
;
    break;}
case 83:
#line 682 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  MultiClass *&MCE = MultiClasses[*yyvsp[0].StrVal];
  if (MCE) {
    err() << "multiclass '" << *yyvsp[0].StrVal << "' already defined!\n";
    exit(1);
  }
  MCE = CurMultiClass = new MultiClass(*yyvsp[0].StrVal);
  delete yyvsp[0].StrVal;
;
    break;}
case 84:
#line 693 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
                                             ParsingTemplateArgs = true;
                                           ;
    break;}
case 85:
#line 695 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
                                             ParsingTemplateArgs = false;
                                           ;
    break;}
case 86:
#line 697 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  CurMultiClass = 0;
;
    break;}
case 87:
#line 702 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ CurDefmPrefix = yyvsp[0].StrVal; ;
    break;}
case 88:
#line 702 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  // To instantiate a multiclass, we need to first get the multiclass, then
  // instantiate each def contained in the multiclass with the SubClassRef
  // template parameters.
  MultiClass *MC = MultiClasses[yyvsp[-1].SubClassRef->first->getName()];
  assert(MC && "Didn't lookup multiclass correctly?");
  std::vector<Init*> &TemplateVals = *yyvsp[-1].SubClassRef->second;
  delete yyvsp[-1].SubClassRef;
  
  // Verify that the correct number of template arguments were specified.
  const std::vector<std::string> &TArgs = MC->Rec.getTemplateArgs();
  if (TArgs.size() < TemplateVals.size()) {
    err() << "ERROR: More template args specified than multiclass expects!\n";
    exit(1);
  }
  
  // Loop over all the def's in the multiclass, instantiating each one.
  for (unsigned i = 0, e = MC->DefPrototypes.size(); i != e; ++i) {
    Record *DefProto = MC->DefPrototypes[i];
    
    // Add the suffix to the defm name to get the new name.
    assert(CurRec == 0 && "A def is current?");
    CurRec = new Record(*yyvsp[-4].StrVal + DefProto->getName());
    
    addSubClass(DefProto, std::vector<Init*>());
    
    // Loop over all of the template arguments, setting them to the specified
    // value or leaving them as the default if necessary.
    for (unsigned i = 0, e = TArgs.size(); i != e; ++i) {
      if (i < TemplateVals.size()) { // A value is specified for this temp-arg?
        // Set it now.
        setValue(TArgs[i], 0, TemplateVals[i]);
        
        // Resolve it next.
        CurRec->resolveReferencesTo(CurRec->getValue(TArgs[i]));
        
        // Now remove it.
        CurRec->removeValue(TArgs[i]);
        
      } else if (!CurRec->getValue(TArgs[i])->getValue()->isComplete()) {
        err() << "ERROR: Value not specified for template argument #"
        << i << " (" << TArgs[i] << ") of multiclassclass '"
        << MC->Rec.getName() << "'!\n";
        exit(1);
      }
    }
    
    // If the mdef is inside a 'let' expression, add to each def.
    for (unsigned i = 0, e = LetStack.size(); i != e; ++i)
      for (unsigned j = 0, e = LetStack[i].size(); j != e; ++j)
        setValue(LetStack[i][j].Name,
                 LetStack[i][j].HasBits ? &LetStack[i][j].Bits : 0,
                 LetStack[i][j].Value);
    
    
    // Ensure redefinition doesn't happen.
    if (Records.getDef(CurRec->getName())) {
      err() << "def '" << CurRec->getName() << "' already defined, "
            << "instantiating defm '" << *yyvsp[-4].StrVal << "' with subdef '"
            << DefProto->getName() << "'!\n";
      exit(1);
    }
    Records.addDef(CurRec);
    
    CurRec->resolveReferences();

    CurRec = 0;
  }
  
  delete &TemplateVals;
  delete yyvsp[-4].StrVal;
  CurDefmPrefix = 0;
;
    break;}
case 89:
#line 776 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
    break;}
case 90:
#line 776 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
    break;}
case 93:
#line 779 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
  LetStack.back().push_back(LetRecord(*yyvsp[-3].StrVal, yyvsp[-2].BitList, yyvsp[0].Initializer));
  delete yyvsp[-3].StrVal; delete yyvsp[-2].BitList;
;
    break;}
case 96:
#line 787 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{ LetStack.push_back(std::vector<LetRecord>()); ;
    break;}
case 98:
#line 790 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    LetStack.pop_back();
  ;
    break;}
case 99:
#line 793 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{
    LetStack.pop_back();
  ;
    break;}
case 100:
#line 797 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
    break;}
case 101:
#line 797 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"
{;
    break;}
}
   /* the action file gets copied in in place of this dollarsign */
#line 543 "/usr/share/bison.simple"

  yyvsp -= yylen;
  yyssp -= yylen;
#ifdef YYLSP_NEEDED
  yylsp -= yylen;
#endif

#if YYDEBUG != 0
  if (yydebug)
    {
      short *ssp1 = yyss - 1;
      fprintf (stderr, "state stack now");
      while (ssp1 != yyssp)
	fprintf (stderr, " %d", *++ssp1);
      fprintf (stderr, "\n");
    }
#endif

  *++yyvsp = yyval;

#ifdef YYLSP_NEEDED
  yylsp++;
  if (yylen == 0)
    {
      yylsp->first_line = yylloc.first_line;
      yylsp->first_column = yylloc.first_column;
      yylsp->last_line = (yylsp-1)->last_line;
      yylsp->last_column = (yylsp-1)->last_column;
      yylsp->text = 0;
    }
  else
    {
      yylsp->last_line = (yylsp+yylen-1)->last_line;
      yylsp->last_column = (yylsp+yylen-1)->last_column;
    }
#endif

  /* Now "shift" the result of the reduction.
     Determine what state that goes to,
     based on the state we popped back to
     and the rule number reduced by.  */

  yyn = yyr1[yyn];

  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
    yystate = yytable[yystate];
  else
    yystate = yydefgoto[yyn - YYNTBASE];

  goto yynewstate;

yyerrlab:   /* here on detecting error */

  if (! yyerrstatus)
    /* If not already recovering from an error, report this error.  */
    {
      ++yynerrs;

#ifdef YYERROR_VERBOSE
      yyn = yypact[yystate];

      if (yyn > YYFLAG && yyn < YYLAST)
	{
	  int size = 0;
	  char *msg;
	  int x, count;

	  count = 0;
	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
	  for (x = (yyn < 0 ? -yyn : 0);
	       x < (sizeof(yytname) / sizeof(char *)); x++)
	    if (yycheck[x + yyn] == x)
	      size += strlen(yytname[x]) + 15, count++;
	  msg = (char *) malloc(size + 15);
	  if (msg != 0)
	    {
	      strcpy(msg, "parse error");

	      if (count < 5)
		{
		  count = 0;
		  for (x = (yyn < 0 ? -yyn : 0);
		       x < (sizeof(yytname) / sizeof(char *)); x++)
		    if (yycheck[x + yyn] == x)
		      {
			strcat(msg, count == 0 ? ", expecting `" : " or `");
			strcat(msg, yytname[x]);
			strcat(msg, "'");
			count++;
		      }
		}
	      yyerror(msg);
	      free(msg);
	    }
	  else
	    yyerror ("parse error; also virtual memory exceeded");
	}
      else
#endif /* YYERROR_VERBOSE */
	yyerror("parse error");
    }

  goto yyerrlab1;
yyerrlab1:   /* here on error raised explicitly by an action */

  if (yyerrstatus == 3)
    {
      /* if just tried and failed to reuse lookahead token after an error, discard it.  */

      /* return failure if at end of input */
      if (yychar == YYEOF)
	YYABORT;

#if YYDEBUG != 0
      if (yydebug)
	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
#endif

      yychar = YYEMPTY;
    }

  /* Else will try to reuse lookahead token
     after shifting the error token.  */

  yyerrstatus = 3;		/* Each real token shifted decrements this */

  goto yyerrhandle;

yyerrdefault:  /* current state does not do anything special for the error token. */

#if 0
  /* This is wrong; only states that explicitly want error tokens
     should shift them.  */
  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
  if (yyn) goto yydefault;
#endif

yyerrpop:   /* pop the current state because it cannot handle the error token */

  if (yyssp == yyss) YYABORT;
  yyvsp--;
  yystate = *--yyssp;
#ifdef YYLSP_NEEDED
  yylsp--;
#endif

#if YYDEBUG != 0
  if (yydebug)
    {
      short *ssp1 = yyss - 1;
      fprintf (stderr, "Error: state stack now");
      while (ssp1 != yyssp)
	fprintf (stderr, " %d", *++ssp1);
      fprintf (stderr, "\n");
    }
#endif

yyerrhandle:

  yyn = yypact[yystate];
  if (yyn == YYFLAG)
    goto yyerrdefault;

  yyn += YYTERROR;
  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
    goto yyerrdefault;

  yyn = yytable[yyn];
  if (yyn < 0)
    {
      if (yyn == YYFLAG)
	goto yyerrpop;
      yyn = -yyn;
      goto yyreduce;
    }
  else if (yyn == 0)
    goto yyerrpop;

  if (yyn == YYFINAL)
    YYACCEPT;

#if YYDEBUG != 0
  if (yydebug)
    fprintf(stderr, "Shifting error token, ");
#endif

  *++yyvsp = yylval;
#ifdef YYLSP_NEEDED
  *++yylsp = yylloc;
#endif

  yystate = yyn;
  goto yynewstate;

 yyacceptlab:
  /* YYACCEPT comes here.  */
  if (yyfree_stacks)
    {
      free (yyss);
      free (yyvs);
#ifdef YYLSP_NEEDED
      free (yyls);
#endif
    }
  return 0;

 yyabortlab:
  /* YYABORT comes here.  */
  if (yyfree_stacks)
    {
      free (yyss);
      free (yyvs);
#ifdef YYLSP_NEEDED
      free (yyls);
#endif
    }
  return 1;
}
#line 801 "/Volumes/ProjectsDisk/cvs/llvm/utils/TableGen/FileParser.y"


int yyerror(const char *ErrorMsg) {
  err() << "Error parsing: " << ErrorMsg << "\n";
  exit(1);
}
