根据下列代码请补充实现函数 BuilditemFamily;实现LR0文法构造项目集族的功能需要先对输入的文法进行处理。输入文法如:S-aSbSc ;listView1中输出如:状态项目族信息 1 S-Sprivate Liststring productions = new Liststring; 存储文法产生式 private Liststring symbols = new
private void BuilditemFamily() { // 清空之前的数据 productions.Clear(); symbols.Clear(); states.Clear(); itemsets.Clear();
// 读取并处理文法产生式
string[] lines = richTextBox1.Lines;
foreach (string line in lines)
{
if (line.Trim() == "") continue;
string[] parts = line.Split(new char[] { '-', '>' }, StringSplitOptions.RemoveEmptyEntries);
string left = parts[0].Trim();
string right = parts[1].Trim();
productions.Add(left + "->" + right);
if (!symbols.Contains(left)) symbols.Add(left);
string[] tokens = right.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string token in tokens)
{
foreach (char c in token)
{
if (!symbols.Contains(c.ToString())) symbols.Add(c.ToString());
}
}
}
// 构造项目集族
List<List<string>> itemFamily = new List<List<string>>();
List<string> firstItem = new List<string>();
firstItem.Add(productions[0].Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0] + "`->." + productions[0].Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[0]);
itemFamily.Add(Closure(firstItem));
for (int i = 0; i < itemFamily.Count; i++)
{
List<string> itemset = itemFamily[i];
foreach (string symbol in symbols)
{
List<string> gotoItemset = Goto(itemset, symbol);
if (gotoItemset.Count > 0 && !itemFamily.Contains(gotoItemset))
{
itemFamily.Add(gotoItemset);
}
}
}
// 将项目集族转换成字符串形式
for (int i = 0; i < itemFamily.Count; i++)
{
List<string> itemset = itemFamily[i];
string itemsetStr = "";
foreach (string item in itemset)
{
itemsetStr += item + "/";
}
itemsets.Add(itemsetStr.TrimEnd('/'));
states.Add("I" + i.ToString());
}
}
// 计算项目集闭包
private List
// 计算项目集Goto
private List
// 获取所有以symbol为左部的产生式
private List
原文地址: https://www.cveoy.top/t/topic/heTs 著作权归作者所有。请勿转载和采集!