{
"namespace WindowsFormsApp4": { "class SLR": { "//产生式结点类": { "public class LRproNode": { "public string Left; public string Right; public LRproNode(string Left, string Right) { this.Left = Left; this.Right = Right; } } }, "//项目集类": { "public class LR_club": { "public List Container = new List(100); //记录项目在项目集合中的序号 } }, "//DFA结点": { "public struct DFA": { "public int from; public char symbol; public int to; public DFA(int from, char symbol, int to) { this.from = from; this.symbol = symbol; this.to = to; } } }, "//分析表 结点": { "public class Table": { "public bool error;//是否为ERROR public char type;//结点类型 public int id;//数值 public Table() { this.error = true; } public Table(char type, int id) { this.type = type; this.id = id; this.error = false; } } }, "public DFA[] dfa = new DFA[100];", "public int Pindex = 0; //dfa数组指针", "public Table[][] LRAna;//分析表", "public ANA_JUZI Jz; public bool Success = false; public List LRproNum = new List(50);//产生式 列表 public List LRobjNum = new List(50);//项目 列表 public List<LR_club> pro_club = new List<LR_club>(100);//项目集合 public List Gy_obj = new List(50);//归约项目序号集合 public List Gy_club = new List(50);//含有归约项目的集合的序号 的集合 public List Nchar = new List(50);//非终结符集合 public List Echar = new List(50);//终结符集合", "public string RETStr = '';", "public string RETStr_obclub = '';//输出返回", "public string RETStr_DFA = '';", "public string RETStr_ANA = '';", "//读取传递过来的文件信息str后,对str的或运算加以处理,变成多个产生式 //返回处理过的信息 //public void Start(string str) { } ", "//求项目集": { "public void Cre_club()": { "List lr_club = new List(100);//记录项目的序号", "lr_club.Add(0);", "lr_club = Closure(lr_club);//构造初始项目集 求闭包", "LR_club LR_C = new LR_club();", "LR_C.Container = lr_club;//集合----项目集序号的集合", "pro_club.Add(LR_C);//集合的集合----存放项目集序号集合 的集合", "for (int i = 0; i < pro_club.Count; i++)//整体集合中 第i个项目集": { "pro_club[i].Container.Sort();//排序由小到大 后面用于判断是否存在的比较", "int[] flag = new int[pro_club[i].Container.Count];", "for (int fi = 0; fi < pro_club[i].Container.Count; fi++)//标志位,用来判断该序号是否已经构造": { "flag[fi] = 0; }", "for (int j = 0; j < pro_club[i].Container.Count; j++)//第i个项目集的第j个项目": { "if (flag[j] == 1)//如果已经访问过 就不再构造 找下一个项目 continue; int index = pro_club[i].Container[j]; for (int pi = 0; pi < LRobjNum[index].Right.Length - 1; pi++)//length-1是避免匹配到.在最后的规约项目": { "if (LRobjNum[index].Right[pi] == '.')": { "List lr2_club = new List(100);//记录项目的序号", "char symbol = LRobjNum[index].Right[pi + 1];//记录.a转移状态a.的符号a", "lr2_club.Add((index + 1));//如果遇到.a形式的项目序号为index 那么项目a.的序号为index+1", "for (int m1 = j + 1; m1 < pro_club[i].Container.Count; m1++)": {//在第i个项目集中找到了可以移动的.:.a 重新遍历第i个项目集j项目之后的 找到同样可以移动a的项目集 "int index2 = pro_club[i].Container[m1]; for (int m2 = 0; m2 < LRobjNum[index2].Right.Length - 1; m2++)": { "if (LRobjNum[index2].Right[m2] == '.' && LRobjNum[index2].Right[m2 + 1] == symbol)": { "flag[m1] = 1;//标记位置为1 已经访问 之后不再访问", "lr2_club.Add(index2 + 1); } } } "lr2_club = Closure(lr2_club);//求闭包", "int value = isexist(lr2_club);", "if (value == -1)//-1表示不存在相同的": { "for (int m3 = 0; m3 < Gy_obj.Count; m3++)": { "if (isnexist(lr2_club, Gy_obj[m3]))": { "Gy_club.Add(pro_club.Count); } } "LR_club LR_C2 = new LR_club();", "dfa[Pindex++] = new DFA(i, symbol, pro_club.Count);//count不用加1 本身从0开始", "LR_C2.Container = lr2_club; pro_club.Add(LR_C2); } "else": { "dfa[Pindex++] = new DFA(i, symbol, value); } "break; } } } } } }, "//构造SLR分析表": { "public void Cre_AnalyseTable()": { "LRAna = new Table[pro_club.Count][];", "for (int i = 0; i < pro_club.Count; i++)": { "LRAna[i] = new Table[Echar.Count + Nchar.Count + 1];", "for (int j = 0; j < Echar.Count + Nchar.Count + 1; j++)": { "LRAna[i][j] = new Table(); } } "for (int i = 0; i < pro_club.Count; i++)": { "for (int j = 0; j < pro_club[i].Container.Count; j++)": { "int index = pro_club[i].Container[j];", "LRproNode node = LRobjNum[index];", "int pi = node.Right.IndexOf('.');", "if (pi == node.Right.Length - 1)//如果.在最后,说明是规约项目": { "if (node.Left == 'S'')": { "LRAna[i][Echar.Count].error = false; LRAna[i][Echar.Count].type = 'A'; LRAna[i][Echar.Count].id = 0; } "else": { "for (int k = 0; k < LRproNum.Count; k++)": { "if (LRproNum[k].Left == node.Left && LRproNum[k].Right == node.Right.Substring(0, node.Right.Length - 1))": { "for (int m = 0; m < Echar.Count; m++)": { "if (Echar[m] == node.Right[node.Right.Length - 1])": { "if (LRAna[i][m].error == true)": { "LRAna[i][m].error = false; LRAna[i][m].type = 'R'; LRAna[i][m].id = k; } "else": { RETStr_ANA = '该文法不是SLR文法'; return; } } } } } } } "else": { "char symbol = node.Right[pi + 1];", "if (isNexist(symbol))": { "for (int k = 0; k < Echar.Count; k++)": { "if (Echar[k] == symbol)": { "int value = FindDFA(i, symbol);", "if (LRAna[i][k].error == true)": { "LRAna[i][k].error = false; LRAna[i][k].type = 'S'; LRAna[i][k].id = value; } "else": { RETStr_ANA = '该文法不是SLR文法'; return; } } } } "else": { "for (int k = 0; k < Nchar.Count; k++)": { "if (Nchar[k] == symbol)": { "int value = FindDFA(i, symbol);", "if (LRAna[i][k + Echar.Count].error == true)": { "LRAna[i][k + Echar.Count].error = false; LRAna[i][k + Echar.Count].type = 'G'; LRAna[i][k + Echar.Count].id = value; } "else": { RETStr_ANA = '该文法不是SLR文法'; return; } } } } } } } "Success = true; } }, "//判断符号是否存在于非终结符和终结符中": { "public bool isNexist(char symbol)": { "for (int i = 0; i < Nchar.Count; i++)": { "if (Nchar[i] == symbol)": { "return false; } } "for (int i = 0; i < Echar.Count; i++)": { "if (Echar[i] == symbol)": { "return false; } } "return true; } }, "//在DFA中查找是否存在符号为symbol的转移状态": { "public int FindDFA(int from, char symbol)": { "for (int i = 0; i < Pindex; i++)": { "if (dfa[i].from == from && dfa[i].symbol == symbol)": { "return dfa[i].to; } } "return -1; } } } }


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

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