这段代码是一个 C# 程序中的一个按钮点击事件处理函数。点击按钮后,它会读取一个名为 'richTextBox1' 的文本框中的文本,将其解析为一个文法,并判断该文法是否是 LL(1) 文法。

代码首先定义了一个名为 'production' 的字典,用于存储文法的产生式。然后,它将读取的文本按行分割,并对每一行进行解析。解析过程中,它会判断产生式的左部和右部是否符合规范,如果不符合就会返回。如果符合规范,就将产生式添加到 'production' 字典中。

接着,代码定义了两个名为 'firsts' 和 'follows' 的字典,用于存储文法的 FIRST 集合和 FOLLOW 集合。然后,它分别对每一个非终结符调用 'GetFirst' 和 'GetFollow' 函数来求出它们的 FIRST 集合和 FOLLOW 集合,并将结果添加到对应的字典中。

最后,代码调用 'JudgeLL1' 函数来判断该文法是否是 LL(1) 文法。如果是,就弹出一个提示框显示'该文法是 LL(1) 文法',否则就显示'该文法不是 LL(1) 文法,存在左递归或者存在 FIRST 集合有交集的情况!'。最后,代码将一些按钮的 'Enabled' 属性设置为 true,使这些按钮变为可用状态。

总的来说,这段代码是一个 LL(1) 文法分析器的一部分,它实现了从文本中读取文法、求解 FIRST 集合和 FOLLOW 集合、判断文法是否是 LL(1) 文法的功能。

private void button4_Click(object sender, EventArgs e)
{
    string text = richTextBox1.Text;
    production = new Dictionary<string, List<string>>();
    string[] pro = text.Split('\n');
    foreach (string s in pro)
    {
        if (s == "") continue;

        Regex.Replace(s, " ", "");
        string[] ga = Regex.Split(s, "->");
        if (ga.Length != 2) return;
        if (ga[0].Length == 0 || ga[1].Length == 0)
            return;
        if (ga[0].Length != 1 || !char.IsUpper(ga[0][0])) return;

        string[] ga2 = Regex.Split(ga[1], "\|");
        if (!production.ContainsKey(ga[0]))
            production.Add(ga[0], new List<string>());
        foreach (string s1 in ga2)
            production[ga[0]].Add(s1);
    }

    firsts = new Dictionary<string, List<string>>();
    foreach (var item in production.Keys)
        GetFirst(item, production, firsts);

    follows = new Dictionary<string, List<string>>();
    foreach (var item in production.Keys)
        GetFollow(item, production, firsts, follows);


    if (JudgeLL1(production, firsts, follows))
    {
        MessageBox.Show("该文法是 LL(1) 文法\n");

    }
    else
    {
        MessageBox.Show("该文法不是 LL(1) 文法,存在左递归或者存在 FIRST 集合有交集的情况!\n");
    }
    button1.Enabled = true;
    button2.Enabled = true;
    button6.Enabled = true;
    button7.Enabled = true;

}
C# LL(1) 文法分析器:判断文法是否为 LL(1) 文法

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

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