SLR 分析表构建及 ListView 显示问题解决
SLR 分析表构建及 ListView 显示问题解决
本文分析一段 C# 代码,该代码实现了 SLR 分析表的构建。然而,在使用 ListView 控件显示分析表时,发现 r 状态对应的元素显示不正确。本文将分析问题原因,并提供修改后的代码。
问题分析
代码中,SLRAna 是一个二维数组,用于存储分析表。SLRAnaly() 函数负责构建该分析表,其中包含以下步骤:
- 初始化
SLRAna,将所有元素赋值为 error 属性。2. 将接受状态赋值为 'A'。3. 将归约状态赋值为 'r'。4. 将移进状态赋值为 'S'。5. 根据 DFA 中的状态转移信息,将对应状态的SLRAna元素赋值为对应的移进或归约状态。
问题出现在处理归约状态时,代码使用 SLRobjNum[proitemset[Gy_itemset[i]].Container[0]] 获取对应的归约项目。然而,Container[0] 可能导致获取到错误的项目。这是因为 Container 中存储的是项目集中的所有项目,而并非所有项目都是归约项目。
此外,SLRAna 数组中,r 状态对应的元素应该是归约项目的序号,而不是对应的产生式序号。因此需要修改 Find_pro() 函数,使其返回归约项目的序号。
代码修改
以下是修改后的代码:C#public class Table{ public bool error; // 是否为 ERROR public char type; // 结点类型 public int id; // 数值
public Table() { this.error = true; }
public Table(char type, int id) { this.type = type; this.id = id; this.error = false; }}
// ... 其他代码 ...
public void SLRAnaly(){ Table tnode = new Table();
SLRAna = new Table[proitemset.Count][]; for (int i = 0; i < proitemset.Count; i++) SLRAna[i] = new Table[Echar.Count + Nchar.Count];
// 初始化,赋予 ERROR 属性 for (int i = 0; i < proitemset.Count; i++) for (int j = 0; j < Echar.Count + Nchar.Count; j++) SLRAna[i][j] = tnode;
tnode = new Table('A', 0); SLRAna[1][FindID(Echar, '#')] = tnode; // 项目集 1 必定是接受项目
for (int i = 0; i < Gy_itemset.Count; i++) { SLRNode item = null; // 找到项目集中点在最后的项目,即为归约项目 foreach (int index in proitemset[Gy_itemset[i]].Container) { if (SLRobjNum[index].Dot == SLRobjNum[index].Right.Count) { item = SLRobjNum[index]; break; } }
if (item != null) { char left = item.Left[0]; List<char> follow = GetFollow(left); foreach (char c in follow) { int CID = FindID(Echar, c); // 获取归约项目的序号 SLRAna[Gy_itemset[i]][CID] = new Table('r', Gy_obj.IndexOf(Find_pro(item))); } } }
// ... 其他代码 ...}
private int Find_pro(SLRNode node){ for (int i = 0; i < SLRproNum.Count; i++) { if (SLRproNum[i].Left == node.Left && SLRproNum[i].Right.SequenceEqual(node.Right)) return i; } return -1
原文地址: https://www.cveoy.top/t/topic/f0xd 著作权归作者所有。请勿转载和采集!