/*
 * PUBLIC DOMAIN PCCTS-BASED C++ GRAMMAR (cplusplus.g, stat.g, expr.g)
 *
 * Authors: Sumana Srinivasan, NeXT Inc.;            sumana_srinivasan@next.com
 *          Terence Parr, Parr Research Corporation; parrt@parr-research.com
 *          Russell Quong, Purdue University;        quong@ecn.purdue.edu
 *
 * SOFTWARE RIGHTS
 *
 * This file is a part of the ANTLR-based C++ grammar and is free
 * software.  We do not reserve any LEGAL rights to its use or
 * distribution, but you may NOT claim ownership or authorship of this
 * grammar or support code.  An individual or company may otherwise do
 * whatever they wish with the grammar distributed herewith including the
 * incorporation of the grammar or the output generated by ANTLR into
 * commerical software.  You may redistribute in source or binary form
 * without payment of royalties to us as long as this header remains
 * in all source distributions.
 *
 * We encourage users to develop parsers/tools using this grammar.
 * In return, we ask that credit is given to us for developing this
 * grammar.  By "credit", we mean that if you incorporate our grammar or
 * the generated code into one of your programs (commercial product,
 * research project, or otherwise) that you acknowledge this fact in the
 * documentation, research report, etc....  In addition, you should say nice
 * things about us at every opportunity.
 *
 * As long as these guidelines are kept, we expect to continue enhancing
 * this grammar.  Feel free to send us enhancements, fixes, bug reports,
 * suggestions, or general words of encouragement at parrt@parr-research.com.
 *
 * NeXT Computer Inc.
 * 900 Chesapeake Dr.
 * Redwood City, CA 94555
 * 12/02/1994
 *
 * Restructured for public consumption by Terence Parr late February, 1995.
 *
 * Requires PCCTS 1.32b4 or higher to get past ANTLR.
 *
 * DISCLAIMER: we make no guarantees that this grammar works, makes sense,
 *             or can be used to do anything useful.
 */
/* 1999-2005 Version 3.1 November 2005
 * Modified by David Wigg at London South Bank University for CPP_parser.g
 *
 * See MyReadMe.txt for further information
 *
 * This file is best viewed in courier font with tabs set to 4 spaces
 */

#ifndef CPPDictionary_hpp
#define CPPDictionary_hpp

#include <geode/internal/geode_globals.hpp>
#include "Dictionary.hpp"

class CPPDictionary : public Dictionary {
 public:
  CPPDictionary(int nb = 43, int ns = 50, int nc = 30000)
      : Dictionary(nb, ns, nc) {}

 protected:
  void dumpSymbol(FILE *f, DictEntry *de) {
    CPPSymbol *cs = (CPPSymbol *)de;

#ifdef DIAG_MSGES
    if (!(cs->getType() == CPPSymbol::otTypedef ||
          cs->getType() == CPPSymbol::otClass ||
          cs->getType() == CPPSymbol::otEnum ||
          cs->getType() == CPPSymbol::otUnion ||
          cs->getType() == CPPSymbol::otStruct))
      fprintf(f, "[non-");
    else
      fprintf(f, "[");
    fprintf(f, "type: %s]\n", cs->getKey());
#endif
  }
};

#define antlrTrace(x)

#endif
