根据下列代码请补充实现函数 BuilditemFamily;实现LR0文法构造项目集族的功能需要先对输入的文法进行分离以为界分出不同的产生式。输入文法如:S-aSbSc ;listView1中输出如:状态项目族信息 1 S-Sprivate Liststring productions = new Liststring; 存储文法产生式 private Liststring sym
private void BuilditemFamily() { // 清空存储状态和项目族的列表 states.Clear(); itemsets.Clear();
// 分离文法产生式
string[] prods = richTextBox1.Text.Split('|');
foreach (string prod in prods)
{
// 将产生式添加到产生式列表中
productions.Add(prod);
// 获取产生式左部符号
string leftSymbol = prod.Split('-')[0].Trim();
// 如果该符号未在符号列表中出现过,则添加到符号列表中
if (!symbols.Contains(leftSymbol))
{
symbols.Add(leftSymbol);
}
}
// 初始化状态和项目族
string startSymbol = productions[0].Split('-')[0].Trim();
string startItem = startSymbol + "->." + productions[0].Split('-')[1].Trim();
List<string> startClosure = Closure(new List<string> { startItem });
// 将初始状态和项目族添加到列表中
states.Add("I0");
itemsets.Add(string.Join(",", startClosure));
// 构造项目集族
int i = 0;
while (i < states.Count)
{
// 获取当前状态的项目族
List<string> items = itemsets[i].Split(',').ToList();
// 遍历项目族中的每个项目
foreach (string item in items)
{
// 获取该项目的“.”后面的符号
string nextSymbol = GetNextSymbol(item);
// 如果该符号存在且未处理过,则进行处理
if (nextSymbol != null && !symbols.Contains(nextSymbol))
{
symbols.Add(nextSymbol);
}
if (nextSymbol != null && !IsProcessed(nextSymbol))
{
// 将该符号标记为已处理
symbols.Add(nextSymbol);
// 获取该符号的所有项目
List<string> nextItems = Goto(items, nextSymbol);
// 将该项目集添加到状态和项目族列表中
string nextClosure = string.Join(",", Closure(nextItems));
states.Add("I" + states.Count);
itemsets.Add(nextClosure);
}
}
i++;
}
}
// 获取项目中“.”后面的符号 private string GetNextSymbol(string item) { string[] parts = item.Split('.'); if (parts.Length == 2 && parts[1] != "") { return parts[1][0].ToString(); } else { return null; } }
// 判断符号是否已处理过 private bool IsProcessed(string symbol) { foreach (string state in states) { if (state.Contains(symbol)) { return true; } } return false; }
// 获取指定项目集的闭包
private List
// 遍历项目集中的每个项目
int i = 0;
while (i < closure.Count)
{
// 获取该项目的“.”后面的符号
string nextSymbol = GetNextSymbol(closure[i]);
// 如果该符号存在且为非终结符,则添加该符号对应的所有产生式
if (nextSymbol != null && symbols.Contains(nextSymbol))
{
foreach (string prod in productions)
{
string leftSymbol = prod.Split('-')[0].Trim();
if (leftSymbol == nextSymbol)
{
string newItem = leftSymbol + "->." + prod.Split('-')[1].Trim();
if (!closure.Contains(newItem))
{
closure.Add(newItem);
}
}
}
}
i++;
}
return closure;
}
// 获取指定项目集在指定符号下的转移项目集
private List
// 遍历项目集中的每个项目
foreach (string item in items)
{
// 获取该项目的“.”后面的符号
string nextSymbol = GetNextSymbol(item);
// 如果该符号等于指定符号,则将“.”向后移动一位
if (nextSymbol == symbol)
{
string newItem = item.Replace(".", "") + ".";
if (!gotoItems.Contains(newItem))
{
gotoItems.Add(newItem);
}
}
}
return gotoItems;
原文地址: https://www.cveoy.top/t/topic/heTo 著作权归作者所有。请勿转载和采集!