private void button1_Click(object sender, EventArgs e)
{
    // 获取所有的符号集合
    List<string> symbols = new List<string>();
    foreach (var item in production.Keys)
    {
        if (!symbols.Contains(item))
            symbols.Add(item);
        foreach (var prod in production[item])
        {
            foreach (var c in prod)
            {
                if (!symbols.Contains(c.ToString()))
                    symbols.Add(c.ToString());
            }
        }
    }
    // 将符号集合按照终结符和非终结符分开
    nonterminals = new List<string>();
    terminals = new List<string>();
    foreach (var s in symbols)
    {
        if (char.IsUpper(s[0]))
            nonterminals.Add(s);
        else
            terminals.Add(s);
    }
    if (terminals.IndexOf("#") == -1)
    {
        terminals.Add("#");
    }

    listView1.Columns.Clear();
    listView1.Items.Clear();
    listView1.View = View.Details;

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

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

    // 添加非终结符行
    foreach (var item in nonterminals)
    {
        ListViewItem lvi = new ListViewItem(item);
        lvi.SubItems.Add("");
        foreach (var t in terminals)
        {
            lvi.SubItems.Add("");
        }
        listView1.Items.Add(lvi);
    }

    // 填充表格
    foreach (var item in firsts)
    {
        int row = nonterminals.IndexOf(item.Key);
        foreach (var t in terminals)
        {
            int col = terminals.IndexOf(t);
            if (!item.Value.Contains(t))
                listView1.Items[row].SubItems[col + 1].Text = "0";
            else
                listView1.Items[row].SubItems[col + 1].Text = "1";
        }
    }
}

该代码实现了根据文法规则生成FIRST集表格的功能。具体步骤如下:

  1. 获取所有符号:从文法规则中提取所有符号(包括终结符和非终结符),并存储在symbols集合中。
  2. 分类符号:根据符号的第一个字符是否为大写字母,将符号分类为终结符和非终结符,分别存储在terminalsnonterminals集合中。
  3. 添加特殊符号:如果终结符集合中不包含“#”,则将其添加进去。
  4. 初始化表格:清空listView1的列和行,并将其视图模式设置为View.Details
  5. 添加列:添加第一列(用于显示非终结符),以及对应每个终结符的列。
  6. 添加行:添加对应每个非终结符的行。
  7. 填充表格:根据firsts集合中存储的每个非终结符的FIRST集信息,填充表格,如果该非终结符的FIRST集中包含当前终结符,则对应单元格设置为“1”,否则设置为“0”。

该代码利用了ListView控件来展示生成的FIRST集表格。通过遍历符号集合,并根据符号类型进行分类,代码实现了将文法规则中的符号信息转换为表格形式,方便用户查看每个非终结符的FIRST集信息。

C#代码解析:生成FIRST集表格

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

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