public String toString(SymbolTable<CopperASTBean> symbolTable)
	{
		StringBuffer rv = new StringBuffer();
		rv.append("Terminals:\n");
		for(int i = terminals.nextSetBit(0);i >= 0;i = terminals.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(i).getName()).append(" (").append(symbolTable.get(i).getDisplayName()).append(")\n");
		}
		rv.append("Nonterminals:\n");
		for(int i = nonterminals.nextSetBit(0);i >= 0;i = nonterminals.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(i).getName()).append(" (").append(symbolTable.get(i).getDisplayName()).append(")\n");
		}
		rv.append("Productions:\n");
		for(int i = productions.nextSetBit(0);i >= 0;i = productions.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(pr.getLHS(i)).getDisplayName()).append(" ::=");
			for(int rhs = 0;rhs < pr.getRHSLength(i);rhs++) rv.append(" ").append(symbolTable.get(pr.getRHSSym(i,rhs)).getDisplayName());
			rv.append("\n");
		}
		rv.append("Disambiguation functions:\n");
		for(int i = disambiguationFunctions.nextSetBit(0);i >= 0;i = disambiguationFunctions.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(i).getName()).append(" (").append(symbolTable.get(i).getDisplayName()).append(")\n");
		}
		rv.append("Terminal classes:\n");
		for(int i = terminalClasses.nextSetBit(0);i >= 0;i = terminalClasses.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(i).getName()).append(" (").append(symbolTable.get(i).getDisplayName()).append(")\n");
		}
		rv.append("Operator classes:\n");
		for(int i = operatorClasses.nextSetBit(0);i >= 0;i = operatorClasses.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(i).getName()).append(" (").append(symbolTable.get(i).getDisplayName()).append(")\n");
		}
		rv.append("Parser attributes:\n");
		for(int i = parserAttributes.nextSetBit(0);i >= 0;i = parserAttributes.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(i).getName()).append(" (").append(symbolTable.get(i).getDisplayName()).append(")\n");
		}
		rv.append("Grammars:\n");
		for(int i = grammars.nextSetBit(0);i >= 0;i = grammars.nextSetBit(i+1))
		{
			rv.append("    [").append(i).append("] ").append(symbolTable.get(i).getName()).append(" (").append(symbolTable.get(i).getDisplayName()).append(")\n");
		}
		rv.append("Parsers:\n");
		rv.append("    [").append(parser).append("] ").append(symbolTable.get(parser).getName()).append(" (").append(symbolTable.get(parser).getDisplayName()).append(")\n");
		rv.append("Precedence graph:\n");
		rv.append(t.precedences);
		return rv.toString();
	}