private void BuilditemFamily() { // 清空之前的数据 productions.Clear(); symbols.Clear(); states.Clear(); itemsets.Clear();

// 获取文法产生式和符号
string[] lines = richTextBox1.Lines;
foreach (string line in lines)
{
    if (line.Trim() != "")
    {
        string[] parts = line.Split(new char[] { '-', '>' }, StringSplitOptions.RemoveEmptyEntries);
        string left = parts[0].Trim();
        string right = parts[1].Trim();
        if (!symbols.Contains(left))
        {
            symbols.Add(left);
        }
        string[] symbolsInRight = right.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
        foreach (string symbol in symbolsInRight)
        {
            productions.Add(left + "->" + symbol);
            foreach (char c in symbol)
            {
                if (!symbols.Contains(c.ToString()))
                {
                    symbols.Add(c.ToString());
                }
            }
        }
    }
}

// 构造初始状态
string initialState = "S`->.S";
foreach (var prod in productions)
    initialState = initialState + " " + prod.ToString().Replace(">", ">.");
states.Add("0");
itemsets.Add(initialState);

// 构造其他状态
int i = 0;
while (i < states.Count)
{
    string[] items = itemsets[i].Split(' ');
    Dictionary<string, List<string>> gotos = new Dictionary<string, List<string>>();
    foreach (string item in items)
    {
        int dotIndex = item.IndexOf('.');
        if (dotIndex < item.Length - 1)
        {
            string symbolAfterDot = item[dotIndex + 1].ToString();
            if (!gotos.ContainsKey(symbolAfterDot))
            {
                gotos[symbolAfterDot] = new List<string>();
            }
            string newItem = item.Substring(0, dotIndex) + symbolAfterDot + "." + item.Substring(dotIndex + 2);
            gotos[symbolAfterDot].Add(newItem);
        }
    }

    foreach (string symbol in symbols)
    {
        if (gotos.ContainsKey(symbol))
        {
            string newItemSet = string.Join(" ", gotos[symbol]);
            if (!itemsets.Contains(newItemSet))
            {
                states.Add(states.Count.ToString());
                itemsets.Add(newItemSet);
            }
        }
    }

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

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

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