SLR(1)分析法: 文法分析及错误分析
SLR(1)分析法: 文法分析及错误分析
文法:
E->E+T|TT->T*F|FF->(E)|d
正确的SLR(1)分析表:
状态|+|*|(|)|d|#|E4| | |S4| |S5| |85|r6|r6| |r6| |r6| 6| | |S4| |S5| | 7| | |S4| |S5| | 8|S6| | |S11| | | 9|r1|S7| |r1| |r1|10|r3|r3| |r3| |r3|11|r5|r5| |r5| |r5|
错误分析:
代码中在构建SLR(1)分析表时,对于包含多个归约项目的状态,只考虑了第一个归约项目的左部符号的Follow集合来添加归约动作,而忽略了其他归约项目。这会导致分析表中缺少必要的归约动作,从而无法正确识别某些输入。
改正后的代码:C#public void SLRAnaly(){ // ... (其他代码)
for (int i = 0; i < Gy_itemset.Count; i++) { // 获取当前状态中所有归约项目的左部符号的Follow集合 List<char> follow = new List<char>(); foreach (int itemIndex in proitemset[Gy_itemset[i]].Container) { follow.AddRange(GetFollow(SLRobjNum[itemIndex].Left[0])); } follow = follow.Distinct().ToList();
// 根据Follow集合添加归约动作 foreach (char c in follow) { int CID = FindID(Echar, c); SLRAna[Gy_itemset[i]][CID] = new Table('r', Find_pro(SLRobjNum[proitemset[Gy_itemset[i]].Container[0]])); } }
// ... (其他代码)}
改正说明:
- 在处理每个包含归约项目的状态时,遍历该状态中的所有归约项目,并将每个归约项目的左部符号的Follow集合添加到一个列表中。2. 对该列表进行去重操作,得到该状态所有归约项目左部符号的Follow集合的并集。3. 遍历该Follow集合,为每个终结符添加对应的归约动作。
通过上述修改,可以确保分析表中包含所有必要的归约动作,从而能够正确识别输入并进行语法分析。
原文地址: http://www.cveoy.top/t/topic/f0MO 著作权归作者所有。请勿转载和采集!