private void ReadGrammer(String filePath, String classCodePath) { Non_TerminalSymbolCount = -1; Symbol2Code = new Dictionary <string, int>(); Code2Symbol = new Dictionary <int, string>(); try { FileStream fs = new FileStream(classCodePath, FileMode.Open); StreamReader rs = new StreamReader(fs); while (!rs.EndOfStream) { String[] line = rs.ReadLine().Split(' '); int code = Int32.Parse(line[1]); Symbol2Code.Add(line[0], code); Code2Symbol.Add(code, line[0]); } rs.Close(); fs.Close(); } catch (Exception e) { throw e; } //读文法并转化 grammerMap = new Dictionary <int, GrammerItem>(); try { FileStream fs = new FileStream(filePath, FileMode.Open); StreamReader rs = new StreamReader(fs); while (!rs.EndOfStream) { String[] line = rs.ReadLine().Split(' '); int from = 0; List <int> to = new List <int>(); for (int i = 0; i < line.Length; i++) { if (i == 0) { from = GetSymbolCode(line[i]); } else { to.Add(GetSymbolCode(line[i])); } } if (!grammerMap.ContainsKey(from)) { grammerMap[from] = new GrammerItem(from); } grammerMap[from].AddTo(to.ToArray()); } rs.Close(); fs.Close(); } catch (Exception e) { Console.WriteLine(e); } }
HashSet <int> MakeFirst(GrammerItem now) { if (now.firstSet != null) { //Console.WriteLine("First递归"+Code2Symbol[now.GetFrom()]); return(now.firstSet); } now.firstSet = new HashSet <int>(); foreach (var edge in now.edges) { now.firstSet.UnionWith(GetFirst(edge.to)); } return(now.firstSet); }