Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static public void findFollowk()
- {
- int[] nonTerms = testLang.getNonTerminals();
- int S = testLang.getAxioma();
- int Sindex = 0;
- for(int i=0; i<nonTerms.length; ++i)
- {
- if(S == nonTerms[i])
- {
- Sindex = i;
- break;
- }
- }
- LlkContext[] sigmaN = new LlkContext[nonTerms.length];
- LlkContext[] sigmaM = new LlkContext[nonTerms.length];
- for(int i=0; i<nonTerms.length; ++i)
- {
- sigmaN[i] = new LlkContext();
- sigmaM[i] = new LlkContext();
- }
- boolean newFound = true;
- for(int step = 0; newFound; ++step)
- {
- newFound = false;
- if(step == 0)
- {
- sigmaM[Sindex].addWord(new int[]{});
- } else if(step == 1)
- {
- int[] SRule = testLang.getLanguarge().getFirst().getRoole();
- for(int i=0; i<nonTerms.length; ++i)
- {
- //check if rule S -> ... has terminal Ai at right side
- for(int j=1; j<SRule.length; ++j)
- {
- if(SRule[j] == nonTerms[i]) //Ai found!
- {
- int[] w2 = new int[SRule.length - j - 1]; //word after Ai
- for(int q=0; q<w2.length; ++q)
- {
- w2[q] = SRule[j+q+1];
- }
- LlkContext firstkW2 = GetFirstkForWord(w2);
- for(int q=0; q<firstkW2.calcWords(); ++q)
- {
- sigmaM[i].addWord(firstkW2.getWord(q));
- }
- }
- }
- }
- } else
- {
- for(Node ruleNode : testLang.getLanguarge())
- {
- int[] rule = ruleNode.getRoole();
- int Aj = rule[0];
- int AjIndex = 0;
- for(int i=0; i<nonTerms.length; ++i)
- {
- if(Aj == nonTerms[i])
- {
- AjIndex = i;
- break;
- }
- }
- for(int i=0; i<nonTerms.length; ++i)
- {
- //check if rule Aj -> ... has terminal Ai at right side
- for(int j=1; j<rule.length; ++j)
- {
- if(rule[j] == nonTerms[i])
- {
- int[] w2 = new int[rule.length - j - 1]; //word after Ai
- for(int q=0; q<w2.length; ++q)
- {
- w2[q] = rule[j+q+1];
- }
- LlkContext firstkW2 = Concatenate(GetFirstkForWord(w2), sigmaN[AjIndex]);
- for(int q=0; q<firstkW2.calcWords(); ++q)
- {
- sigmaM[i].addWord(firstkW2.getWord(q));
- }
- }
- }
- }
- }
- }
- //check if sigmaM == sigmaN
- for(int i=0; i<sigmaN.length; ++i)
- {
- if(sigmaN[i].calcWords() != sigmaM[i].calcWords())
- {
- newFound = true;
- //deep copy sigmaM to sigmaN
- for(int j=0; j<nonTerms.length; ++j)
- {
- sigmaN[j] = new LlkContext();
- for(int w=0; w<sigmaM[j].calcWords(); ++w)
- {
- sigmaN[j].addWord(sigmaM[j].getWord(w));
- }
- }
- break;
- }
- }
- }
- //Followk found!
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement