Advertisement
Guest User

Untitled

a guest
May 30th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.26 KB | None | 0 0
  1.     static public void findFollowk()
  2.     {
  3.         int[] nonTerms = testLang.getNonTerminals();
  4.         int S = testLang.getAxioma();
  5.         int Sindex = 0;
  6.         for(int i=0; i<nonTerms.length; ++i)
  7.         {
  8.             if(S == nonTerms[i])
  9.             {
  10.                 Sindex = i;
  11.                 break;
  12.             }
  13.         }
  14.        
  15.         LlkContext[] sigmaN = new LlkContext[nonTerms.length];
  16.         LlkContext[] sigmaM = new LlkContext[nonTerms.length];
  17.         for(int i=0; i<nonTerms.length; ++i)
  18.         {
  19.             sigmaN[i] = new LlkContext();
  20.             sigmaM[i] = new LlkContext();
  21.         }
  22.        
  23.         boolean newFound = true;
  24.        
  25.         for(int step = 0; newFound; ++step)
  26.         {
  27.             newFound = false;
  28.            
  29.             if(step == 0)
  30.             {
  31.                 sigmaM[Sindex].addWord(new int[]{});
  32.             } else if(step == 1)
  33.             {
  34.                 int[] SRule = testLang.getLanguarge().getFirst().getRoole();
  35.                 for(int i=0; i<nonTerms.length; ++i)
  36.                 {
  37.                     //check if rule S -> ... has terminal Ai at right side
  38.                     for(int j=1; j<SRule.length; ++j)
  39.                     {
  40.                         if(SRule[j] == nonTerms[i]) //Ai found!
  41.                         {
  42.                             int[] w2 = new int[SRule.length - j - 1]; //word after Ai
  43.                             for(int q=0; q<w2.length; ++q)
  44.                             {
  45.                                 w2[q] = SRule[j+q+1];
  46.                             }
  47.                             LlkContext firstkW2 = GetFirstkForWord(w2);
  48.                             for(int q=0; q<firstkW2.calcWords(); ++q)
  49.                             {
  50.                                 sigmaM[i].addWord(firstkW2.getWord(q));
  51.                             }
  52.                         }
  53.                     }
  54.                 }
  55.             } else
  56.             {
  57.                 for(Node ruleNode : testLang.getLanguarge())
  58.                 {
  59.                     int[] rule = ruleNode.getRoole();
  60.                    
  61.                     int Aj = rule[0];
  62.                     int AjIndex = 0;
  63.                     for(int i=0; i<nonTerms.length; ++i)
  64.                     {
  65.                         if(Aj == nonTerms[i])
  66.                         {
  67.                             AjIndex = i;
  68.                             break;
  69.                         }
  70.                     }
  71.  
  72.                     for(int i=0; i<nonTerms.length; ++i)
  73.                     {
  74.                         //check if rule Aj -> ... has terminal Ai at right side
  75.                         for(int j=1; j<rule.length; ++j)
  76.                         {
  77.                             if(rule[j] == nonTerms[i])
  78.                             {
  79.                                 int[] w2 = new int[rule.length - j - 1]; //word after Ai
  80.                                 for(int q=0; q<w2.length; ++q)
  81.                                 {
  82.                                     w2[q] = rule[j+q+1];
  83.                                 }
  84.                                 LlkContext firstkW2 = Concatenate(GetFirstkForWord(w2), sigmaN[AjIndex]);
  85.                                 for(int q=0; q<firstkW2.calcWords(); ++q)
  86.                                 {
  87.                                     sigmaM[i].addWord(firstkW2.getWord(q));
  88.                                 }
  89.                             }
  90.                         }
  91.                     }
  92.                    
  93.                    
  94.                 }
  95.             }
  96.            
  97.             //check if sigmaM == sigmaN
  98.             for(int i=0; i<sigmaN.length; ++i)
  99.             {
  100.                 if(sigmaN[i].calcWords() != sigmaM[i].calcWords())
  101.                 {
  102.                     newFound = true;
  103.                     //deep copy sigmaM to sigmaN
  104.                     for(int j=0; j<nonTerms.length; ++j)
  105.                     {
  106.                         sigmaN[j] = new LlkContext();
  107.                         for(int w=0; w<sigmaM[j].calcWords(); ++w)
  108.                         {
  109.                             sigmaN[j].addWord(sigmaM[j].getWord(w));
  110.                         }
  111.                     }
  112.                     break;
  113.                 }
  114.             }
  115.         }
  116.        
  117.         //Followk found!
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement