Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- boolean ck = false;
- int[] term = testLang.getTerminals();
- int[] nonterm = testLang.getNonTerminals();
- Map<Integer , Integer> notrm = new HashMap();
- Map<Integer , Integer> trm = new HashMap();
- for(int i = 0 ; i < term.length ; ++i){
- trm.put(term[i] , i);
- }
- for(int i = 0 ; i < nonterm.length ; ++i){
- notrm.put(nonterm[i] , i);
- }
- LlkContext[] llkTrmContext = testLang.getLlkTrmContext();
- LlkContext[] res_cur = new LlkContext[nonterm.length];
- for (int i = 0; i < nonterm.length; ++i) {
- res_cur[i] = new LlkContext();
- }
- for(int u : testLang.getEpsilonNonterminals()){
- res_cur[notrm.get(u)].addWord(new int[0]);
- }
- ck = true;
- while(ck){
- ck = false;
- for(Node node : testLang.getLanguarge()) {
- int[] rool = node.getRoole();
- int left = notrm.get(rool[0]);
- int last = 1;
- if(rool.length == 1)continue;
- Queue<ArrayList<Integer>> q = new LinkedList<>();
- ArrayList<Integer> temp = new ArrayList<>();
- temp.add(-1);
- q.add(temp);
- ArrayList<ArrayList<Integer>> done = new ArrayList<>();
- for(; last < rool.length ; ++last){
- int cur = rool[last] > 0 ? trm.get(rool[last]) : notrm.get(rool[last]);
- LlkContext tmp = rool[last] > 0 ? llkTrmContext[cur] : res_cur[cur];
- if(rool[last] < 0 && res_cur[cur].calcWords() == 0)break;
- boolean cont = false;
- while(!q.isEmpty()){
- ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
- if(word.get(0) == last){
- cont = true;
- break;
- }
- q.poll();
- for(int i = 0 ; i < tmp.calcWords() ; ++i){
- ArrayList<Integer> word1 = (ArrayList<Integer>)word.clone();
- word1.set(0 , last);
- for(int j = 0 ; j < tmp.getWord(i).length ; ++j){
- word1.add(tmp.getWord(i)[j]);
- }
- if(word1.size() - 1 >= testLang.getLlkConst()){
- done.add(word1);
- }else{
- q.add(word1);
- }
- }
- }
- if(cont)continue;
- break;
- }
- while(last == rool.length && !q.isEmpty()){
- ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
- q.poll();
- done.add(word);
- }
- for(int i = 0 ; i < done.size() ; ++i){
- int word[] = new int[Math.min(done.get(i).size() - 1 , testLang.getLlkConst())];
- for(int j = 0 ; j < word.length ; ++j){
- word[j] = done.get(i).get(j + 1);
- }
- ck |= (res_cur[left].addWord(word));
- }
- }
- }
- testLang.setFirstK(res_cur);
- testLang.printFirstkContext();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement