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;
    button3.Enabled = true;
}

// 根据上述函数实现下列函数,使得分别在listView1、listView2中显示first集和follow集带横线的表格,
// 其中第一行为终结符,第一列为非终结符,若对应first集含有相应非终结符,则对应位置填1,反之填0;格式如下:
//  |+|¥|*|(|)|i|#
// E|0|0|0|1|0|1|0
// T|0|0|0|1|0|1|0
// B|1|1|0|0|0|0|0
// F|0|0|0|1|0|1|0
// P|0|1|1|0|0|0|0
private void button1_Click(object sender, EventArgs e)
{
    listView1.Clear();
    listView1.Columns.Add('', 30, HorizontalAlignment.Center);
    foreach (var item in production.Keys)
    {
        listView1.Columns.Add(item, 30, HorizontalAlignment.Center);
    }
    listView1.View = View.Details;
    listView1.GridLines = true;
    listView1.FullRowSelect = true;

    ListViewItem[] items = new ListViewItem[terminals.Length];
    for (int i = 0; i < terminals.Length; i++)
    {
        items[i] = new ListViewItem(terminals[i]);
        for (int j = 0; j < nonTerminals.Length; j++)
        {
            if (firsts[nonTerminals[j]].Contains(terminals[i]))
            {
                items[i].SubItems.Add('1');
            }
            else
            {
                items[i].SubItems.Add('0');
            }
        }
    }
    listView1.Items.AddRange(items);
}

private void button2_Click(object sender, EventArgs e)
{
    listView2.Clear();
    listView2.Columns.Add('', 30, HorizontalAlignment.Center);
    foreach (var item in production.Keys)
    {
        listView2.Columns.Add(item, 30, HorizontalAlignment.Center);
    }
    listView2.View = View.Details;
    listView2.GridLines = true;
    listView2.FullRowSelect = true;

    ListViewItem[] items = new ListViewItem[terminals.Length];
    for (int i = 0; i < terminals.Length; i++)
    {
        items[i] = new ListViewItem(terminals[i]);
        for (int j = 0; j < nonTerminals.Length; j++)
        {
            if (follows[nonTerminals[j]].Contains(terminals[i]))
            {
                items[i].SubItems.Add('1');
            }
            else
            {
                items[i].SubItems.Add('0');
            }
        }
    }
    listView2.Items.AddRange(items);
}
C#实现LL(1)文法分析器 - 计算First集和Follow集

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

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