private void BuilditemFamily()
{
bool changed = true;
while (changed)
{
changed = false;
for (int i = 0; i < itemsets.Count; i++)
{
List items = itemsets[i].Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries).ToList();
foreach (string symbol in symbols)
{
List newItems = new List();
foreach (string item in items)
{
string[] parts = item.Split(' ');
int dotIndex = Array.IndexOf(parts, ".");
if (dotIndex != -1 && dotIndex < parts.Length - 1 && parts[dotIndex + 1] == symbol)
{
string newItem = item.Replace(". " + symbol, symbol + " .");
if (!newItems.Contains(newItem))
{
newItems.Add(newItem);
}
}
}
if (newItems.Count > 0)
{
string newState = GetState(newItems);
if (!states.Contains(newState))
{
states.Add(newState);
itemsets.Add(newState);
changed = true;
}
int index = states.IndexOf(newState);
if (!gotoTable.ContainsKey(i + "," + symbol))
{
gotoTable.Add(i + "," + symbol, new List());
}
if (!gotoTable[i + "," + symbol].Contains(index.ToString()))
{
gotoTable[i + "," + symbol].Add(index.ToString());
}
}
}
}
}