首先需要定义一个函数来计算某个非终结符的first集,以及一个函数来计算某个非终结符的follow集。这里假设已经有了这两个函数。

然后在button1_Click事件中,先清空listView1中的所有项,然后添加第一行和第一列的表头:

listView1.Items.Clear(); listView1.Columns.Clear(); listView1.Columns.Add("", 50); foreach (char c in terminals) { listView1.Columns.Add(c.ToString(), 50); } foreach (char c in nonterminals) { ListViewItem item = new ListViewItem(c.ToString()); item.SubItems.Add(""); for (int i = 0; i < terminals.Length; i++) { item.SubItems.Add(""); } listView1.Items.Add(item); }

其中terminals和nonterminals分别是终结符和非终结符的集合。

然后对于每个非终结符,计算它的first集,并将对应的位置填上1:

foreach (char A in nonterminals) { HashSet first = calculateFirst(A); ListViewItem item = listView1.FindItemWithText(A.ToString()); foreach (char a in first) { int index = terminals.IndexOf(a); item.SubItems[index + 1].Text = "1"; } }

最后在button2_Click事件中,同样先清空listView2中的所有项,然后添加第一行和第一列的表头:

listView2.Items.Clear(); listView2.Columns.Clear(); listView2.Columns.Add("", 50); foreach (char c in terminals) { listView2.Columns.Add(c.ToString(), 50); } foreach (char c in nonterminals) { ListViewItem item = new ListViewItem(c.ToString()); item.SubItems.Add(""); for (int i = 0; i < terminals.Length; i++) { item.SubItems.Add(""); } listView2.Items.Add(item); }

然后对于每个非终结符,计算它的follow集,并将对应的位置填上横线:

foreach (char A in nonterminals) { HashSet follow = calculateFollow(A); ListViewItem item = listView2.FindItemWithText(A.ToString()); foreach (char a in follow) { int index = terminals.IndexOf(a); item.SubItems[index + 1].Text = "-"; }

实现下列函数使得分别在listView1、listView2中显示first集和follow集带横线的表格其中第一行为终结符第一列为非终结符若对应first集含有相应非终结符则对应位置填1反之填0;格式如下: +¥i#E0001010T0001010B1100000F0001010P0110000private void button1_Clickobject sender EventArgs e

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

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