C#实现LL(1)文法分析:Select集计算与预测分析表构建
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace byyljxfzxt
{
public partial class Form4 : Form
{
// ... 其他代码 ...
public Dictionary<string, Dictionary<string, List<string>>> GetSelect(Dictionary<string, List<string>> production, Dictionary<string, List<string>> firsts, Dictionary<string, List<string>> follows)
{
Dictionary<string, Dictionary<string, List<string>>> selects = new Dictionary<string, Dictionary<string, List<string>>>();
foreach (var nonterminal in production.Keys)
{
selects.Add(nonterminal, new Dictionary<string, List<string>>());
foreach (var prod in production[nonterminal])
{
selects[nonterminal].Add(prod, new List<string>());
bool flag = true;
foreach (var symbol in prod)
{
if (IsTerminal(symbol))
{
selects[nonterminal][prod].Add(symbol.ToString());
flag = false;
break;
}
else
{
foreach (var f in firsts[symbol.ToString()])
{
if (f.Equals('#'))
{
continue;
}
if (!selects[nonterminal][prod].Contains(f))
{
selects[nonterminal][prod].Add(f);
}
}
if (!firsts[symbol.ToString()].Contains('#'))
{
flag = false;
break;
}
}
}
if (flag)
{
foreach (var f in follows[nonterminal])
{
if (!selects[nonterminal][prod].Contains(f))
{
selects[nonterminal][prod].Add(f);
}
}
}
}
}
return selects;
}
private void button6_Click(object sender, EventArgs e)
{
// 构造预测分析表
Dictionary<string, Dictionary<string, string>> table = new Dictionary<string, Dictionary<string, string>>();
foreach (var nonterminal in nonterminals)
{
table.Add(nonterminal, new Dictionary<string, string>());
foreach (var terminal in terminals)
{
table[nonterminal].Add(terminal, "");
}
}
selects = GetSelect(production, firsts, follows);
foreach (var item in production)
{
string A = item.Key;
foreach (var prod in item.Value)
{
foreach (var t in selects[A][prod])
{
if (table[A][t] != "")
{
MessageBox.Show("该文法不是LL(1)文法,存在冲突!\n");
return;
}
table[A][t] = prod;
}
}
}
// 输出预测分析表
listView3.Clear();
foreach (var terminal in terminals)
{
listView3.Columns.Add(terminal, 100, HorizontalAlignment.Center);
}
foreach (var nonterminal in nonterminals)
{
ListViewItem lvi = new ListViewItem(nonterminal);
foreach (var terminal in terminals)
{
lvi.SubItems.Add(table[nonterminal][terminal]);
}
listView3.Items.Add(lvi);
}
}
// ... 其他代码 ...
}
}
代码说明:
-
GetSelect 函数:
- 接收产生式、First集和Follow集作为参数。
- 遍历每个非终结符和其对应的产生式,计算Select集。
- 对于每个产生式,根据首字符是终结符还是非终结符,以及是否能推导出空串,来确定Select集的内容。
- 最后返回计算得到的Select集。
-
button6_Click 函数:
- 首先根据终结符和非终结符创建预测分析表。
- 调用GetSelect函数计算Select集。
- 遍历产生式和Select集,填充预测分析表。
- 最后将预测分析表输出到listView3控件中。
注意:
- 代码中使用了双引号,为了保持代码格式,json输出中保留了双引号。
- 这段代码只是一个示例,需要根据实际情况进行修改和完善。
- 在实际应用中,还需要考虑错误处理等问题。
原文地址: https://www.cveoy.top/t/topic/fXFW 著作权归作者所有。请勿转载和采集!