C# 预测分析表填充优化:在不为空元素前添加 "->" 符号
private void button6_Click(object sender, EventArgs e)
{
// 获取所有终结符和非终结符
terminals = new List<string>();
nonterminals = new List<string>();
foreach (var item in production)
{
if (!nonterminals.Contains(item.Key))
nonterminals.Add(item.Key);
foreach (var prod in item.Value)
{
foreach (var s in prod)
{
if (IsTerminal(s) && !terminals.Contains(s.ToString()))
terminals.Add(s.ToString());
else if (!IsTerminal(s) && !nonterminals.Contains(s.ToString()))
nonterminals.Add(s.ToString());
}
}
}
terminals.Add("#");
// 初始化预测分析表
table = new Dictionary<string, Dictionary<string, string>>();
foreach (var nonterm in nonterminals)
{
table.Add(nonterm, new Dictionary<string, string>());
foreach (var term in terminals)
{
table[nonterm].Add(term, "");
}
}
// 填充预测分析表
GetSelect(production, firsts, follows);
// 输出预测分析表到 listView3 中
listView3.Columns.Clear();
listView3.Items.Clear();
listView3.View = View.Details;
// 添加第一列
listView3.Columns.Add("", 40);
// 添加终结符列
foreach (var item in terminals)
{
listView3.Columns.Add(item, 40);
}
// 填充表格
foreach (var nonterm in nonterminals)
{
ListViewItem item = new ListViewItem(nonterm);
foreach (var term in terminals)
{
if (!string.IsNullOrEmpty(table[nonterm][term]))
{
item.SubItems.Add("->" + table[nonterm][term]);
}
else
{
item.SubItems.Add("");
}
}
listView3.Items.Add(item);
}
}
这段代码展示了如何修改C#函数,在预测分析表的填充过程中,为不为空的元素前添加"->"符号。
优化后的代码逻辑如下:
- 获取所有终结符和非终结符: 遍历生产式,将所有非终结符和终结符添加到各自的列表中。
- 初始化预测分析表: 创建一个二维字典,用于存储预测分析表的内容,并将所有元素初始化为空字符串。
- 填充预测分析表: 使用
GetSelect函数填充预测分析表的内容,此函数需要根据文法规则来确定每个非终结符对应终结符的推导结果。 - 输出预测分析表: 遍历预测分析表,将每个元素添加到
listView3中,并对不为空的元素添加 "->" 前缀。
优化要点:
- 添加 "->" 前缀使得预测分析表内容更加清晰易懂,更容易识别出不为空的元素。
- 优化后的代码逻辑简单易懂,方便维护和扩展。
总结:
通过在预测分析表的填充过程中添加 "->" 前缀,可以使代码更清晰,更容易理解预测分析表的内容。 这种优化方式适用于所有需要展示预测分析表的场景。
原文地址: http://www.cveoy.top/t/topic/oyaS 著作权归作者所有。请勿转载和采集!