SLR1分析算法实现错误分析及代码修正
在SLRAnaly函数中,对于归约项目的处理存在问题。原代码中使用了Gy_obj和Gy_itemset两个列表来记录归约项目的序号,但是在后续处理中,只使用了Gy_itemset,导致归约项目的follow集没有正确地添加到分析表中。 具体来说,对于一个归约项目,应该将其follow集中的每个终结符对应的分析表项都设置为该归约项目所对应的产生式,而原代码中只将其中一个终结符对应的表项设置为该产生式。因此,需要将SLRAnaly函数中对归约项目的处理改为如下代码:
for (int i = 0; i < Gy_itemset.Count; i++)
{
SLRNode item = SLRobjNum[proitemset[Gy_itemset[i]].Container[0]];
char left = item.Left[0];
List<char> follow = GetFollow(left);
foreach (char c in follow)
{
int CID = FindID(Echar, c);
for (int j = 0; j < proitemset.Count; j++)
{
if (proitemset[j].Container.Contains(Gy_obj[i]))
{
SLRAna[j][CID] = new Table('r', Find_pro(item));
if (c == '#')
{
foreach (char e in Echar)
{
int EID = FindID(Echar, e);
SLRAna[j][EID] = new Table('r', Find_pro(item));
}
}
}
}
}
}
改正后的代码中,使用了Gy_obj来记录归约项目的序号,避免了原代码中的问题。
原文地址: https://www.cveoy.top/t/topic/f0JR 著作权归作者所有。请勿转载和采集!