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 Closure(List itemset) { List result = new List(itemset); bool changed = true; while (changed) { changed = false; for (int i = 0; i < result.Count; i++) { string item = result[i]; string[] parts = item.Split(new char[] { '-', '>' }, StringSplitOptions.RemoveEmptyEntries); int dotIndex = parts[1].IndexOf('.'); if (dotIndex < parts[1].Length - 1) { string symbol = parts[1][dotIndex + 1].ToString(); List productions = GetProductions(symbol); foreach (string production in productions) { string newItem = symbol + "->." + production; if (!result.Contains(newItem)) { result.Add(newItem); changed = true; } } } } } return result; }

// 计算项目集Goto private List Goto(List itemset, string symbol) { List result = new List(); foreach (string item in itemset) { string[] parts = item.Split(new char[] { '-', '>' }, StringSplitOptions.RemoveEmptyEntries); int dotIndex = parts[1].IndexOf('.'); if (dotIndex < parts[1].Length - 1 && parts[1][dotIndex + 1].ToString() == symbol) { string newItem = parts[0] + "->" + parts[1].Substring(0, dotIndex) + symbol + "." + parts[1].Substring(dotIndex + 2); result.Add(newItem); } } return Closure(result); }

// 获取所有以symbol为左部的产生式 private List GetProductions(string symbol) { List result = new List(); foreach (string production in productions) { if (production.StartsWith(symbol)) { result.Add(production.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)[1]); } } return result;

根据下列代码请补充实现函数 BuilditemFamily;实现LR0文法构造项目集族的功能需要先对输入的文法进行处理。输入文法如:S-aSbSc ;listView1中输出如:状态项目族信息 1 S-Sprivate Liststring productions = new Liststring; 存储文法产生式 private Liststring symbols = new

原文地址: https://www.cveoy.top/t/topic/heTs 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录