namespace WindowsFormsApp4 { class SLR : LR { //构造SLR项目集 public new void Cre_club() { base.Cre_club();//先调用父类中的LR0项目集构造方法 for (int i = 0; i < pro_club.Count; i++) { int[] flag = new int[LRproNum.Count];//标志位,用来判断该产生式是否已经构造 for (int fi = 0; fi < LRproNum.Count; fi++) { flag[fi] = 0; } for (int j = 0; j < pro_club[i].Container.Count; j++) { int index = pro_club[i].Container[j]; if (LRobjNum[index].Right[LRobjNum[index].Right.Length - 1] == '.')//如果是归约项目 { for (int k = 0; k < Gy_obj.Count; k++) { if (Gy_obj[k] == index)//如果是归约项目 { for (int m = 0; m < Nchar.Count; m++) { int id = findid(Nchar[m]); if (LRAna[i][id].error)//如果没有填写过 { LRAna[i][id] = new Table('r', k); } else//如果填写过 { RETStr = '存在冲突!'; return; } } break; } } continue; } char symbol = LRobjNum[index].Right[LRobjNum[index].Right.IndexOf('.') + 1];//获取.后面的符号 int nextClubIndex = getNextClubIndex(i, symbol);//获取下一个项目集的序号 if (nextClubIndex == -1)//如果不存在 { continue; } int proIndex = getNextProIndex(symbol);//获取下一个产生式的序号 if (proIndex == -1)//如果不存在 { continue; } if (flag[proIndex] == 1)//如果已经访问过 { continue; } flag[proIndex] = 1;//标记已经访问过 if (Echar.Contains(symbol))//如果是终结符 { int id = findid(symbol); if (LRAna[i][id].error)//如果没有填写过 { LRAna[i][id] = new Table('s', nextClubIndex); } else//如果填写过 { RETStr = '存在冲突!'; return; } } else//如果是非终结符 { int id = findid(symbol); if (LRAna[i][id].error)//如果没有填写过 { LRAna[i][id] = new Table('g', nextClubIndex); } else//如果填写过 { RETStr = '存在冲突!'; return; } } } } Success = true; }

    //获取下一个产生式的序号
    private int getNextProIndex(char symbol)
    {
        for (int i = 0; i < LRproNum.Count; i++)
        {
            if (LRproNum[i].Left == symbol.ToString() && LRproNum[i].Right[0] == '.')
            {
                return i;
            }
        }
        return -1;
    }

    //获取下一个项目集的序号
    private int getNextClubIndex(int curClubIndex, char symbol)
    {
        for (int i = 0; i < Pindex; i++)
        {
            if (dfa[i].from == curClubIndex && dfa[i].symbol == symbol)
            {
                return dfa[i].to;
            }
        }
        return -1;
    }
}
SLR 分析器项目集构造方法 | C# 代码实现

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

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