代码1是一个WinForms窗体中的事件处理方法,当点击按钮5时会触发该方法,方法中的代码实现了LR语法分析表的展示功能。

private void button5_Click(object sender, EventArgs e)
{
    listView2.Clear();

    LR.Table[][] table;
    table = lr.GET_ANA();
    int xlen = table.GetLength(0);
    int ylen = table[1].Length;

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

    listView2.Columns.Add(" ");

    for (int i = 0; i < lr.Echar.Count; i++)//添加表头
    {
        string text = lr.Echar[i].ToString();
        listView2.Columns.Add(text, 58);
    }
    for (int i = 0; i < lr.Nchar.Count; i++)//添加表头
    {
        string text = lr.Nchar[i].ToString();
        listView2.Columns.Add(text, 58);
    }

    for (int i = 0; i < xlen; i++)
    {
        ListViewItem li = new ListViewItem(i.ToString());

        for (int j = 0; j < ylen; j++)
        {
            string st = "";
            if (table[i][j].error)
                st = "-";
            else if (table[i][j].type == 'A')
                st = "AC";
            else
                st = table[i][j].type.ToString() + table[i][j].id.ToString();
            li.SubItems.Add(st);
        }
        listView2.Items.Add(li);
    }

    listView2.GridLines = true;
}

代码2是一个公共方法,返回LR语法分析表的二维数组,其中LRAna[i][j]代表语法分析表中第i行第j列的内容。

public Table[][] GET_ANA()
{
    LRAnaly();
    RStr_ANA += "\r\nLR0分析表:\r\n    ";
    int i;
    for (i = 0; i < Echar.Count; i++)
    {
        RStr_ANA += Echar[i].ToString() + "     ";
    }
    for (i = 0; i < Nchar.Count; i++)
    {
        RStr_ANA += Nchar[i].ToString() + "     ";
    }
    RStr_ANA += "\r\n";
    for (i = 0; i < proitemset.Count; i++)
    {
        RStr_ANA += i.ToString() + "  ";
        for (int j = 0; j < Echar.Count + Nchar.Count; j++)
        {
            if (LRAna[i][j].error)
            {
                RStr_ANA += "  " + "    ";
            }
            else if (i == 1 && j == Echar.Count - 1)
            {
                RStr_ANA += "AC" + "    ";
            }
            else if (LRAna[i][j].type != 'N')
            {
                RStr_ANA += LRAna[i][j].type.ToString() + LRAna[i][j].id.ToString() + "    ";
            }
            else
                RStr_ANA += LRAna[i][j].id.ToString() + "    ";
        }
        RStr_ANA += "\r\n";
    }

    return LRAna;
}

具体原理步骤如下:

  1. LR语法分析表的生成需要先进行LR语法分析,得到LR分析表中的项目集、状态转移和动作表等信息。
  2. 代码2中的LRAnaly()方法实现了LR语法分析,并生成了LR分析表中的项目集、状态转移和动作表等信息。
  3. GET_ANA()方法调用LRAnaly()方法,然后将LR分析表中的信息转化为一个二维数组LRAna。
  4. 代码1中的button5_Click方法通过调用GET_ANA()方法,获取LRAna数组,并将其展示在一个ListView控件中。
  5. 在展示过程中,先清空ListView控件中的内容,然后根据LR分析表中的终结符和非终结符信息,动态添加表头。
  6. 然后遍历LRAna数组,将数组中的内容逐个添加到ListView控件的Item和SubItem中,最终完成LR语法分析表的展示。

上述代码示例展示了如何使用C# WinForms代码生成和展示LR语法分析表。通过这些代码,你可以更好地理解LR分析器的实现原理,并能够将LR分析器应用到你的项目中。


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

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