Advertisement
osipyonok

sp 2

Apr 8th, 2017
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 8.66 KB | None | 0 0
  1.                     boolean flag = false;
  2.                     int[] term = testLang.getTerminals();
  3.                     int[] nonterm = testLang.getNonTerminals();
  4.  
  5.                     Map<Integer , Integer> notrm = new HashMap();
  6.                     Map<Integer , Integer> trm = new HashMap();
  7.  
  8.                     for(int i = 0 ; i < term.length ; ++i){
  9.                         trm.put(term[i] , i);
  10.                     }
  11.                     for(int i = 0 ; i < nonterm.length ; ++i){
  12.                         notrm.put(nonterm[i] , i);
  13.                     }
  14.  
  15.                     LlkContext[] llkTrmContext = testLang.getLlkTrmContext();
  16.  
  17.                     LlkContext[] res_cur = new LlkContext[nonterm.length];
  18.                     LlkContext[] res_prev = new LlkContext[nonterm.length];
  19.  
  20.                     for (int i = 0; i < nonterm.length; ++i) {
  21.                         res_cur[i] = new LlkContext();
  22.                         res_prev[i] = new LlkContext();
  23.                     }
  24.  
  25.  
  26.                     for(Node node : testLang.getLanguarge()){
  27.                         int[] rool = node.getRoole();
  28.                         int left = notrm.get(rool[0]);
  29.                         if(rool.length == 1){
  30.                             if(res_cur[left].addWord(new int[0])){
  31.                                 flag = true;
  32.                             }
  33.                         }
  34.                     }
  35.  
  36.                     if(flag == false){
  37.                         testLang.setFirstK(res_cur);
  38.                         break;
  39.                     }
  40.  
  41.                     LlkContext[] tmpLlk = new LlkContext[40];
  42.                     flag = true;
  43.                     while(flag){
  44.                         flag = false;
  45.  
  46.                         for(Node node : testLang.getLanguarge()) {
  47.                             int[] rool = node.getRoole();
  48.                             int left = notrm.get(rool[0]);
  49.                             int last = 1;
  50.                             if(rool.length == 1)continue;
  51.  
  52.                             Queue<ArrayList<Integer>> q = new LinkedList<>();
  53.  
  54.                             ArrayList<Integer> temp = new ArrayList<>();
  55.                             temp.add(-1);
  56.  
  57.                             q.add(temp);
  58.  
  59.                             ArrayList<ArrayList<Integer>> done = new ArrayList<>();
  60.  
  61.                             for(last = 1 ; last < rool.length ; ++last){
  62.                                 int cur = rool[last] > 0 ? trm.get(rool[last]) : notrm.get(rool[last]);
  63.                                 LlkContext tmp = rool[last] > 0 ? llkTrmContext[cur] : res_cur[cur];
  64.                                 if(rool[last] < 0 && res_cur[cur].calcWords() == 0)break;
  65.                                 boolean cont = false;
  66.                                 while(!q.isEmpty()){
  67.                                     ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  68.                                     if(word.get(0) == last){
  69.                                         cont = true;
  70.                                         break;
  71.                                     }
  72.                                     q.poll();
  73.                                     for(int i = 0 ; i < tmp.calcWords() ; ++i){
  74.  
  75.                                         ArrayList<Integer> word1 = (ArrayList<Integer>)word.clone();
  76.  
  77.                                         word1.set(0 , last);
  78.                                         for(int j = 0 ; j < tmp.getWord(i).length ; ++j){
  79.  
  80.                                             word1.add(tmp.getWord(i)[j]);
  81.                                         }
  82.                                         if(word1.size() - 1 >= testLang.getLlkConst()){
  83.                                             done.add(word1);
  84.                                         }else{
  85.                                             q.add(word1);
  86.                                         }
  87.                                     }
  88.                                 }
  89.                                 if(cont)continue;
  90.                                 break;
  91.                             }
  92.  
  93.                          /*   for(last = 1 ; last < rool.length ; ++last){
  94.  
  95.                                 if(rool[last] > 0){
  96.                                     int cur = trm.get(rool[last]);
  97.                                     LlkContext tmp = llkTrmContext[cur];
  98.                                     boolean cont = false;
  99.                                     while(!q.isEmpty()){
  100.                                         ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  101.                                         if(word.get(0) == last){
  102.                                             cont = true;
  103.                                             break;
  104.                                         }
  105.                                         q.poll();
  106.                                         for(int i = 0 ; i < tmp.calcWords() ; ++i){
  107.  
  108.                                             ArrayList<Integer> word1 = (ArrayList<Integer>)word.clone();
  109.  
  110.                                             word1.set(0 , last);
  111.                                             for(int j = 0 ; j < tmp.getWord(i).length ; ++j){
  112.  
  113.                                                 word1.add(tmp.getWord(i)[j]);
  114.                                             }
  115.                                             if(word1.size() - 1 >= testLang.getLlkConst()){
  116.                                                 done.add(word1);
  117.                                             }else{
  118.                                                 q.add(word1);
  119.                                             }
  120.                                         }
  121.                                     }
  122.                                     if(cont)continue;
  123.                                     break;
  124.                                 }else{
  125.                                     int cur = notrm.get(rool[last]);
  126.                                     if(res_cur[cur].calcWords() == 0)break;
  127.                                     tmpLlk[last - 1] = res_cur[cur];
  128.  
  129.                                     LlkContext tmp = res_cur[cur];
  130.                                     boolean cont = false;
  131.                                     while(!q.isEmpty()){
  132.                                         ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  133.                                         if(word.get(0) == last){
  134.                                             cont = true;
  135.                                             break;
  136.                                         }
  137.                                         q.poll();
  138.                                         for(int i = 0 ; i < tmp.calcWords() ; ++i){
  139.                                             ArrayList<Integer> word1 = (ArrayList<Integer>)word.clone();
  140.                                             word1.set(0 , last);
  141.                                             for(int j = 0 ; j < tmp.getWord(i).length ; ++j){
  142.                                                 word1.add(tmp.getWord(i)[j]);
  143.                                             }
  144.  
  145.                                             if(word1.size() - 1 >= testLang.getLlkConst()){
  146.                                                 done.add(word1);
  147.                                             }else{
  148.                                                 q.add(word1);
  149.                                             }
  150.                                         }
  151.                                     }
  152.                                     if(cont)continue;
  153.                                     break;
  154.                                 }
  155.                             }
  156.                             //   System.out.println(q.size());
  157. */
  158.                             while(last == rool.length && !q.isEmpty()){
  159.                                 ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  160.                                 q.poll();
  161.                                 done.add(word);
  162.                             }
  163.  
  164.                             for(int i = 0 ; i < done.size() ; ++i){
  165.                                 int word[] = new int[Math.min(done.get(i).size() - 1 , testLang.getLlkConst())];
  166.                                 for(int j = 0 ; j < word.length ; ++j){
  167.                                     word[j] = done.get(i).get(j + 1);
  168.                                 }
  169.                                 if(res_cur[left].addWord(word)){
  170.                                     flag = true;
  171.                                 }
  172.                             }
  173.                         }
  174.                     }
  175.                    
  176.                     testLang.setFirstK(res_cur);
  177.                     testLang.printFirstkContext();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement