在 SLR1 分析表的构建中,归约状态需要正确地添加,否则会导致分析表出错。在代码中,归约状态的添加有误,具体表现在 SLRAnaly() 函数中的以下代码段:

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);
    SLRAna[Gy_itemset[i]][CID] = new Table('r', Find_pro(item));      
}

这段代码的逻辑是对于含有归约项目的项目集合,找到该项目集合中第一个项目的左部非终结符,并计算其 follow 集合,然后将该 follow 集合中的每个终结符在分析表中对应的位置上添加归约状态。但是这个逻辑有误,因为一个项目集合中可能存在多个左部相同的项目,而这些项目的 follow 集合可能不同,因此只考虑第一个项目的 follow 集合是不正确的。

正确的做法是对于一个含有归约项目的项目集合,需要将该项目集合中所有左部相同的项目的 follow 集合取并集,然后将并集中的每个终结符在分析表中对应的位置上添加归约状态。修改后的代码如下:

SLRNode item = SLRobjNum[proitemset[Gy_itemset[i]].Container[0]];
char left = item.Left[0];
List<char> follow = new List<char>();
foreach (int index in proitemset[Gy_itemset[i]].Container)
{
    SLRNode node = SLRobjNum[index];
    if (node.Left[0] == left)
    {
        List<char> nodeFollow = GetFollow(left);
        follow = follow.Union(nodeFollow).ToList();
    }
}
foreach (char c in follow)
{
    int CID = FindID(Echar, c);
    SLRAna[Gy_itemset[i]][CID] = new Table('r', Find_pro(item));
}

这里对每个左部相同的项目都计算其 follow 集合,并将这些集合取并集,然后再添加归约状态。

SLR1 分析表构建错误分析与修正

原文地址: https://www.cveoy.top/t/topic/f0MK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录