Advertisement
osipyonok

SP LAB 2 SHORT

Apr 8th, 2017
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.35 KB | None | 0 0
  1.                     boolean ck = 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.                     LlkContext[] res_cur = new LlkContext[nonterm.length];
  17.  
  18.                     for (int i = 0; i < nonterm.length; ++i) {
  19.                         res_cur[i] = new LlkContext();
  20.                     }
  21.  
  22.                     for(int u : testLang.getEpsilonNonterminals()){
  23.                         res_cur[notrm.get(u)].addWord(new int[0]);
  24.                     }
  25.  
  26.                     ck = true;
  27.  
  28.                     while(ck){
  29.                         ck = false;
  30.  
  31.                         for(Node node : testLang.getLanguarge()) {
  32.                             int[] rool = node.getRoole();
  33.                             int left = notrm.get(rool[0]);
  34.                             int last = 1;
  35.                             if(rool.length == 1)continue;
  36.  
  37.                             Queue<ArrayList<Integer>> q = new LinkedList<>();
  38.  
  39.                             ArrayList<Integer> temp = new ArrayList<>();
  40.                             temp.add(-1);
  41.  
  42.                             q.add(temp);
  43.  
  44.                             ArrayList<ArrayList<Integer>> done = new ArrayList<>();
  45.  
  46.                             for(; last < rool.length ; ++last){
  47.                                 int cur = rool[last] > 0 ? trm.get(rool[last]) : notrm.get(rool[last]);
  48.                                 LlkContext tmp = rool[last] > 0 ? llkTrmContext[cur] : res_cur[cur];
  49.                                 if(rool[last] < 0 && res_cur[cur].calcWords() == 0)break;
  50.                                 boolean cont = false;
  51.                                 while(!q.isEmpty()){
  52.                                     ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  53.                                     if(word.get(0) == last){
  54.                                         cont = true;
  55.                                         break;
  56.                                     }
  57.                                     q.poll();
  58.                                     for(int i = 0 ; i < tmp.calcWords() ; ++i){
  59.                                         ArrayList<Integer> word1 = (ArrayList<Integer>)word.clone();
  60.                                         word1.set(0 , last);
  61.                                         for(int j = 0 ; j < tmp.getWord(i).length ; ++j){
  62.                                             word1.add(tmp.getWord(i)[j]);
  63.                                         }
  64.                                         if(word1.size() - 1 >= testLang.getLlkConst()){
  65.                                             done.add(word1);
  66.                                         }else{
  67.                                             q.add(word1);
  68.                                         }
  69.                                     }
  70.                                 }
  71.                                 if(cont)continue;
  72.                                 break;
  73.                             }
  74.  
  75.                             while(last == rool.length && !q.isEmpty()){
  76.                                 ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  77.                                 q.poll();
  78.                                 done.add(word);
  79.                             }
  80.  
  81.                             for(int i = 0 ; i < done.size() ; ++i){
  82.                                 int word[] = new int[Math.min(done.get(i).size() - 1 , testLang.getLlkConst())];
  83.                                 for(int j = 0 ; j < word.length ; ++j){
  84.                                     word[j] = done.get(i).get(j + 1);
  85.                                 }
  86.                                 ck |= (res_cur[left].addWord(word));
  87.                             }
  88.                         }
  89.                     }
  90.  
  91.                     testLang.setFirstK(res_cur);
  92.                     testLang.printFirstkContext();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement