Advertisement
osipyonok

SP LAB 2 FULL

Apr 8th, 2017
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.36 KB | None | 0 0
  1. /**
  2.  * Created by Max on 25.02.2017.
  3.  */
  4. import java.lang.*;
  5. import java.util.*;
  6. import java.io.*;
  7. import java.nio.charset.Charset;
  8.  
  9. import JavaTeacherLib.MyLang;
  10. import JavaTeacherLib.LlkContext;
  11. import JavaTeacherLib.Node;
  12. import JavaTeacherLib.TableNode;
  13.  
  14.  
  15.  
  16. public class Main {
  17.  
  18.     public static void main(String[] args) {
  19.         byte [] readline=new byte [80];
  20.         boolean result;
  21.         String fileName;
  22.         MyLang testLang=null;
  23.         int codeAction, llk=1, textLen;
  24.         String [] menu= { "*1.  Прочитати граматику з файла  ",
  25.                 " 2.  Лабораторна робота. Клас будує студент",
  26.                 " 3.  Надрукувати граматику",
  27.                 "*4.  Побудувати списки терміналів та нетерміналів",
  28.                 "*5.  Пошук непродуктивних нетерміналів",
  29.                 "*6.  Пошук недосяжних нетерміналів",
  30.                 "*7.  Побудова списку епсілон-нетерміналів",
  31.                 " 8.  Друк списку епсілон-нетерміналів",
  32.                 " 9.  Пошук ліворекурсивних нетерміналів",
  33.                 " 10. Пошук різних ліворекурсивних виводів мінімальної довжини",
  34.                 " 11. Пошук праворекурсивних нетерміналів",
  35.                 " 12. Пошук різних праворекурсивних виводів мінімальної довжини",
  36.                 "*13. Побудувати множини FirstK(A), A-нетермінал",
  37.                 " 14. Вивести на термінал множини FirstK(A), A-нетермінал",
  38.                 "*15. Побудувати множини FollowK(A), A-нетермінал",
  39.                 " 16. Вивести на термінал множини FollowK(A), A-нетермінал",
  40.                 "*17. Побудувати множини FirstK(w) + FollowK(A) для правила А->w",
  41.                 " 18. Вивести на термінал FirstK(w) + FollowK(A) для всіх правил А->w",
  42.                 " 19. Вивести на термінал FirstK(w) + FollowK(A) для вибраних правил А->w",
  43.                 "*20. Перевірка сильної LL(1)-властивості",
  44.                 " 21. Побудова таблиці LL(1)-синтаксичного аналізатора",
  45.                 " 22. Синтаксичний аналізатор. Клас будує студент",
  46.                 "*23. Побудувати множини LocalK(A), A-нетермінал",
  47.                 " 24. Вивести на термінал множини LocalK(A), A-нетермінал",
  48.                 "*25. Перевірка LL(k)-властивості, k>1",
  49.                 " 26. Вихід з системи"
  50.         };
  51.         do  {
  52.             codeAction=0;
  53.             String upr;
  54.             for (String ss: menu) System.out.println(ss); // вивести меню
  55.             System.out.println("Введіть код дії або end:");
  56.             do {  // цикл перебору даних
  57.                 try {
  58.                     textLen=System.in.read(readline);
  59.                     upr = new String (readline,0,textLen, "ISO-8859-1");
  60.                     if (upr.trim().equals("end") ) return;
  61.                     codeAction=new Integer (upr.trim());
  62.                 }
  63.                 catch(Exception ee)
  64.                 { System.out.println ("Невірний код дії, повторіть: ");
  65.                     continue;
  66.                 }
  67.                 if (codeAction >=1  &&  codeAction<=menu.length ) {
  68.                     if (menu [codeAction-1].substring(0, 1).equals("+"))  {
  69.                         System.out.println("Елемент меню " +codeAction+" повторно виконати неможливо");
  70.                         continue ;
  71.                     }
  72.                     int itmp;
  73.                     for (itmp=0; itmp < codeAction-1; itmp++)
  74.                         if (menu[itmp].substring(0, 1).equals("*")) break;
  75.                     if (itmp !=codeAction-1) {
  76.                         System.out.println ("Виконайте попередні елементи меню, що позначені * : ");
  77.                         continue ;
  78.                     }
  79.                     break;
  80.                 }
  81.                 else {
  82.                     System.out.println ("Невірний код дії, повторіть: ");
  83.                     continue ;
  84.                 }
  85.             }  while (true);
  86.             // перевірка на виконання усіх попередніх дій
  87.             result=false;
  88.             switch (codeAction) {
  89.                 case 1: //1. Прочитати граматику з файла",
  90.                     System.out.print ("Введіть ім'я файлу граматики:");
  91.                     try {
  92.                         textLen=System.in.read(readline);
  93.                         fileName = new String (readline,0,textLen, "ISO-8859-1");
  94.                         fileName = fileName.trim();
  95.                     }
  96.                     catch(Exception ee)
  97.                     { System.out.println ("Системна помилка: "+ee.toString());
  98.                         return;
  99.                     }
  100.                     System.out.print ("Введіть значення параметра k : ");
  101.                     try {
  102.                         textLen=System.in.read(readline);
  103.                         String llkText = new String (readline,0,textLen, "ISO-8859-1");
  104.                         llkText = llkText.trim();
  105.                         llk=Integer.parseInt(llkText);
  106.                     }
  107.                     catch(Exception ee)
  108.                     { System.out.println ("Системна помилка: "+ee.toString());
  109.                         return;
  110.                     }
  111.                     testLang = new MyLang (fileName,llk);
  112.                     if (!testLang.isCreate()) break;  //не створили об'єкт
  113.                     System.out.println ("Граматика прочитана успішно");
  114.                     result=true;
  115.                     for (int jj=0;  jj<menu.length; jj++) {
  116.                         if (menu [jj].substring(0, 1).equals(" ")) continue;
  117.                         menu [jj]=menu [jj].replace(menu [jj].charAt(0), '*') ;
  118.                     }
  119.                     break;
  120.                 case 2: //2. Лабораторна робота студента
  121.  
  122.                     boolean ck = false;
  123.                     int[] term = testLang.getTerminals();
  124.                     int[] nonterm = testLang.getNonTerminals();
  125.  
  126.                     Map<Integer , Integer> notrm = new HashMap();
  127.                     Map<Integer , Integer> trm = new HashMap();
  128.  
  129.                     for(int i = 0 ; i < term.length ; ++i){
  130.                         trm.put(term[i] , i);
  131.                     }
  132.                     for(int i = 0 ; i < nonterm.length ; ++i){
  133.                         notrm.put(nonterm[i] , i);
  134.                     }
  135.  
  136.                     LlkContext[] llkTrmContext = testLang.getLlkTrmContext();
  137.  
  138.                     LlkContext[] res_cur = new LlkContext[nonterm.length];
  139.  
  140.                     for (int i = 0; i < nonterm.length; ++i) {
  141.                         res_cur[i] = new LlkContext();
  142.                     }
  143.  
  144.  
  145.                     for(Node node : testLang.getLanguarge()){
  146.                         int[] rool = node.getRoole();
  147.                         int left = notrm.get(rool[0]);
  148.                         if(rool.length == 1){
  149.                             res_cur[left].addWord(new int[0]);
  150.                         }
  151.                     }
  152.  
  153.  
  154.                     ck = true;
  155.                     while(ck){
  156.                         ck = false;
  157.  
  158.                         for(Node node : testLang.getLanguarge()) {
  159.                             int[] rool = node.getRoole();
  160.                             int left = notrm.get(rool[0]);
  161.                             int last = 1;
  162.                             if(rool.length == 1)continue;
  163.  
  164.                             Queue<ArrayList<Integer>> q = new LinkedList<>();
  165.  
  166.                             ArrayList<Integer> temp = new ArrayList<>();
  167.                             temp.add(-1);
  168.  
  169.                             q.add(temp);
  170.  
  171.                             ArrayList<ArrayList<Integer>> done = new ArrayList<>();
  172.  
  173.                             for(; last < rool.length ; ++last){
  174.                                 int cur = rool[last] > 0 ? trm.get(rool[last]) : notrm.get(rool[last]);
  175.                                 LlkContext tmp = rool[last] > 0 ? llkTrmContext[cur] : res_cur[cur];
  176.                                 if(rool[last] < 0 && res_cur[cur].calcWords() == 0)break;
  177.                                 boolean cont = false;
  178.                                 while(!q.isEmpty()){
  179.                                     ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  180.                                     if(word.get(0) == last){
  181.                                         cont = true;
  182.                                         break;
  183.                                     }
  184.                                     q.poll();
  185.                                     for(int i = 0 ; i < tmp.calcWords() ; ++i){
  186.  
  187.                                         ArrayList<Integer> word1 = (ArrayList<Integer>)word.clone();
  188.  
  189.                                         word1.set(0 , last);
  190.                                         for(int j = 0 ; j < tmp.getWord(i).length ; ++j){
  191.  
  192.                                             word1.add(tmp.getWord(i)[j]);
  193.                                         }
  194.                                         if(word1.size() - 1 >= testLang.getLlkConst()){
  195.                                             done.add(word1);
  196.                                         }else{
  197.                                             q.add(word1);
  198.                                         }
  199.                                     }
  200.                                 }
  201.                                 if(cont)continue;
  202.                                 break;
  203.                             }
  204.  
  205.                             while(last == rool.length && !q.isEmpty()){
  206.                                 ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  207.                                 q.poll();
  208.                                 done.add(word);
  209.                             }
  210.  
  211.                             for(int i = 0 ; i < done.size() ; ++i){
  212.                                 int word[] = new int[Math.min(done.get(i).size() - 1 , testLang.getLlkConst())];
  213.                                 for(int j = 0 ; j < word.length ; ++j){
  214.                                     word[j] = done.get(i).get(j + 1);
  215.                                 }
  216.                                 ck |= (res_cur[left].addWord(word));
  217.                             }
  218.                         }
  219.                     }
  220.  
  221.                     testLang.setFirstK(res_cur);
  222.                     testLang.printFirstkContext();
  223.  
  224.                     break;
  225.                 case 3:  // Надрукувати граматику
  226.                     testLang.printGramma();
  227.                     break;
  228.                 case 4:  // надрукувати список терміналів та нетерміналів
  229.                     testLang.printTerminals();
  230.                     testLang.printNonterminals();
  231.                     result=true;
  232.                     break;
  233.                 case 5: // вивести непродуктивні правила
  234.                     result=testLang.createNonProdRools();
  235.                     break;
  236.                 case 6: // недосяжні нетермінали
  237.                     result=testLang.createNonDosNeterminals();
  238.                     break;
  239.                 case 7:  //Побудова списку епсілон-нетерміналів
  240.                     int [] epsilon=testLang.createEpsilonNonterminals ();
  241.                     testLang.setEpsilonNonterminals (epsilon);
  242.                     result=true;
  243.                     break;
  244.                 case 8: //Друк списку епсілон-нетерміналів
  245.                     testLang.printEpsilonNonterminals();
  246.                     break;
  247.                 case 9:    //Пошук ліворекурсивних нетерміналів"
  248.                     testLang.leftRecursNonnerminal();
  249.                     break;
  250.                 case 10:  //Пошук різних ліворекурсивних виводів мінімальної довжини"
  251.                     testLang.leftRecusionTrace();
  252.                     break;
  253.                 case 11:  //Пошук праворекурсивних нетерміналів"
  254.                     testLang.rightRecursNonnerminal();
  255.                     break;
  256.                 case 12:  //Пошук різних праворекурсивних виводів мінімальної довжини"
  257.                     testLang.rigthRecusionTrace();
  258.                     break;
  259.                 case 13:  //Побудувати множини FirstK
  260.                //     JavaTeacherLib.LlkContext[] firstContext //;= testLang.firstK();
  261.  
  262.                     testLang.setFirstK(testLang.firstK());
  263.                     result=true;
  264.                     break;
  265.                 case 14:  //Друк множини FirstK
  266.  
  267.                     testLang.printFirstkContext ( );
  268.                     break;
  269.                 case 15:  //Побудувати множини FollowK
  270.                     JavaTeacherLib.LlkContext[] followContext = testLang.followK();
  271.                     testLang.setFollowK(followContext);
  272.                     result=true;
  273.                     break;
  274.                 case 16:  //Друк множини FollowK
  275.                     testLang.printFollowkContext ( );
  276.                     break;
  277.                 case 17:  //Побудувати множини FirstK(w) + FollowK(A) для правила А->w
  278.                     testLang.firstFollowK ( );
  279.                     result=true;
  280.                     break;
  281.                 case 18:  //Друк множини FirstK(w) + FollowK(A) для правила А->w
  282.                     testLang.printFirstFollowK( );
  283.                     break;
  284.                 case 19:  //Друк множини FirstK(w) + FollowK(A) для вибраних правил А->w
  285.                     testLang.printFirstFollowForRoole();
  286.                     break;
  287.                 case 20:  //Перевірка сильної LL(k)-властивості",
  288.                     result=testLang. strongLlkCondition () ;
  289.                     break;
  290.                 case 21:  //Побудова таблиці LL(1)-синтаксичного аналізатора
  291.                     int [][] uprTable=testLang.createUprTable ();
  292.                     testLang.setUprTable(uprTable);
  293.                     break;
  294.                 case 22: // PASCAL
  295.                     break;
  296.  
  297.                 case 23: // 23. Побудувати множини LocalK(A), A-нетермінал
  298.                     LinkedList<JavaTeacherLib.LlkContext>[] Localk=testLang.createLocalK();
  299.                     testLang.setLocalkContext(Localk);
  300.                     result=true;
  301.                     break;
  302.                 case 24: // 24. Вивести на термінал множини LocalK(A), A-нетермінал
  303.                     testLang.printLocalk();
  304.                     break;
  305.                 case 25: // 25. Перевірка LL(k)-властивості, k>1
  306.                     result= testLang.llkCondition();
  307.                     break;
  308.                 case 26: // rtrtrtr
  309.                     return;
  310.                 case 27:
  311.                     break;
  312.             }  // кінець switch
  313.             // блокуємо елемент обробки
  314.             if (result) // функція виконана успішно
  315.                 if (menu [codeAction-1].substring(0, 1).equals("*"))
  316.                     menu [codeAction-1]=menu [codeAction-1].replace('*', '+') ;
  317.         } while (true);  //глобальний цикл  обробки
  318.  
  319.     }  // кінець main
  320.  
  321.     static void tesrReadWrite(String fname)
  322.     {  String readline;
  323.         BufferedReader s;
  324.         BufferedWriter bw;
  325.         try {
  326.             s = new BufferedReader(new FileReader(fname));
  327.             bw = new BufferedWriter (new FileWriter("c:\\rez.txt"));
  328.             // s=new FileInputStream (fname);
  329.             //s=new FileInputStream ("C:\\Eclipse\\C1.txt");
  330.             //s=new FileInputStream ("C:\\test1.txt");
  331.             while ( s.ready() ) {
  332.                 readline= s.readLine();
  333.                 System.out.println(readline);
  334.                 //System.out.println("Read Line");
  335.                 //bw.write(readline, 0,readline.length() );
  336.                 //bw.write((int)'\r'); bw.flush();
  337.                 //System.out.println("Print Line");
  338.             }
  339.  
  340.             //bw.close();
  341.         }
  342.         catch(Exception ee)
  343.         {
  344.             System.out.print("File: " +fname + "not found\n");
  345.             //return;
  346.         }
  347.     }
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement