private List resolveSetSymbol(String nonterm, Map done)
		throws ParserBuildException
	{
		if (done.get(nonterm) != null)
			return null;
		done.put(nonterm, nonterm);	// avoid endless loops

		List values = (List) get(nonterm);
		List newList = new ArrayList(values.size() * 2);
		
		for (int j = 0; j < values.size(); j++)	{
			String symbol = (String) values.get(j);
			
			if (Token.isTerminal(symbol) == false)	{	// resolve nonterminal
				try	{
					List l = resolveSetSymbol(symbol, done);
					for (int i = 0; l != null && i < l.size(); i++)	{
						String s = (String) l.get(i);
						if (newList.indexOf(s) < 0)
							newList.add(s);
					}
				}
				catch (Exception ex)	{
					throw new ParserBuildException("FOLLOW set error: "+ex.getMessage()+" <- "+symbol);
				}
			}
			else	{	// add terminal
				if (newList.indexOf(symbol) < 0)
					newList.add(symbol);
			}
		}
		return newList;
	}