code: @Override
      public synchronized void updateSymbolTable(SymbolTable t)
      {
          SymbolTable curr = mSymbols;
          /* Let's only add if table was direct descendant; this prevents
           * siblings from keeping overwriting settings (multiple direct
           * children have additional symbols added)
           */
          if (t.isDirectChildOf(curr)) {
              /* 07-Apr-2006, TSa: Actually, since huge symbol tables
               *    might become hindrance more than benefit (either in
               *    pathological cases with random names; or with very
               *    long running processes), let's actually limit both
               *    number of generations, and, more imporantly, maximum
               *    size of the symbol table
               */
              if (t.size() > MAX_SYMBOL_TABLE_SIZE || 
                  t.version() > MAX_SYMBOL_TABLE_GENERATIONS) {
                  // If so, we'll reset from bare defaults
                  mSymbols = mRootSymbols;
  //System.err.println("DEBUG: !!!! XXXXX Symbol Table Flush: size: "+t.size()+"; version: "+t.version());
              } else {
                  mSymbols.mergeChild(t);
  //System.err.println("Debug: new symbol table: size: "+t.size()+"; version: "+t.version());
              }
          }
  //else System.err.println("Debug: skipping symbol table update");
      }
docs: Method individual parsers call to pass back symbol table that
  they updated, which may be useful for other parser to reuse, instead
  of previous base symbol table.
  <p>
  Note: parser is only to call this method, if passed-in symbol
  table was modified, ie new entry/ies were added in addition to
  whatever was in root table.