Advertisement
osipyonok

Ira sp lab1 s2

Mar 9th, 2017
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 21.81 KB | None | 0 0
  1. /**
  2.  * Created by max on 09.04.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. public class SysProgrammingMainAlgorithm {
  15.  
  16.     static public LinkedList<Node> language = new LinkedList();
  17.     static public LinkedList<TableNode> lexemaTable = new LinkedList();
  18.  
  19.     static public int getLexemaCode(String lexema, int lexemaClass) {
  20.         for(TableNode node : lexemaTable) {
  21.             if(node.getLexemaText().equals(lexema))
  22.                 return node.getLexemaCode();
  23.         }
  24.         return 0;
  25.     }
  26.  
  27.     static public String getLexemaText(int code) {
  28.         for(TableNode node : lexemaTable) {
  29.             if(node.getLexemaCode() == code)
  30.                 return node.getLexemaText();
  31.         }
  32.         return null;
  33.     }
  34.  
  35.     public static void printlang(){
  36.         int cnt = 1;
  37.         for (Node tmp : language) {
  38.             int rule[] = tmp.getRoole();
  39.             System.out.print("" + cnt + " ");
  40.             ++cnt;
  41.             for (int i = 0; i < rule.length; ++i) {
  42.                 if (i == 1) {
  43.                     System.out.print(" -> ");
  44.                 }
  45.                 System.out.print(getLexemaText(rule[i]) + " ");
  46.                 if (rule.length != 1) continue;
  47.                 System.out.print(" -> ");
  48.             }
  49.             System.out.println();
  50.         }
  51.     }
  52.  
  53.     public static void main(String[] args) {
  54.         byte [] readline=new byte [80];
  55.         boolean result;
  56.         String fileName;
  57.         MyLang testLang=null;
  58.         int codeAction, llk=1, textLen;
  59.         String [] menu= { "*1.  Прочитати граматику з файла  ",
  60.                 " 2.  Лабораторна робота. Клас будує студент",
  61.                 " 3.  Надрукувати граматику",
  62.                 "*4.  Побудувати списки терміналів та нетерміналів",
  63.                 "*5.  Пошук непродуктивних нетерміналів",
  64.                 "*6.  Пошук недосяжних нетерміналів",
  65.                 "*7.  Побудова списку епсілон-нетерміналів",
  66.                 " 8.  Друк списку епсілон-нетерміналів",
  67.                 " 9.  Пошук ліворекурсивних нетерміналів",
  68.                 " 10. Пошук різних ліворекурсивних виводів мінімальної довжини",
  69.                 " 11. Пошук праворекурсивних нетерміналів",
  70.                 " 12. Пошук різних праворекурсивних виводів мінімальної довжини",
  71.                 "*13. Побудувати множини FirstK(A), A-нетермінал",
  72.                 " 14. Вивести на термінал множини FirstK(A), A-нетермінал",
  73.                 "*15. Побудувати множини FollowK(A), A-нетермінал",
  74.                 " 16. Вивести на термінал множини FollowK(A), A-нетермінал",
  75.                 "*17. Побудувати множини FirstK(w) + FollowK(A) для правила А->w",
  76.                 " 18. Вивести на термінал FirstK(w) + FollowK(A) для всіх правил А->w",
  77.                 " 19. Вивести на термінал FirstK(w) + FollowK(A) для вибраних правил А->w",
  78.                 "*20. Перевірка сильної LL(1)-властивості",
  79.                 " 21. Побудова таблиці LL(1)-синтаксичного аналізатора",
  80.                 " 22. Синтаксичний аналізатор. Клас будує студент",
  81.                 "*23. Побудувати множини LocalK(A), A-нетермінал",
  82.                 " 24. Вивести на термінал множини LocalK(A), A-нетермінал",
  83.                 "*25. Перевірка LL(k)-властивості, k>1",
  84.                 " 26. Вихід з системи"
  85.         };
  86.         do  {
  87.             codeAction=0;
  88.             String upr;
  89.             for (String ss: menu) System.out.println(ss); // вивести меню
  90.             System.out.println("Введіть код дії або end:");
  91.             do {  // цикл перебору даних
  92.                 try {
  93.                     textLen=System.in.read(readline);
  94.                     upr = new String (readline,0,textLen, "ISO-8859-1");
  95.                     if (upr.trim().equals("end") ) return;
  96.                     codeAction=new Integer (upr.trim());
  97.                 }
  98.                 catch(Exception ee)
  99.                 { System.out.println ("Невірний код дії, повторіть: ");
  100.                     continue;
  101.                 }
  102.                 if (codeAction >=1  &&  codeAction<=menu.length ) {
  103.                     if (menu [codeAction-1].substring(0, 1).equals("+"))  {
  104.                         System.out.println("Елемент меню " +codeAction+" повторно виконати неможливо");
  105.                         continue ;
  106.                     }
  107.                     int itmp;
  108.                     for (itmp=0; itmp < codeAction-1; itmp++)
  109.                         if (menu[itmp].substring(0, 1).equals("*")) break;
  110.                     if (itmp !=codeAction-1) {
  111.                         System.out.println ("Виконайте попередні елементи меню, що позначені * : ");
  112.                         continue ;
  113.                     }
  114.                     break;
  115.                 }
  116.                 else {
  117.                     System.out.println ("Невірний код дії, повторіть: ");
  118.                     continue ;
  119.                 }
  120.             }  while (true);
  121.             // перевірка на виконання усіх попередніх дій
  122.             result=false;
  123.             switch (codeAction) {
  124.                 case 1: //1. Прочитати граматику з файла",
  125.  
  126.                     System.out.print ("Введіть ім'я файлу граматики:");
  127.                     try{
  128.                         textLen=System.in.read(readline);
  129.                         fileName = new String (readline,0,textLen, "ISO-8859-1");
  130.                         fileName = fileName.trim();
  131.                     }
  132.                     catch(Exception e){
  133.                         System.out.println ("Помилка: " + e.toString());
  134.                         break;
  135.                     }
  136.  
  137.                     BufferedReader s;
  138.                     final int maxn = 256;
  139.                     final int nterm = 0x80000000;
  140.                     final int term = 0x10000000;
  141.                     char[] lex = new char[maxn];
  142.                     int[] rule = new int[maxn];
  143.                     try {
  144.                         s = new BufferedReader(new FileReader(fileName));
  145.                     }
  146.                     catch (FileNotFoundException ee) {
  147.                         System.out.print("Файл не найден");
  148.                         return;
  149.                     }
  150.  
  151.                     Arrays.fill(lex , (char)0);
  152.                     Arrays.fill(rule ,  0);
  153.  
  154.                     int act = 0; // 0 - хз , 1 - читаем нетерминал , 2 - читаем терминал , 3 - читаем экранированный символ
  155.  
  156.                     String line = null;
  157.                     int cur_rule = 0;
  158.                     int len = 0;
  159.                     int read_pos = 0;
  160.                     int pos = 0;
  161.  
  162.                     try{
  163.                         while(s.ready()){
  164.                             if (line == null || read_pos >= len) {
  165.                                 line = s.readLine();
  166.                                 if (line.length() > 0 && line.charAt(0) == 65279) {
  167.                                     line = line.substring(1);
  168.                                 }
  169.                                 len = line.length();
  170.                             }
  171.                             for(read_pos = 0 ; read_pos < len ; ++read_pos){
  172.                                 char cur = line.charAt(read_pos);
  173.                                 if(act == 0){
  174.                                     String ck = " \t\n\n\b";
  175.                                     if(ck.indexOf(cur) != -1)continue;
  176.                                     if(read_pos == 0 && cur_rule > 0 && (cur == '#' || cur == '!')){
  177.                                         Node node = new Node(rule , cur_rule);
  178.                                         language.add(node);
  179.                                         if(cur == '!'){
  180.                                             cur_rule = 1;
  181.                                             continue;
  182.                                         }else{
  183.                                             cur_rule = 0;
  184.                                         }
  185.                                     }
  186.                                     lex[0] = cur;
  187.                                     pos = 1;
  188.                                     if(cur == '#'){
  189.                                         act = 1;
  190.                                     }else if(cur == '\\'){
  191.                                         act = 3;
  192.                                         --pos;
  193.                                     }else{
  194.                                         act = 2;
  195.                                     }
  196.                                     continue;
  197.                                 }
  198.                                 if(act == 1){
  199.                                     lex[pos] = cur;
  200.                                     ++pos;
  201.                                     if(read_pos != 0 && cur != '#')continue;
  202.                                     String str = new String(lex , 0, pos);
  203.                                     TableNode tnode = new TableNode(str, nterm);
  204.                                     boolean find = false;
  205.                                     for(TableNode tn : lexemaTable){
  206.                                         if(tn.equals(tnode)){
  207.                                             find = true;
  208.                                             break;
  209.                                         }
  210.                                     }
  211.                                     if(!find){
  212.                                         lexemaTable.add(tnode);
  213.                                     }
  214.                                     int code = getLexemaCode(str, nterm);
  215.                                     rule[cur_rule] = code;
  216.                                     ++cur_rule;
  217.                                     pos = act = 0;
  218.                                     continue;
  219.                                 }
  220.                                 if(act == 2){
  221.                                     if(cur == '\\'){
  222.                                         act = 3;
  223.                                         --pos;
  224.                                         continue;
  225.                                     }
  226.                                     String ck = " #\t\r";
  227.                                     if(ck.indexOf(cur) != -1 || read_pos == 0){
  228.                                         String str = new String(lex , 0, pos);
  229.                                         TableNode tnode = new TableNode(str ,  term);
  230.                                         boolean find = false;
  231.                                         for(TableNode tn : lexemaTable){
  232.                                             if(tn.equals(tnode)){
  233.                                                 find = true;
  234.                                                 break;
  235.                                             }
  236.                                         }
  237.                                         if(!find){
  238.                                             lexemaTable.add(tnode);
  239.                                         }
  240.                                         int code = getLexemaCode(str , term);
  241.                                         rule[cur_rule] = code;
  242.                                         ++cur_rule;
  243.                                         pos = act = 0;
  244.                                         --read_pos;
  245.                                     }else{
  246.                                         lex[pos] = cur;
  247.                                         ++pos;
  248.                                     }
  249.                                     continue;
  250.                                 }
  251.                                 if(act == 3){
  252.                                     act = 2;
  253.                                     lex[pos] = cur;
  254.                                     ++pos;
  255.                                     continue;
  256.                                 }
  257.  
  258.                             }
  259.                         }
  260.                         if(pos > 0){
  261.                             String str = new String(lex , 0, pos);
  262.                             TableNode tnode = new TableNode(str , act == 1 ? nterm : term);
  263.                             boolean find = false;
  264.                             for(TableNode tn : lexemaTable){
  265.                                 if(tn.equals(tnode)){
  266.                                     find = true;
  267.                                     break;
  268.                                 }
  269.                             }
  270.                             if(!find){
  271.                                 lexemaTable.add(tnode);
  272.                             }
  273.                             int code = getLexemaCode(str , act == 1 ? nterm : term);
  274.                             rule[cur_rule] = code;
  275.                             ++cur_rule;
  276.                         }
  277.                         if (cur_rule > 0) {
  278.                             Node node = new Node(rule, cur_rule);
  279.                             language.add(node);
  280.                         }
  281.                     }catch(Exception e){}
  282.                     printlang();
  283.                     break;
  284.                 case 2: //2. Лабораторна робота студента
  285.                     System.out.print ("Введіть ім'я файлу граматики:");
  286.                     try {
  287.                         textLen=System.in.read(readline);
  288.                         fileName = new String (readline,0,textLen, "ISO-8859-1");
  289.                         fileName = fileName.trim();
  290.                     }
  291.                     catch(Exception ee)
  292.                     { System.out.println ("Системна помилка: "+ee.toString());
  293.                         return;
  294.                     }
  295.                     System.out.print ("Введіть значення параметра k : ");
  296.                     try {
  297.                         textLen=System.in.read(readline);
  298.                         String llkText = new String (readline,0,textLen, "ISO-8859-1");
  299.                         llkText = llkText.trim();
  300.                         llk=Integer.parseInt(llkText);
  301.                     }
  302.                     catch(Exception ee)
  303.                     { System.out.println ("Системна помилка: "+ee.toString());
  304.                         return;
  305.                     }
  306.                     testLang = new MyLang (fileName,llk);
  307.                     if (!testLang.isCreate()) break;  //не створили об'єкт
  308.                     System.out.println ("Граматика прочитана успішно");
  309.                     result=true;
  310.                     for (int jj=0;  jj<menu.length; jj++) {
  311.                         if (menu [jj].substring(0, 1).equals(" ")) continue;
  312.                         menu [jj]=menu [jj].replace(menu [jj].charAt(0), '*') ;
  313.                     }
  314.                     break;
  315.                 case 3:  // Надрукувати граматику
  316.                     testLang.printGramma();
  317.                     break;
  318.                 case 4:  // надрукувати список терміналів та нетерміналів
  319.                     testLang.printTerminals();
  320.                     testLang.printNonterminals();
  321.                     result=true;
  322.                     break;
  323.                 case 5: // вивести непродуктивні правила
  324.                     result=testLang.createNonProdRools();
  325.                     break;
  326.                 case 6: // недосяжні нетермінали
  327.                     result=testLang.createNonDosNeterminals();
  328.                     break;
  329.                 case 7:  //Побудова списку епсілон-нетерміналів
  330.                     int [] epsilon=testLang.createEpsilonNonterminals ();
  331.                     testLang.setEpsilonNonterminals (epsilon);
  332.                     result=true;
  333.                     break;
  334.                 case 8: //Друк списку епсілон-нетерміналів
  335.                     testLang.printEpsilonNonterminals();
  336.                     break;
  337.                 case 9:    //Пошук ліворекурсивних нетерміналів"
  338.                     testLang.leftRecursNonnerminal();
  339.                     break;
  340.                 case 10:  //Пошук різних ліворекурсивних виводів мінімальної довжини"
  341.                     testLang.leftRecusionTrace();
  342.                     break;
  343.                 case 11:  //Пошук праворекурсивних нетерміналів"
  344.                     testLang.rightRecursNonnerminal();
  345.                     break;
  346.                 case 12:  //Пошук різних праворекурсивних виводів мінімальної довжини"
  347.                     testLang.rigthRecusionTrace();
  348.                     break;
  349.                 case 13:  //Побудувати множини FirstK
  350.                     JavaTeacherLib.LlkContext[] firstContext = testLang.firstK();
  351.                     testLang.setFirstK(firstContext);
  352.                     result=true;
  353.                     break;
  354.                 case 14:  //Друк множини FirstK
  355.                     testLang.printFirstkContext ( );
  356.                     break;
  357.                 case 15:  //Побудувати множини FollowK
  358.                     JavaTeacherLib.LlkContext[] followContext = testLang.followK();
  359.                     testLang.setFollowK(followContext);
  360.                     result=true;
  361.                     break;
  362.                 case 16:  //Друк множини FollowK
  363.                     testLang.printFollowkContext ( );
  364.                     break;
  365.                 case 17:  //Побудувати множини FirstK(w) + FollowK(A) для правила А->w
  366.                     testLang.firstFollowK ( );
  367.                     result=true;
  368.                     break;
  369.                 case 18:  //Друк множини FirstK(w) + FollowK(A) для правила А->w
  370.                     testLang.printFirstFollowK( );
  371.                     break;
  372.                 case 19:  //Друк множини FirstK(w) + FollowK(A) для вибраних правил А->w
  373.                     testLang.printFirstFollowForRoole();
  374.                     break;
  375.                 case 20:  //Перевірка сильної LL(k)-властивості",
  376.                     result=testLang. strongLlkCondition () ;
  377.                     break;
  378.                 case 21:  //Побудова таблиці LL(1)-синтаксичного аналізатора
  379.                     int [][] uprTable=testLang.createUprTable ();
  380.                     testLang.setUprTable(uprTable);
  381.                     break;
  382.                 case 22: // PASCAL
  383.                     break;
  384.  
  385.                 case 23: // 23. Побудувати множини LocalK(A), A-нетермінал
  386.                     LinkedList<JavaTeacherLib.LlkContext>[] Localk=testLang.createLocalK();
  387.                     testLang.setLocalkContext(Localk);
  388.                     result=true;
  389.                     break;
  390.                 case 24: // 24. Вивести на термінал множини LocalK(A), A-нетермінал
  391.                     testLang.printLocalk();
  392.                     break;
  393.                 case 25: // 25. Перевірка LL(k)-властивості, k>1
  394.                     result= testLang.llkCondition();
  395.                     break;
  396.                 case 26: // rtrtrtr
  397.                     return;
  398.                 case 27:
  399.                     break;
  400.             }  // кінець switch
  401.             // блокуємо елемент обробки
  402.             if (result) // функція виконана успішно
  403.                 if (menu [codeAction-1].substring(0, 1).equals("*"))
  404.                     menu [codeAction-1]=menu [codeAction-1].replace('*', '+') ;
  405.         } while (true);  //глобальний цикл  обробки
  406.  
  407.     }  // кінець main
  408.  
  409.     static void tesrReadWrite(String fname)
  410.     {  String readline;
  411.         BufferedReader s;
  412.         BufferedWriter bw;
  413.         try {
  414.             s = new BufferedReader(new FileReader(fname));
  415.             bw = new BufferedWriter (new FileWriter("c:\\rez.txt"));
  416.             // s=new FileInputStream (fname);
  417.             //s=new FileInputStream ("C:\\Eclipse\\C1.txt");
  418.             //s=new FileInputStream ("C:\\test1.txt");
  419.             while ( s.ready() ) {
  420.                 readline= s.readLine();
  421.                 System.out.println(readline);
  422.                 //System.out.println("Read Line");
  423.                 //bw.write(readline, 0,readline.length() );
  424.                 //bw.write((int)'\r'); bw.flush();
  425.                 //System.out.println("Print Line");
  426.             }
  427.  
  428.             //bw.close();
  429.         }
  430.         catch(Exception ee)
  431.         {
  432.             System.out.print("File: " +fname + "not found\n");
  433.             //return;
  434.         }
  435.     }
  436. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement