Beispiel #1
0
 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); }
 }
Beispiel #2
0
 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);
 }