实现构造LR0项目集的函数如BuildLR0ItemSets函数。 private void BuildLR0ItemSets 获取所有终结符和非终结符 foreach Production p in productions if !symbolsContainsnew
补充代码:
判别LR0文法:
private void button2_Click(object sender, EventArgs e) { BuildLR0ItemSets(); // 构造LR0项目集
if (IsLR0Grammar())
{
MessageBox.Show("这是一个LR0文法。");
button4.Enabled = true;
button5.Enabled = true;
button6.Enabled = true;
}
else
{
MessageBox.Show("这不是一个LR0文法。");
}
}
生成项目族信息:
private void button4_Click(object sender, EventArgs e) { listView1.Columns.Clear(); listView1.Items.Clear(); listView1.View = View.Details;
// 添加列名
listView1.Columns.Add("状态", 150);
listView1.Columns.Add("项目集信息", 300);
// 添加数据
for (int i = 0; i < itemSets.Count; i++)
{
ListViewItem item = new ListViewItem(i.ToString());
item.SubItems.Add(itemSets[i].ToString());
listView1.Items.Add(item);
}
listView1.GridLines = true;
}
构造LR分析表:
private void button5_Click(object sender, EventArgs e) { BuildGotoTable(); // 构造GOTO表 BuildActionTable(); // 构造ACTION表
listView2.Columns.Clear();
listView2.Items.Clear();
listView2.View = View.Details;
// 添加列名
foreach (Symbol s in symbols)
{
listView2.Columns.Add(s.ToString(), 80);
}
// 添加数据
for (int i = 0; i < itemSets.Count; i++)
{
ListViewItem item = new ListViewItem(i.ToString());
foreach (Symbol s in symbols)
{
if (s.IsTerminal)
{
if (actionTable.ContainsKey(new Tuple<int, Symbol>(i, s)))
{
item.SubItems.Add(actionTable[new Tuple<int, Symbol>(i, s)]);
}
else
{
item.SubItems.Add("");
}
}
else
{
if (gotoTable.ContainsKey(new Tuple<int, Symbol>(i, s)))
{
item.SubItems.Add(gotoTable[new Tuple<int, Symbol>(i, s)].ToString());
}
else
{
item.SubItems.Add("");
}
}
}
listView2.Items.Add(item);
}
listView2.GridLines = true;
原文地址: https://www.cveoy.top/t/topic/hffq 著作权归作者所有。请勿转载和采集!