上述是LR分析的生成LR分析表的代码,如果要变成SLR文法的分析表的构造,请使用follow集进行判断,考虑移进-归约冲突和归约-归约冲突,有哪些需要改呢,具体过程是什么,请给出SLRAnaly()构造函数及调用的FindID相关函数代码。 调用follow集分析步骤如下: 假定一个LR(0)规范族中含有如下的项目集:I={X->.b,A->.,B->.},即在该项目集中含有冲突。 ,,,为文法符号串,b为终结符,则只要满足: FOLLOW(A)FOLLOW(B)=  FOLLOW(A) {b}=  FOLLOW(B) {b}=  内容:SLRAnaly()构造函数及调用的FindID相关函数代码如下:

public void SLRAnaly()
{
    Table tnode = new Table();

    LRAna = new Table[proitemset.Count][];
    for (int i = 0; i < proitemset.Count; i++)
        LRAna[i] = new Table[Echar.Count + Nchar.Count];

    for (int i = 0; i < proitemset.Count; i++)//初始化 赋予ERROR属性
        for (int j = 0; j < Echar.Count + Nchar.Count; j++)//为终结符加r状态 
            LRAna[i][j] = tnode;

    tnode = new Table('A', 0);
    LRAna[1][FindID(Echar, '#')] = tnode;//项目集1必定是接受项目   构建[1][#]:acc的情况 先直接赋值好 dfa里没有

    for (int i = 0; i < Gy_itemset.Count; i++)
    {
        tnode = new Table('r', Find_pro(LRobjNum[proitemset[Gy_itemset[i]].Container[0]]));//归约项目 找到原产生式序号 添加状态r
        for (int j = 0; j < Echar.Count; j++)
        {
            LRAna[Gy_itemset[i]][j] = tnode;
        }
        List<int> follow = GetFollow(SLRproNum[Find_pro(LRobjNum[proitemset[Gy_itemset[i]].Container[0]])]);//获取该归约项目对应产生式左侧非终结符的follow集合
        for (int j = 0; j < follow.Count; j++)
        {
            int CID = FindID(Echar, follow[j]);
            LRAna[Gy_itemset[i]][CID] = tnode;//将follow集合中的终结符对应位置的状态改为r
        }
    }
    for (int i = 0; i < Pindex; i++)
    {

        if (isFinalsymbol(dfa[i].symbol))//symbol为非终结符  添加状态N
        {
            int CID = FindID(Nchar, dfa[i].symbol);
            tnode = new Table('N', dfa[i].to);
            LRAna[dfa[i].from][CID + Echar.Count] = tnode;
        }
        else //不是归约项目 添加状态S
        {
            int CID = FindID(Echar, dfa[i].symbol);
            tnode = new Table('S', dfa[i].to);
            LRAna[dfa[i].from][CID] = tnode;
        }

    }
}

public int FindID(List<char> list, char c)
{
    for (int i = 0; i < list.Count; i++)
    {
        if (list[i] == c)
            return i;
    }
    return -1;
}

public int Find_pro(SLRNode node)
{
    for (int i = 0; i < SLRproNum.Count; i++)
    {
        if (SLRproNum[i].Left == node.Left && SLRproNum[i].Right == node.Right)
            return i;
    }
    return -1;
}
SLR文法分析表构造代码优化

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

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