public Hashtable fillParseActionLine(int state, FirstSets firstSets, FollowSets followSets)	{
		// fill one row of PARSE-ACTION-table
		Hashtable h = new Hashtable(entries.size() * 10);
		
		for (Enumeration e = entries.elements(); e.hasMoreElements(); )	{
			// store temporary
			RuleStateItem item = (RuleStateItem)e.nextElement();
			String symbol = item.getPendingSymbol();
			
			if (symbol != null)	{	// pointer not at end of rule, SHIFT
				if (Token.isTerminal(symbol))	{	// enter SHIFT at terminal symbol
					// first-set of terminal is terminal
					setParseTableLine(state, h, item, ParserTables.SHIFT, symbol);
				}
				else	{	// put SHIFT at all terminals of FIRST-set
					List firstSet = getNontermShiftSymbols(firstSets, item.getNonterminal());
					
					if (firstSet != null)	{	// LALR will return null, SLR not null
						for (int i = 0; i < firstSet.size(); i++)	{
							String terminal = (String) firstSet.get(i);
							setParseTableLine(state, h, item, ParserTables.SHIFT, terminal);
						}
					}
				}
			}
			else	{	// pointer at end, REDUCE to rule number
				for (Iterator reduceSymbols = getReduceSymbols(followSets, item); reduceSymbols.hasNext(); )	{
					String terminal = (String) reduceSymbols.next();
					
					if (item.ruleIndex == 0)	// is startnode
						setParseTableLine(state, h, item, ParserTables.ACCEPT, terminal);
					else	// ruleIndex > 0 means REDUCE
						setParseTableLine(state, h, item, new Integer(item.ruleIndex), terminal);
				}
			}
		}
		return h;
	}