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]]));        }    }

// ... (其他代码)}

改正说明:

  1. 在处理每个包含归约项目的状态时,遍历该状态中的所有归约项目,并将每个归约项目的左部符号的Follow集合添加到一个列表中。2. 对该列表进行去重操作,得到该状态所有归约项目左部符号的Follow集合的并集。3. 遍历该Follow集合,为每个终结符添加对应的归约动作。

通过上述修改,可以确保分析表中包含所有必要的归约动作,从而能够正确识别输入并进行语法分析。

SLR(1)分析法: 文法分析及错误分析

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

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