C#实现语法分析:构建LL(1)分析表的Follow集可视化
private void button2_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);
}
listView2.Columns.Clear();
listView2.Items.Clear();
listView2.View = View.Details;
// 添加第一列
listView2.Columns.Add('', 30);
// 添加终结符列
foreach (var item in terminals)
{
listView2.Columns.Add(item, 30);
}
// 添加非终结符行
foreach (var item in nonterminals)
{
ListViewItem lvi = new ListViewItem(item);
lvi.SubItems.Add('');
foreach (var t in terminals)
{
lvi.SubItems.Add('');
}
listView2.Items.Add(lvi);
}
// 填充表格
foreach (var item in follows)
{
int row = nonterminals.IndexOf(item.Key);
foreach (var t in terminals)
{
int col = terminals.IndexOf(t);
if (!item.Value.Contains(t))
listView2.Items[row].SubItems[col + 1].Text = '0';
else
listView2.Items[row].SubItems[col + 1].Text = '1';
}
}
}
原文地址: https://www.cveoy.top/t/topic/fXDL 著作权归作者所有。请勿转载和采集!