SLR1 分析表构建错误分析及修正
SLR1 分析表构建错误分析及修正
错误分析:
在 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);
SLRAna[Gy_itemset[i]][CID] = new Table('r', Find_pro(item));
if (c == '#')
{
int EID = FindID(Echar, '#');
SLRAna[Gy_itemset[i]][EID] = new Table('r', Find_pro(item));
}
}
// 添加非终结符的归约状态
foreach (char c in Nchar)
{
int CID = FindID(Nchar, c);
SLRAna[Gy_itemset[i]][CID + Echar.Count] = new Table('r', Find_pro(item));
}
}
解释:
在 SLR1 分析表中,对于含有归约项目的集合,我们需要为每个可能出现的符号(包括终结符和非终结符)添加相应的归约状态。原代码只添加了终结符的归约状态,导致分析表不完整。修正代码通过遍历所有非终结符 Nchar,并为每个非终结符添加对应的归约状态,从而修正了分析表构建的错误。
总结:
本文分析了 SLR1 分析表构建过程中出现的错误,并给出了具体的修正方法。主要错误原因是缺少非终结符的归约状态。文章提供了修正代码并解释了相应的逻辑。希望本文能够帮助大家理解 SLR1 分析表构建过程,并能够避免类似的错误。
原文地址: https://www.cveoy.top/t/topic/f0LU 著作权归作者所有。请勿转载和采集!