{ "SLRAna" = new Table[proitemset.Count][]; for (int i = 0; i < proitemset.Count; i++) { SLRAna[i] = new Table[Echar.Count + Nchar.Count];//终结符和非终结符的总数 for (int j = 0; j < Echar.Count; j++)//遍历终结符 { SLRAna[i][j] = new Table(); char symbol = Echar[j]; List lr_item = new List(100);//记录项目的序号 for (int k = 0; k < proitemset[i].Container.Count; k++)//遍历项目集合中的项目 { int index = proitemset[i].Container[k]; if (SLRobjNum[index].Right.Contains('.'))//如果该项目中包含., 则需要进行移进操作 { int dotIndex = SLRobjNum[index].Right.IndexOf('.');//找到.的位置 if (SLRobjNum[index].Right.Length > dotIndex + 1 && SLRobjNum[index].Right[dotIndex + 1] == symbol)//如果.后面的符号和当前终结符相同 { lr_item.Add(index + 1);//移进操作,将.向右移一位 } } } if (lr_item.Count > 0)//如果存在移进项 { int value = isexist(lr_item);//判断该项目集是否已存在 if (value == -1)//如果不存在,则添加到项目集合中 { SLRitemsets LR_C = new SLRitemsets(); LR_C.Container = lr_item; proitemset.Add(LR_C); value = proitemset.Count - 1; } SLRAna[i][j] = new Table('S', value);//在分析表中添加S加上移进项的编号 } else//如果不存在移进项,则在分析表中添加一个空字符串 { SLRAna[i][j] = new Table(); } }

    for (int j = 0; j < Nchar.Count; j++)//遍历非终结符
    {
        SLRAna[i][Echar.Count + j] = new Table();
        char symbol = Nchar[j];
        List<int> lr_item = new List<int>(100);//记录项目的序号
        for (int k = 0; k < proitemset[i].Container.Count; k++)//遍历项目集合中的项目
        {
            int index = proitemset[i].Container[k];
            if (SLRobjNum[index].Right.Contains('.'))//如果该项目中包含., 则需要进行移进操作
            {
                int dotIndex = SLRobjNum[index].Right.IndexOf('.');//找到.的位置
                if (SLRobjNum[index].Right.Length > dotIndex + 1 && SLRobjNum[index].Right[dotIndex + 1] == symbol)//如果.后面的符号和当前非终结符相同
                {
                    lr_item.Add(index);//移进操作,将.向右移一位
                }
            }
        }
        if (lr_item.Count > 0)//如果存在移进项
        {
            int value = isexist(lr_item);//判断该项目集是否已存在
            if (value == -1)//如果不存在,则添加到项目集合中
            {
                SLRitemsets LR_C = new SLRitemsets();
                LR_C.Container = lr_item;
                proitemset.Add(LR_C);
                value = proitemset.Count - 1;
            }
            SLRAna[i][Echar.Count + j] = new Table('G', value);//在分析表中添加移进项的编号
        }
        else//如果不存在移进项,则在分析表中添加一个空字符串
        {
            SLRAna[i][Echar.Count + j] = new Table();
        }
    }

    for (int j = 0; j < proitemset[i].Container.Count; j++)//遍历项目集合中的项目
    {
        int index = proitemset[i].Container[j];
        if (SLRobjNum[index].Right.Contains('.'))//如果该项目中包含., 则需要进行归约操作
        {
            int dotIndex = SLRobjNum[index].Right.IndexOf('.');//找到.的位置
            if (SLRobjNum[index].Right.Length == dotIndex + 1)//如果.在最后一个位置,即为归约项目
            {
                for (int k = 0; k < Nchar.Count; k++)//遍历非终结符集合
                {
                    char symbol = Nchar[k];
                    if (Follow(SLRobjNum[index].Left).Contains(symbol))//如果该非终结符在该归约项目的左侧非终结符的FOLLOW集中
                    {
                        int value = SLRproNum.IndexOf(new SLRNode(SLRobjNum[index].Left, SLRobjNum[index].Right.Replace('.', '')));//在产生式集合中找到该归约项目对应的产生式的编号
                        SLRAna[i][Echar.Count + k] = new Table('r', value);//在分析表中添加r加上该归约项的编号
                    }
                }
            }
        }
    }

    if (!Gy_itemset.Contains(i))//如果该项目集不含有归约项目
    {
        int value = SLRobjNum.IndexOf(new SLRNode('S''', 'S.'));//在项目集中找到接受项目的序号
        SLRAna[i][Echar.Count - 1] = new Table('A', value);//在分析表中添加A加上接受项目的编号
    }
}

}

//Follow集合 public List Follow(string str) {

SLR 分析表构建算法详解及 C# 代码实现

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

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