C#实现LL(1)文法判断及FIRST、FOLLOW集计算与可视化
// 判断文法是否为LL(1)文法
private void button4_Click(object sender, EventArgs e)
{
string text = richTextBox1.Text;
production = new Dictionary<string, List<string>>();
string[] pro = text.Split('
');
foreach (string s in pro)
{
if (s == '') continue;
Regex.Replace(s, ' ', '');
string[] ga = Regex.Split(s, '->');
if (ga.Length != 2) return;
if (ga[0].Length == 0 || ga[1].Length == 0)
return;
if (ga[0].Length != 1 || !char.IsUpper(ga[0][0])) return;
string[] ga2 = Regex.Split(ga[1], '\|');
if (!production.ContainsKey(ga[0]))
production.Add(ga[0], new List<string>());
foreach (string s1 in ga2)
production[ga[0]].Add(s1);
}
firsts = new Dictionary<string, List<string>>();
foreach (var item in production.Keys)
GetFirst(item, production, firsts);
follows = new Dictionary<string, List<string>>();
foreach (var item in production.Keys)
GetFollow(item, production, firsts, follows);
if (JudgeLL1(production, firsts, follows))
{
MessageBox.Show('该文法是LL(1)文法\n');
}
else
{
MessageBox.Show('该文法不是LL(1)文法,存在左递归或者存在FIRST集合有交集的情况!\n');
}
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
}
// 显示FIRST集
private void button1_Click(object sender, EventArgs e)
{
listView1.Columns.Clear();
listView1.Items.Clear();
// 添加终结符
listView1.Columns.Add('+', 50);
listView1.Columns.Add('¥', 50);
listView1.Columns.Add('*', 50);
listView1.Columns.Add('(', 50);
listView1.Columns.Add(')', 50);
listView1.Columns.Add('i', 50);
listView1.Columns.Add('#', 50);
// 添加非终结符
foreach (var item in production.Keys)
{
listView1.Items.Add(item);
}
// 填充表格
foreach (var item in production.Keys)
{
ListViewItem listItem = listView1.FindItemWithText(item);
List<string> firstList = firsts[item];
foreach (string terminal in new[] { '+', '¥', '*', '(', ')', 'i', '#' })
{
listItem.SubItems.Add(firstList.Contains(terminal) ? '1' : '0');
}
}
}
// 显示FOLLOW集
private void button2_Click(object sender, EventArgs e)
{
listView2.Columns.Clear();
listView2.Items.Clear();
// 添加终结符
listView2.Columns.Add('+', 50);
listView2.Columns.Add('¥', 50);
listView2.Columns.Add('*', 50);
listView2.Columns.Add('(', 50);
listView2.Columns.Add(')', 50);
listView2.Columns.Add('i', 50);
listView2.Columns.Add('#', 50);
// 添加非终结符
foreach (var item in production.Keys)
{
listView2.Items.Add(item);
}
// 填充表格
foreach (var item in production.Keys)
{
ListViewItem listItem = listView2.FindItemWithText(item);
List<string> followList = follows[item];
foreach (string terminal in new[] { '+', '¥', '*', '(', ')', 'i', '#' })
{
listItem.SubItems.Add(followList.Contains(terminal) ? '1' : '0');
}
}
}
原文地址: https://www.cveoy.top/t/topic/fXDn 著作权归作者所有。请勿转载和采集!