Advertisement
osipyonok

SP lab1 s2 full

Mar 8th, 2017
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.07 KB | None | 0 0
  1. import java.lang.*;
  2. import java.util.*;
  3. import java.io.*;
  4. import java.nio.charset.Charset;
  5. import JavaTeacherLib.*;
  6.  
  7. public class SysProgrammingMainAlgorithm {
  8.  
  9.      public static void main(String[] args) {
  10.           byte [] readline=new byte [80];
  11.           boolean result;
  12.           String fileName;
  13.           MyLang testLang=null;
  14.           int codeAction, llk=1, textLen;
  15.           String [] menu= { "*1.  Прочитати граматику з файла  ",
  16.                             " 2.  Лабораторна робота. Клас будує студент",
  17.                             " 3.  Надрукувати граматику",
  18.                             "*4.  Побудувати списки терміналів та нетерміналів",
  19.                             "*5.  Пошук непродуктивних нетерміналів",
  20.                             "*6.  Пошук недосяжних нетерміналів",
  21.                             "*7.  Побудова списку епсілон-нетерміналів",
  22.                             " 8.  Друк списку епсілон-нетерміналів",
  23.                             " 9.  Пошук ліворекурсивних нетерміналів",
  24.                             " 10. Пошук різних ліворекурсивних виводів мінімальної довжини",
  25.                             " 11. Пошук праворекурсивних нетерміналів",
  26.                             " 12. Пошук різних праворекурсивних виводів мінімальної довжини",
  27.                             "*13. Побудувати множини FirstK(A), A-нетермінал",
  28.                             " 14. Вивести на термінал множини FirstK(A), A-нетермінал",
  29.                             "*15. Побудувати множини FollowK(A), A-нетермінал",
  30.                             " 16. Вивести на термінал множини FollowK(A), A-нетермінал",
  31.                             "*17. Побудувати множини FirstK(w) + FollowK(A) для правила А->w",
  32.                             " 18. Вивести на термінал FirstK(w) + FollowK(A) для всіх правил А->w",
  33.                             " 19. Вивести на термінал FirstK(w) + FollowK(A) для вибраних правил А->w",
  34.                             "*20. Перевірка сильної LL(1)-властивості",
  35.                             " 21. Побудова таблиці LL(1)-синтаксичного аналізатора",
  36.                             " 22. Синтаксичний аналізатор. Клас будує студент",
  37.                             "*23. Побудувати множини LocalK(A), A-нетермінал",
  38.                             " 24. Вивести на термінал множини LocalK(A), A-нетермінал",
  39.                             "*25. Перевірка LL(k)-властивості, k>1",
  40.                             " 26. Вихід з системи"
  41.                           };
  42.         do  {
  43.            codeAction=0;
  44.            String upr;
  45.           for (String ss: menu) System.out.println(ss); // вивести меню
  46.           System.out.println("Введіть код дії або end:");
  47.          do {  // цикл перебору даних
  48.            try {
  49.             textLen=System.in.read(readline);
  50.             upr = new String (readline,0,textLen, "ISO-8859-1");
  51.             if (upr.trim().equals("end") ) return;
  52.             codeAction=new Integer (upr.trim());
  53.               }
  54.            catch(Exception ee)
  55.                 { System.out.println ("Невірний код дії, повторіть: ");
  56.                  continue;
  57.                 }
  58.            if (codeAction >=1  &&  codeAction<=menu.length ) {
  59.                if (menu [codeAction-1].substring(0, 1).equals("+"))  {
  60.                 System.out.println("Елемент меню " +codeAction+" повторно виконати неможливо");
  61.                 continue ;
  62.                 }
  63.                int itmp;
  64.                for (itmp=0; itmp < codeAction-1; itmp++)
  65.                    if (menu[itmp].substring(0, 1).equals("*")) break;
  66.                if (itmp !=codeAction-1) {
  67.                    System.out.println ("Виконайте попередні елементи меню, що позначені * : ");
  68.                    continue ;
  69.                   }  
  70.                break;
  71.               }
  72.               else {
  73.                 System.out.println ("Невірний код дії, повторіть: ");
  74.                 continue ;
  75.                }
  76.          }  while (true);
  77.          // перевірка на виконання усіх попередніх дій
  78.          result=false;
  79.            switch (codeAction) {
  80.                 case 1: //1. Прочитати граматику з файла",
  81.                     System.out.print ("Введіть ім'я файлу граматики:");
  82.                      try {
  83.                         textLen=System.in.read(readline);
  84.                         fileName = new String (readline,0,textLen, "ISO-8859-1");
  85.                         fileName = fileName.trim();
  86.                          }
  87.                        catch(Exception ee)
  88.                             { System.out.println ("Системна помилка: "+ee.toString());
  89.                               return;
  90.                             }
  91.                     System.out.print ("Введіть значення параметра k : ");
  92.                     try {
  93.                         textLen=System.in.read(readline);
  94.                         String llkText = new String (readline,0,textLen, "ISO-8859-1");
  95.                         llkText = llkText.trim();
  96.                         llk=Integer.parseInt(llkText);
  97.                          }
  98.                        catch(Exception ee)
  99.                             { System.out.println ("Системна помилка: "+ee.toString());
  100.                               return;
  101.                             }
  102.                     testLang = new MyLang (fileName,llk);
  103.                     if (!testLang.isCreate()) break;  //не створили об'єкт
  104.                     System.out.println ("Граматика прочитана успішно");
  105.                     result=true;
  106.                     for (int jj=0;  jj<menu.length; jj++) {
  107.                        if (menu [jj].substring(0, 1).equals(" ")) continue;
  108.                        menu [jj]=menu [jj].replace(menu [jj].charAt(0), '*') ;  
  109.                       }
  110.                        break;
  111.                 case 2: //2. Лабораторна робота студента
  112.                     int n = testLang.getNonTerminals().length;
  113.                     Set<Integer> eps = new HashSet(Arrays.asList(testLang.getEpsilonNonterminals()));
  114.                     Map<Integer , Integer> ntrm = new HashMap();
  115.                     for(int i = 0 ; i < n ; ++i){
  116.                         ntrm.put(testLang.getNonTerminals()[i], i);
  117.                     }
  118.                     int[][] w = new int [n][n];
  119.                    
  120.                     for (JavaTeacherLib.Node node : testLang.getLanguarge()){
  121.                         int[] rule = node.getRoole();
  122.                         int i = ntrm.get(rule[0]);
  123.                         for(int j = rule.length - 1 ; j > 0 ; --j){
  124.                             boolean is_eps = eps.contains(rule[j]);
  125.                             if(ntrm.containsKey(rule[j])){
  126.                                 int cur = ntrm.get(rule[j]);
  127.                                 w[i][cur] = 1;
  128.                                 if(is_eps)continue;
  129.                             }
  130.                             break;
  131.                         }
  132.                     }
  133.                    
  134.                     for(int k = 0 ; k < n ; ++k)
  135.                         for(int i = 0 ; i < n ; ++i)
  136.                             for(int j = 0 ; j < n ; ++j)
  137.                                 if(w[i][k] + w[k][j] == 2)w[i][j] = 1;
  138.  
  139.                     boolean ck = false;
  140.                     for(int i = 0 ; i < n ; ++i){
  141.                         if(w[i][i] == 1){
  142.                             System.out.println(testLang.getLexemaText(testLang.getNonTerminals()[i]) + " - праворекурсивний нетермiнал");
  143.                             ck = true;
  144.                         }
  145.                     }
  146.                     if(!ck)System.out.println("В граматицi вiдсутнi праворекурсивнi нетермiнали");
  147.                     break;
  148.                 case 3:  // Надрукувати граматику
  149.                      testLang.printGramma();
  150.                      break;
  151.                 case 4:  // надрукувати список терміналів та нетерміналів
  152.                      testLang.printTerminals();
  153.                      testLang.printNonterminals();
  154.                      result=true;
  155.                     break;
  156.                 case 5: // вивести непродуктивні правила
  157.                      result=testLang.createNonProdRools();
  158.                      break;
  159.                 case 6: // недосяжні нетермінали
  160.                     result=testLang.createNonDosNeterminals();
  161.                      break;
  162.                  case 7:  //Побудова списку епсілон-нетерміналів
  163.                       int [] epsilon=testLang.createEpsilonNonterminals ();
  164.                       testLang.setEpsilonNonterminals (epsilon);
  165.                       result=true;
  166.                      break;
  167.                  case 8: //Друк списку епсілон-нетерміналів
  168.                       testLang.printEpsilonNonterminals();
  169.                      break;
  170.                  case 9:    //Пошук ліворекурсивних нетерміналів"
  171.                      testLang.leftRecursNonnerminal();
  172.                       break;
  173.                    case 10:  //Пошук різних ліворекурсивних виводів мінімальної довжини"
  174.                        testLang.leftRecusionTrace();
  175.                        break;
  176.                    case 11:  //Пошук праворекурсивних нетерміналів"
  177.                        testLang.rightRecursNonnerminal();
  178.                        break;
  179.                    case 12:  //Пошук різних праворекурсивних виводів мінімальної довжини"
  180.                       testLang.rigthRecusionTrace();
  181.                        break;
  182.                    case 13:  //Побудувати множини FirstK
  183.                        JavaTeacherLib.LlkContext[] firstContext = testLang.firstK();
  184.                        testLang.setFirstK(firstContext);
  185.                        result=true;
  186.                        break;
  187.                    case 14:  //Друк множини FirstK
  188.                        testLang.printFirstkContext ( );
  189.                        break;
  190.                    case 15:  //Побудувати множини FollowK
  191.                        JavaTeacherLib.LlkContext[] followContext = testLang.followK();
  192.                        testLang.setFollowK(followContext);
  193.                        result=true;
  194.                        break;
  195.                  case 16:  //Друк множини FollowK
  196.                        testLang.printFollowkContext ( );
  197.                        break;
  198.                  case 17:  //Побудувати множини FirstK(w) + FollowK(A) для правила А->w
  199.                        testLang.firstFollowK ( );
  200.                        result=true;
  201.                        break;
  202.                   case 18:  //Друк множини FirstK(w) + FollowK(A) для правила А->w
  203.                        testLang.printFirstFollowK( );
  204.                        break;
  205.                   case 19:  //Друк множини FirstK(w) + FollowK(A) для вибраних правил А->w
  206.                        testLang.printFirstFollowForRoole();
  207.                        break;
  208.                  case 20:  //Перевірка сильної LL(k)-властивості",
  209.                      result=testLang. strongLlkCondition () ;
  210.                         break;    
  211.                 case 21:  //Побудова таблиці LL(1)-синтаксичного аналізатора
  212.                        int [][] uprTable=testLang.createUprTable ();
  213.                         testLang.setUprTable(uprTable);
  214.                        break;
  215.                  case 22: // PASCAL
  216.                     break;
  217.                    
  218.                  case 23: // 23. Побудувати множини LocalK(A), A-нетермінал
  219.                     LinkedList<JavaTeacherLib.LlkContext>[] Localk=testLang.createLocalK();
  220.                     testLang.setLocalkContext(Localk);
  221.                     result=true;
  222.                     break;
  223.                  case 24: // 24. Вивести на термінал множини LocalK(A), A-нетермінал
  224.                        testLang.printLocalk();
  225.                        break;
  226.                  case 25: // 25. Перевірка LL(k)-властивості, k>1
  227.                     result= testLang.llkCondition();
  228.                      break;
  229.                  case 26: // rtrtrtr  
  230.                      return;
  231.                  case 27:
  232.                      break;
  233.                  }  // кінець switch
  234.            // блокуємо елемент обробки
  235.            if (result) // функція виконана успішно
  236.                if (menu [codeAction-1].substring(0, 1).equals("*"))
  237.                      menu [codeAction-1]=menu [codeAction-1].replace('*', '+') ;
  238.        } while (true);  //глобальний цикл  обробки
  239.                  
  240.      }  // кінець main
  241.      
  242.      static void tesrReadWrite(String fname)
  243.     {  String readline;
  244.         BufferedReader s;
  245.         BufferedWriter bw;
  246.         try {
  247.         s = new BufferedReader(new FileReader(fname));
  248.         bw = new BufferedWriter (new FileWriter("c:\\rez.txt"));
  249.       // s=new FileInputStream (fname);
  250.         //s=new FileInputStream ("C:\\Eclipse\\C1.txt");
  251.         //s=new FileInputStream ("C:\\test1.txt");
  252.         while ( s.ready() ) {
  253.             readline= s.readLine();
  254.             System.out.println(readline);
  255.             //System.out.println("Read Line");
  256.             //bw.write(readline, 0,readline.length() );
  257.             //bw.write((int)'\r'); bw.flush();
  258.             //System.out.println("Print Line");
  259.         }
  260.        
  261.         //bw.close();
  262.         }
  263.         catch(Exception ee)
  264.         {
  265.             System.out.print("File: " +fname + "not found\n");
  266.             //return;  
  267.         }
  268.     }
  269.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement