SLR(1)分析法详解:文法、代码实现及错误分析

1. 文法介绍

给定文法如下:

E -> E + T | TT -> T * F | FF -> ( E ) | d

2. SLR(1)分析表构建

正确答案的 SLR(1)分析表如下:

| 状态 | + | * | ( | ) | d | # | E | T | F ||---|---|---|---|---|---|---|---|---|---|| 0 | | | S4 | | S5 | | 1 | 2 | 3 || 1 | r6 | r6 | | r6 | r6 | r6 | | | || 2 | S6 | | | r6 | r6 | r6 | | | || 3 | r5 | r5 | | r5 | r5 | r5 | | | || 4 | | | S4 | | S5 | | 8 | 2 | 3 || 5 | r4 | r4 | | r4 | r4 | r4 | | | || 6 | | | S4 | | S5 | | | 9 | 3 || 7 | | | S4 | | S5 | | | | 10 || 8 | S6 | | | S11 | | | | | | | 9 | r1 | S7 | | r1 | r1 | r1 | | | || 10 | r3 | r3 | | r3 | r3 | r3 | | | || 11 | r2 | r2 | | r2 | r2 | r2 | | | |

3. 错误分析

你的代码中,SLRAnaly() 函数对于归约项目的处理有误。

错误原因:

在处理含有归约项目的项目集合时,代码只考虑了左部符号为 '#' 的情况,而没有处理其他符号的情况。对于每个含有归约项目的项目集合,应该找到该项目集合中所有项目的左部符号的 follow 集合,并将其加入到对应的分析表中。

改正方法:

修改 SLRAnaly() 函数中对于归约项目的处理,对于每个含有归约项目的项目集合,找到该项目集合中所有项目的左部符号的follow集合,将其加入到对应的分析表中。javapublic void SLRAnaly() { // ... (省略部分代码)

for (int i = 0; i < Gy_itemset.Count; i++) {        List<char> follow = new ArrayList<>();        for (int index : proitemset.get(Gy_itemset.get(i)).Container) {            SLRNode item = SLRobjNum.get(index);            follow.addAll(GetFollow(item.Left.charAt(0)));        }        follow = new ArrayList<>(new HashSet<>(follow)); // 去重        for (char c : follow) {            int CID = FindID(Echar, c);            SLRAna[Gy_itemset.get(i)][CID] = new Table('r', Find_pro(SLRobjNum.get(proitemset.get(Gy_itemset.get(i)).Container.get(0))));            if (c == '#') {                for (char e : Echar) {                    int EID = FindID(Echar, e);                    SLRAna[Gy_itemset.get(i)][EID] = new Table('r', Find_pro(SLRobjNum.get(proitemset.get(Gy_itemset.get(i)).Container.get(0))));                }            }        }    }

// ... (省略部分代码)}

4. 总结

通过以上分析,我们找到了代码中导致 SLR(1) 分析表构建错误的原因,并给出了改正方法。在实现 SLR(1) 分析法的过程中,需要注意细节,确保代码逻辑的正确性,才能得到正确的分析结果

SLR(1)分析法详解:文法、代码实现及错误分析

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

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