SLR 分析表构建算法详解及 C# 代码实现
{ "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
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
原文地址: https://www.cveoy.top/t/topic/f1QC 著作权归作者所有。请勿转载和采集!