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)
        {
            item.SubItems.Add("->" + table[nonterm][term]); // 加上 "->"
        }
        listView3.Items.Add(item);
    }

}

该代码示例主要修改了 listView3 中表格填充部分,在添加子项时,在 table[nonterm][term] 的前面加上 "->",使每个表元素内容都以 "->" 开头。

此修改方便阅读和理解预测分析表的内容,更好地体现了语法分析规则的结构。

C# 预测分析表生成:添加 '->' 前缀

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

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