C#代码解析:生成FIRST集表格
private void button1_Click(object sender, EventArgs e)
{
// 获取所有的符号集合
List<string> symbols = new List<string>();
foreach (var item in production.Keys)
{
if (!symbols.Contains(item))
symbols.Add(item);
foreach (var prod in production[item])
{
foreach (var c in prod)
{
if (!symbols.Contains(c.ToString()))
symbols.Add(c.ToString());
}
}
}
// 将符号集合按照终结符和非终结符分开
nonterminals = new List<string>();
terminals = new List<string>();
foreach (var s in symbols)
{
if (char.IsUpper(s[0]))
nonterminals.Add(s);
else
terminals.Add(s);
}
if (terminals.IndexOf("#") == -1)
{
terminals.Add("#");
}
listView1.Columns.Clear();
listView1.Items.Clear();
listView1.View = View.Details;
// 添加第一列
listView1.Columns.Add("", 40);
// 添加终结符列
foreach (var item in terminals)
{
listView1.Columns.Add(item, 40);
}
// 添加非终结符行
foreach (var item in nonterminals)
{
ListViewItem lvi = new ListViewItem(item);
lvi.SubItems.Add("");
foreach (var t in terminals)
{
lvi.SubItems.Add("");
}
listView1.Items.Add(lvi);
}
// 填充表格
foreach (var item in firsts)
{
int row = nonterminals.IndexOf(item.Key);
foreach (var t in terminals)
{
int col = terminals.IndexOf(t);
if (!item.Value.Contains(t))
listView1.Items[row].SubItems[col + 1].Text = "0";
else
listView1.Items[row].SubItems[col + 1].Text = "1";
}
}
}
该代码实现了根据文法规则生成FIRST集表格的功能。具体步骤如下:
- 获取所有符号:从文法规则中提取所有符号(包括终结符和非终结符),并存储在
symbols集合中。 - 分类符号:根据符号的第一个字符是否为大写字母,将符号分类为终结符和非终结符,分别存储在
terminals和nonterminals集合中。 - 添加特殊符号:如果终结符集合中不包含“#”,则将其添加进去。
- 初始化表格:清空
listView1的列和行,并将其视图模式设置为View.Details。 - 添加列:添加第一列(用于显示非终结符),以及对应每个终结符的列。
- 添加行:添加对应每个非终结符的行。
- 填充表格:根据
firsts集合中存储的每个非终结符的FIRST集信息,填充表格,如果该非终结符的FIRST集中包含当前终结符,则对应单元格设置为“1”,否则设置为“0”。
该代码利用了ListView控件来展示生成的FIRST集表格。通过遍历符号集合,并根据符号类型进行分类,代码实现了将文法规则中的符号信息转换为表格形式,方便用户查看每个非终结符的FIRST集信息。
原文地址: http://www.cveoy.top/t/topic/oFTc 著作权归作者所有。请勿转载和采集!