using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace byyljxfzxt
{
    public partial class Form4 : Form
    {
        // ... 其他代码 ...

        public Dictionary<string, Dictionary<string, List<string>>> GetSelect(Dictionary<string, List<string>> production, Dictionary<string, List<string>> firsts, Dictionary<string, List<string>> follows)
        {
            Dictionary<string, Dictionary<string, List<string>>> selects = new Dictionary<string, Dictionary<string, List<string>>>();
            foreach (var nonterminal in production.Keys)
            {
                selects.Add(nonterminal, new Dictionary<string, List<string>>());
                foreach (var prod in production[nonterminal])
                {
                    selects[nonterminal].Add(prod, new List<string>());
                    bool flag = true;
                    foreach (var symbol in prod)
                    {
                        if (IsTerminal(symbol))
                        {
                            selects[nonterminal][prod].Add(symbol.ToString());
                            flag = false;
                            break;
                        }
                        else
                        {
                            foreach (var f in firsts[symbol.ToString()])
                            {
                                if (f.Equals('#'))
                                {
                                    continue;
                                }
                                if (!selects[nonterminal][prod].Contains(f))
                                {
                                    selects[nonterminal][prod].Add(f);
                                }
                            }
                            if (!firsts[symbol.ToString()].Contains('#'))
                            {
                                flag = false;
                                break;
                            }
                        }
                    }
                    if (flag)
                    {
                        foreach (var f in follows[nonterminal])
                        {
                            if (!selects[nonterminal][prod].Contains(f))
                            {
                                selects[nonterminal][prod].Add(f);
                            }
                        }
                    }
                }
            }
            return selects;
        }

        private void button6_Click(object sender, EventArgs e)
        {
            // 构造预测分析表
            Dictionary<string, Dictionary<string, string>> table = new Dictionary<string, Dictionary<string, string>>();
            foreach (var nonterminal in nonterminals)
            {
                table.Add(nonterminal, new Dictionary<string, string>());
                foreach (var terminal in terminals)
                {
                    table[nonterminal].Add(terminal, "");
                }
            }

            selects = GetSelect(production, firsts, follows);
            foreach (var item in production)
            {
                string A = item.Key;
                foreach (var prod in item.Value)
                {
                    foreach (var t in selects[A][prod])
                    {
                        if (table[A][t] != "")
                        {
                            MessageBox.Show("该文法不是LL(1)文法,存在冲突!\n");
                            return;
                        }
                        table[A][t] = prod;
                    }
                }
            }

            // 输出预测分析表
            listView3.Clear();
            foreach (var terminal in terminals)
            {
                listView3.Columns.Add(terminal, 100, HorizontalAlignment.Center);
            }
            foreach (var nonterminal in nonterminals)
            {
                ListViewItem lvi = new ListViewItem(nonterminal);
                foreach (var terminal in terminals)
                {
                    lvi.SubItems.Add(table[nonterminal][terminal]);
                }
                listView3.Items.Add(lvi);
            }
        }

       // ... 其他代码 ...

    }
}

代码说明:

  1. GetSelect 函数:

    • 接收产生式、First集和Follow集作为参数。
    • 遍历每个非终结符和其对应的产生式,计算Select集。
    • 对于每个产生式,根据首字符是终结符还是非终结符,以及是否能推导出空串,来确定Select集的内容。
    • 最后返回计算得到的Select集。
  2. button6_Click 函数:

    • 首先根据终结符和非终结符创建预测分析表。
    • 调用GetSelect函数计算Select集。
    • 遍历产生式和Select集,填充预测分析表。
    • 最后将预测分析表输出到listView3控件中。

注意:

  • 代码中使用了双引号,为了保持代码格式,json输出中保留了双引号。
  • 这段代码只是一个示例,需要根据实际情况进行修改和完善。
  • 在实际应用中,还需要考虑错误处理等问题。
C#实现LL(1)文法分析:Select集计算与预测分析表构建

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

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