LR0文法分析器实现:代码优化及SLR1扩展
{
"title": "class LR\n {\n //产生式结点类\n public class LRNode\n {\n public string Left;\n public string Right;\n public LRNode(string Left, string Right)\n {\n this.Left = Left;\n this.Right = Right;\n }\n }\n //项目集类\n public class LRitemsets\n {\n public List
LRAna = new Table[proitemset.Count][]; // 初始化分析表LRAna
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++)
LRAna[i][j] = tnode; // 初始化为error状态
tnode = new Table('A', 0); // 创建一个接受状态
LRAna[1][FindID(Echar, '#')] = tnode; // 项目集1必定是接受项目,构建[1][#]:acc
for (int i = 0; i < Gy_itemset.Count; i++)
{ // 遍历每个含有归约项目的项目集
tnode = new Table('r', Find_pro(LRobjNum[proitemset[Gy_itemset[i]].Container[0]])); // 找到归约项目的原产生式序号
for (int j = 0; j < Echar.Count; j++)
{ // 对于每个终结符
LRAna[Gy_itemset[i]][j] = tnode; // 将归约项目添加至分析表中
}
foreach (char b in follow[LRobjNum[proitemset[Gy_itemset[i]].Container[0]].Left])
{ // 遍历该产生式左部的非终结符的Follow集
int j = FindID(Echar, b); // 找到该终结符在Echar中的索引
if (j >= 0)
{ // 如果该终结符存在于Echar中
LRAna[Gy_itemset[i]][j] = new Table('r', Find_pro(LRobjNum[proitemset[Gy_itemset[i]].Container[0]])); // 添加归约状态
}
}
}
for (int i = 0; i < Pindex; i++)
{ // 遍历dfa数组
if (isFinalsymbol(dfa[i].symbol))
{ // 如果dfa[i].symbol是非终结符
int CID = FindID(Nchar, dfa[i].symbol); // 找到该非终结符在Nchar中的索引
tnode = new Table('N', dfa[i].to); // 创建一个转移状态
LRAna[dfa[i].from][CID + Echar.Count] = tnode; // 添加转移状态
}
else
{ // 如果dfa[i].symbol是终结符
int CID = FindID(Echar, dfa[i].symbol); // 找到该终结符在Echar中的索引
tnode = new Table('S', dfa[i].to); // 创建一个移进状态
LRAna[dfa[i].from][CID] = tnode; // 添加移进状态
}
}
}
}
原文地址: https://www.cveoy.top/t/topic/f0L2 著作权归作者所有。请勿转载和采集!