请给出SLR1分析表构建的步骤依据上述步骤分析下列代码的正误并给出结论、指出错误部分和修改后的代码。示例:输入文法:E-E+TTT-TFFF-Ed生成的部分SLR分析表:状态+d#E4 S4 S5 85r6r6 r6 r6 6 S4 S5 7 S4 S5 8S6 S11 9r1S7 r1 r110r3r3 r3 r311r5r5 r5 r5求项目集 public vo
SLR1分析表构建的步骤:
- 求出文法的所有项目集。
- 对于每个项目集,求出它的闭包,即包含自身和所有可能的后继状态。
- 对于每个项目集中的每个项目,找到它的后继状态,即把.后面的符号移动到项目的前面,形成新的项目。
- 对于新的项目集,求出它的闭包,并判断是否已经存在于项目集中。
- 如果不存在,则把它加入项目集中,并加入到待处理的项目集列表中。
- 如果已经存在,则不需要处理。
- 对于每个项目集,分别处理移进和规约操作,并填写到SLR1分析表中。
下列代码存在错误:
- 在SLRAnaly()方法中,对于非终结符的处理应该是添加状态N,而不是添加状态S。
- 在GetFollow()方法中,对于产生式右部最后一个符号是非终结符的情况,应该将非终结符的Follow集加入到当前符号的Follow集中,而不是将非终结符的First集加入。 修改后的代码: SLRAnaly()方法中:
if (isFinalsymbol(dfa[i].symbol))//symbol为终结符 添加状态S
{
int CID = FindID(Echar, dfa[i].symbol);
SLRAna[dfa[i].from][CID] = new Table('S', dfa[i].to);
}
else //symbol为非终结符 添加状态N
{
int CID = FindID(Nchar, dfa[i].symbol);
SLRAna[dfa[i].from][CID + Echar.Count] = new Table('N', dfa[i].to);
}
GetFollow()方法中:
else if (index != -1 && index == node.Right.Length - 1)
{
follow.AddRange(GetFollow(node.Left[0]));
}
``
原文地址: https://www.cveoy.top/t/topic/hjNA 著作权归作者所有。请勿转载和采集!