private void button6_Click(object sender, EventArgs e)
{
    // 获取所有终结符和非终结符
    terminals = new List<string>();
    nonterminals = new List<string>();
    foreach (var item in production)
    {
        if (!nonterminals.Contains(item.Key))
            nonterminals.Add(item.Key);
        foreach (var prod in item.Value)
        {
            foreach (var s in prod)
            {
                if (IsTerminal(s) && !terminals.Contains(s.ToString()))
                    terminals.Add(s.ToString());
                else if (!IsTerminal(s) && !nonterminals.Contains(s.ToString()))
                    nonterminals.Add(s.ToString());
            }
        }
    }
    terminals.Add("#");

    // 初始化预测分析表
    table = new Dictionary<string, Dictionary<string, string>>();
    foreach (var nonterm in nonterminals)
    {
        table.Add(nonterm, new Dictionary<string, string>());
        foreach (var term in terminals)
        {
            table[nonterm].Add(term, "");
        }
    }

    // 填充预测分析表
    GetSelect(production, firsts, follows);

    // 输出预测分析表到 listView3 中
    listView3.Columns.Clear();
    listView3.Items.Clear();
    listView3.View = View.Details;

    // 添加第一列
    listView3.Columns.Add("", 40);

    // 添加终结符列
    foreach (var item in terminals)
    {
        listView3.Columns.Add(item, 40);
    }

    // 填充表格
    foreach (var nonterm in nonterminals)
    {
        ListViewItem item = new ListViewItem(nonterm);
        foreach (var term in terminals)
        {
            if (!string.IsNullOrEmpty(table[nonterm][term]))
            {
                item.SubItems.Add("-> " + table[nonterm][term]);
            }
            else
            {
                item.SubItems.Add("");
            }
        }
        listView3.Items.Add(item);
    }
}

该代码对预测分析表的填充进行了优化。具体来说,在填充表格时,使用 "-> " + table[nonterm][term] 的方式,为非空元素添加了 "->" 前缀,这样可以避免占用 (E)+* 等符号的空间内容,提高了表格的可读性。


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

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