Advertisement
osipyonok

Untitled

May 26th, 2017
161
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 45.89 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. import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.HeaderTokenizer;
  14.  
  15. import java.io.File;
  16. import java.io.FileInputStream;
  17. import java.io.FileNotFoundException;
  18. import java.io.IOException;
  19. import java.util.regex.*;
  20. /*
  21. enum Tokens {
  22.     Keyword,
  23.     table_name,
  24.     col_name,
  25.     name,
  26.     Atom,
  27.     Int,
  28.     Hex,
  29.     Double,
  30.     Comment,
  31.     String,
  32.     Char,
  33.     Directive,
  34.     Operator,
  35.     Punctuation,
  36.     CONST_NAME,
  37.     DIGIT,
  38.     IDN,
  39.     LITER_STR,
  40.     PROC_NAME,
  41.     FUNC_NAME,
  42.     TYPE_NAME
  43. }
  44. */
  45.  
  46. enum Tokens {
  47.     Keyword,
  48.     Atom,
  49.     Int,
  50.     Hex,
  51.     Double,
  52.     Comment,
  53.     String,
  54.     Char,
  55.     Directive,
  56.     Operator,
  57.     Punctuation,
  58.     CONST_NAME,
  59.     DIGIT,
  60.     IDN,
  61.     LITER_STR,
  62.     PROC_NAME,
  63.     FUNC_NAME,
  64.     TYPE_NAME
  65. }
  66.  
  67. class LexPascal{
  68.     private String path = "";
  69.     private static Map<Tokens , Pattern> regular = new HashMap<Tokens , Pattern>();
  70.     private static Map<Tokens , Integer> priority = new HashMap<Tokens , Integer>();
  71.  
  72.     public LexPascal(String _path){
  73.         path = _path.trim();
  74.         InitRegex();
  75.         InitPriority();
  76.     }
  77.  
  78.     private void InitRegex(){
  79.         regular.put(Tokens.IDN , Pattern.compile("^(_|[a-z])([a-z]|[0-9]|_)*"));
  80.         regular.put(Tokens.Keyword , Pattern.compile("^(uses|program|var|const|type|begin|repeat|until|end|if|then|else|while|do|for|of|record|with|procedure|function|case|in|set|array|nil|true|false)"));
  81.         regular.put(Tokens.DIGIT , Pattern.compile("^(0|[1-9]\\d*)"));
  82.         regular.put(Tokens.LITER_STR, Pattern.compile("^'(?:[^']+|(''))*'$"));
  83.         regular.put(Tokens.Comment, Pattern.compile("^(//(.*?)//|\\{(.*?)\\}|\\(\\*(.*?)\\*\\))"));
  84.         regular.put(Tokens.Punctuation, Pattern.compile("^(\\(|\\)|;|,|\\.|:|\\[|\\]|\\^|\\.\\.)"));
  85. //        regular.put(Tokens.Hex, Pattern.compile("^0[xX]((0|[1-9a-fA-F][\\da-fA-F]*))"));
  86.         regular.put(Tokens.Operator, Pattern.compile("^\\+|\\-|\\*|/|:=|<>|=|>|<|>=|<=|!=|div|mod|and|not|~"));
  87.         regular.put(Tokens.Double, Pattern.compile("^(((0|[1-9]\\d*)?\\.\\d+([eE][+-]?\\d+)?[FfDdMm]?)|((0|[1-9]\\d*)([eE][+-]?\\d+)[FfDdMm]?)|((0|[1-9]\\d*)[FfDdMm]))"));
  88. //        regular.put(Tokens.Directive, Pattern.compile("^mp:.*"));
  89.         regular.put(Tokens.TYPE_NAME , Pattern.compile("^(byte|integer|real|char|boolean|string)"));
  90.      //   regular.put(Tokens.PROC_NAME , Pattern.compile("^(randomize)"));
  91.     }
  92.  
  93.     private void InitPriority(){
  94.         priority.put(Tokens.Operator, 10);
  95.         priority.put(Tokens.Punctuation, 2);
  96.         priority.put(Tokens.Double, 3);
  97.         priority.put(Tokens.DIGIT, 4);
  98.         priority.put(Tokens.Hex, 4);
  99.         priority.put(Tokens.IDN, 5);
  100.         priority.put(Tokens.Keyword, 6);
  101.         priority.put(Tokens.LITER_STR, 7);
  102.         priority.put(Tokens.TYPE_NAME, 8);
  103.         priority.put(Tokens.Comment, 9);
  104.     }
  105.  
  106.     private String Prepare(String text){
  107.         text = text.toLowerCase();
  108.         String code = "";
  109.         boolean ck = false;
  110.  
  111.       //  text = text.replace(";",";;");
  112.         text = text.replace("clrscr;","clrscr();");
  113.         text = text.replace("writeln;","writeln();");
  114.         text = text.replace("write;","write();");
  115.         text = text.replace("readln;","readln();");
  116.         text = text.replace("read;","read();");
  117.         text = text.replace("randomize;","randomize();");
  118.         text = text.replace("function","func");
  119.         text = text.replace("procedure","proc");
  120.         text = text.replace("true","1");
  121.         text = text.replace("false","0");
  122.  
  123.  
  124.         for(int i = 0 ; i < text.length() ; ++i){
  125.             char ch = text.charAt(i);
  126.             String small = "йцукенгшщзхъфывапролджэёячсмитьбю";
  127.             String big = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЁЯЧСМИТЬБЮ";
  128.             if(small.indexOf(ch) != -1 && !ck){
  129.                 code += 'a';
  130.                 ck = true;
  131.             }else if(big.indexOf(ch) != -1 && !ck){
  132.                 code += 'A';
  133.                 ck = true;
  134.             }else if(small.indexOf(ch) == -1 && big.indexOf(ch) == -1){
  135.                 code += ch;
  136.                 ck = false;
  137.             }
  138.         }
  139.         String temp = "";
  140.         boolean add = false;
  141.         int st = 0;
  142.         for(int i = 0 ; i < code.length() ; ++i){
  143.             char ch = code.charAt(i);
  144.             if(st == 0 && ch == '\''){
  145.                 add = false;
  146.                 temp += ch;
  147.                 st = 1;
  148.                 continue;
  149.             }
  150.             if(st == 1 && ch == '\''){
  151.                 st = 0;
  152.                 temp += ch;
  153.                 continue;
  154.             }
  155.             if(st == 1 && ch == '\\'){
  156.                 st = 2;
  157.                 continue;
  158.             }
  159.             if(st == 2){
  160.                 st = 1;
  161.                 continue;
  162.             }
  163.             if(st == 1) {
  164.                 if(add == false){
  165.                     temp += ch;
  166.                     add = true;
  167.                 }
  168.                 continue;
  169.             }
  170.             temp += ch;
  171.         }
  172.         return temp.toLowerCase();
  173.     }
  174.  
  175.     public ArrayList<Map<Tokens , String>> Tokenize() throws Exception{
  176.         int wasbegin = 0;
  177.         Set<String> consts = new HashSet<>();
  178.         String last_key = "";
  179.  
  180.         File file = new File(path);
  181.  
  182.         String text = "";
  183.         try {
  184.             FileInputStream fis = new FileInputStream(new File(path));
  185.             byte[] data = new byte[(int) file.length()];
  186.             fis.read(data);
  187.             fis.close();
  188.             text = new String(data, "UTF-8");
  189.         }catch(FileNotFoundException e){
  190.             System.out.print(path + " File not found");
  191.         }catch(IOException e) {
  192.             e.printStackTrace();
  193.         }
  194.  
  195.         ArrayList<Map<Tokens , String>> ans = new ArrayList<>();
  196.         String code = Prepare(text);
  197.         //    System.out.println(code);
  198.         while(code.length() > 0 && (code.charAt(0) == ' ' || code.charAt(0) == '\n' || code.charAt(0) == '\t'))code = code.substring(1);
  199.         while(code.length() > 0){
  200.             Tokens tokType = Tokens.Comment;
  201.             int len = -1;
  202.             for(Tokens tok : regular.keySet()){
  203.                 Pattern trg = regular.get(tok);
  204.  
  205.                 String tmp = code;
  206.                 for(int j = code.length() ; j > 0 ; --j){
  207.                     Matcher tmat = trg.matcher(tmp);
  208.                     if(tmat.matches()){
  209.                         if(j > len || (j == len && priority.get(tok) > priority.get(tokType))){
  210.                             len = j;
  211.                             tokType = tok;
  212.                             break;
  213.                         }
  214.                     }
  215.                     tmp = tmp.substring(0 , tmp.length() - 1);
  216.                 }
  217.  
  218.  
  219.                 Matcher tmat = trg.matcher(code);
  220.  
  221.                 MatchResult res1 = tmat.toMatchResult();
  222.                 try{
  223.                     System.out.println(res1.end());
  224.                 }catch(java.lang.IllegalStateException e){}
  225.                 if(tmat.matches()){
  226.                     MatchResult res = tmat.toMatchResult();
  227.                     if(res.start() == 0){
  228.                         if(res.end() > len){
  229.                             len = res.end();
  230.                             tokType = tok;
  231.                         }
  232.                     }
  233.                 }
  234.             }
  235.             if(len <= 0){
  236.                 throw new Exception("Unknown lexeme " + code);
  237.             }
  238.  
  239.             if(tokType == Tokens.IDN){
  240.                 if(ans.size() > 0) {
  241.                     for (Tokens tk : ans.get(ans.size() - 1).keySet()) {
  242.                         if (tk == Tokens.Keyword && (ans.get(ans.size() - 1).get(tk).equals("procedure")
  243.                                 || ans.get(ans.size() - 1).get(tk).equals("function"))) {
  244.                             tokType = ans.get(ans.size() - 1).get(tk).equals("function") ? Tokens.FUNC_NAME : Tokens.PROC_NAME;
  245.                         }
  246.                     }
  247.                 }
  248.             }
  249.  
  250.          /*   if(tokType == Tokens.Keyword && code.substring(0 , 2).equals("if")){
  251.                 ++opif;
  252.             }
  253.             if(opif > 0 && tokType == Tokens.Keyword && code.substring(0 , 4).equals("then")){
  254.                 ++opth;
  255.             }*/
  256.             if(wasbegin == 0 && tokType == Tokens.Keyword && code.substring(0 , 5).equals("begin")){
  257.                 ++wasbegin;
  258.             }
  259.             if(tokType == Tokens.Double){
  260.                 tokType = Tokens.DIGIT;
  261.             }
  262.             if(wasbegin > 0 && tokType == Tokens.Punctuation && code.substring(0 , 1).equals("(")){
  263.                 if(ans.size() > 1){
  264.                     for (Tokens tk : ans.get(ans.size() - 1).keySet()) {
  265.                         if(tk == Tokens.IDN){
  266.                             boolean ck = false;
  267.                             String str = "";
  268.                             str = ans.get(ans.size() - 1).get(tk);
  269.  
  270.                             for(Tokens tk2 : ans.get(ans.size() - 2).keySet()){
  271.                                 if(tk2 == Tokens.Operator || (tk2 == Tokens.Punctuation && (",(").contains(ans.get(ans.size() - 2).get(tk2)))){
  272.                                     ck = true;//function
  273.                                 }
  274.                             }
  275.                         //    System.out.println(ck);
  276.                             ans.get(ans.size() - 1).clear();
  277.                             if(ck){
  278.                                 ans.get(ans.size() - 1).put(Tokens.FUNC_NAME , str);
  279.                             }else{
  280.                                 ans.get(ans.size() - 1).put(Tokens.PROC_NAME , str);
  281.                             }
  282.                         }
  283.                     }
  284.                 }
  285.             }
  286.  
  287.             if(tokType == Tokens.Keyword){
  288.                 last_key = code.substring(0 , len);
  289.             }
  290.             if(last_key.equals("const") && tokType == Tokens.IDN){
  291.                 consts.add(code.substring(0 , len));
  292.             //    tokType = Tokens.CONST_NAME;
  293.             }
  294.             if(!last_key.equals("const") && tokType == Tokens.IDN && consts.contains(code.substring(0 , len))){
  295.                 tokType = Tokens.CONST_NAME;
  296.             }
  297.  
  298.             Map<Tokens , String> curans = new HashMap<>();
  299.             curans.put(tokType , code.substring(0 , len));
  300.         //    System.out.println(curans);
  301.          //   if(tokType != Tokens.Comment)
  302.             int repeat = 1;
  303.             if(wasbegin > 0 && tokType == Tokens.Punctuation && code.substring(0 , len).equals(";")){
  304.                 ++repeat;
  305.             }
  306.             for(int kk = 0 ; kk < repeat ; ++kk)
  307.                 ans.add(curans);
  308.             //      System.out.println(code.substring(0 , len) + " " + tokType.toString());
  309.             code = code.substring(len);
  310.             code = code.trim();
  311.         }
  312.  
  313.         int sz = ans.size() - 1;
  314.         int st = 0;
  315.         lab:
  316.         while(true){
  317.             for(Tokens tk : ans.get(sz).keySet()){
  318.                 if(tk == Tokens.Comment) {
  319.                     --sz;
  320.                     continue lab;
  321.                 }
  322.             }
  323.  
  324.             for(Tokens tk : ans.get(sz).keySet()) {
  325.                 if (st == 0 && tk == Tokens.Punctuation && ans.get(sz).get(tk).equals(".")) {
  326.                     st = 1;
  327.                     --sz;
  328.                     continue lab;
  329.                 }
  330.                 if (st == 1 && tk == Tokens.Keyword && ans.get(sz).get(tk).equals("end")) {
  331.                     st = 2;
  332.                     --sz;
  333.                     continue lab;
  334.                 }
  335.  
  336.                 if (st == 2 && (tk != Tokens.Punctuation || !ans.get(sz).get(tk).equals(";"))) {
  337.                     Map<Tokens, String> curans = new HashMap<>();
  338.                     curans.put(Tokens.Punctuation, ";");
  339.                     ans.add(sz + 1, curans);ans.add(sz + 1, curans);
  340.                 }
  341.                 return ans;
  342.             }
  343.         }
  344.  
  345.      //   return ans;
  346.     }
  347. }
  348.  
  349. public class SysProgrammingMainAlgorithm {
  350.     public static final boolean sql = false;
  351.     public static final boolean debug = true;
  352.  
  353.     public static void main(String[] args) {
  354.         byte [] readline=new byte [80];
  355.         boolean result;
  356.         String fileName;
  357.         MyLang testLang=null;
  358.         int codeAction, llk=1, textLen;
  359.         String [] menu= { "*1.  Прочитати граматику з файла  ",
  360.                 " 2.  Лабораторна робота. Клас будує студент",
  361.                 " 3.  Надрукувати граматику",
  362.                 "*4.  Побудувати списки терміналів та нетерміналів",
  363.                 "*5.  Пошук непродуктивних нетерміналів",
  364.                 "*6.  Пошук недосяжних нетерміналів",
  365.                 "*7.  Побудова списку епсілон-нетерміналів",
  366.                 " 8.  Друк списку епсілон-нетерміналів",
  367.                 " 9.  Пошук ліворекурсивних нетерміналів",
  368.                 " 10. Пошук різних ліворекурсивних виводів мінімальної довжини",
  369.                 " 11. Пошук праворекурсивних нетерміналів",
  370.                 " 12. Пошук різних праворекурсивних виводів мінімальної довжини",
  371.                 "*13. Побудувати множини FirstK(A), A-нетермінал",
  372.                 " 14. Вивести на термінал множини FirstK(A), A-нетермінал",
  373.                 "*15. Побудувати множини FollowK(A), A-нетермінал",
  374.                 " 16. Вивести на термінал множини FollowK(A), A-нетермінал",
  375.                 "*17. Побудувати множини FirstK(w) + FollowK(A) для правила А->w",
  376.                 " 18. Вивести на термінал FirstK(w) + FollowK(A) для всіх правил А->w",
  377.                 " 19. Вивести на термінал FirstK(w) + FollowK(A) для вибраних правил А->w",
  378.                 "*20. Перевірка сильної LL(1)-властивості",
  379.                 " 21. Побудова таблиці LL(1)-синтаксичного аналізатора",
  380.                 " 22. Синтаксичний аналізатор. Клас будує студент",
  381.                 "*23. Побудувати множини LocalK(A), A-нетермінал",
  382.                 " 24. Вивести на термінал множини LocalK(A), A-нетермінал",
  383.                 "*25. Перевірка LL(k)-властивості, k>1",
  384.                 " 26. Вихід з системи"
  385.         };
  386.         do  {
  387.             codeAction=0;
  388.             String upr;
  389.             for (String ss: menu) System.out.println(ss); // вивести меню
  390.             System.out.println("Введіть код дії або end:");
  391.             do {  // цикл перебору даних
  392.                 try {
  393.                     textLen=System.in.read(readline);
  394.                     upr = new String (readline,0,textLen, "ISO-8859-1");
  395.                     if (upr.trim().equals("end") ) return;
  396.                     codeAction=new Integer (upr.trim());
  397.                 }
  398.                 catch(Exception ee)
  399.                 { System.out.println ("Невірний код дії, повторіть: ");
  400.                     continue;
  401.                 }
  402.                 if (codeAction >=1  &&  codeAction<=menu.length ) {
  403.                     if (menu [codeAction-1].substring(0, 1).equals("+"))  {
  404.                         System.out.println("Елемент меню " +codeAction+" повторно виконати неможливо");
  405.                         continue ;
  406.                     }
  407.                     int itmp;
  408.                     for (itmp=0; itmp < codeAction-1; itmp++)
  409.                         if (menu[itmp].substring(0, 1).equals("*")) break;
  410.                     if (itmp !=codeAction-1) {
  411.                         System.out.println ("Виконайте попередні елементи меню, що позначені * : ");
  412.                         continue ;
  413.                     }
  414.                     if(codeAction == 2){
  415.                         for(itmp=0; itmp <= 7 ; ++itmp){
  416.                             if(menu[itmp].substring(0, 1).equals("*")) break;
  417.                         }
  418.                         if(itmp != 8){
  419.                             System.out.println ("Виконайте елементи меню до 8го, що позначені * : ");
  420.                             continue ;
  421.                         }
  422.                     }
  423.                     break;
  424.                 }
  425.                 else {
  426.                     System.out.println ("Невірний код дії, повторіть: ");
  427.                     continue ;
  428.                 }
  429.             }  while (true);
  430.             // перевірка на виконання усіх попередніх дій
  431.             result=false;
  432.             switch (codeAction) {
  433.                 case 1: //1. Прочитати граматику з файла",
  434.                     System.out.print ("Введіть ім'я файлу граматики:");
  435.                     try {
  436.                         textLen=System.in.read(readline);
  437.                         fileName = new String (readline,0,textLen, "ISO-8859-1");
  438.                         fileName = fileName.trim();
  439.                     }
  440.                     catch(Exception ee)
  441.                     { System.out.println ("Системна помилка: "+ee.toString());
  442.                         return;
  443.                     }
  444.                     System.out.print ("Введіть значення параметра k : ");
  445.                     try {
  446.                         textLen=System.in.read(readline);
  447.                         String llkText = new String (readline,0,textLen, "ISO-8859-1");
  448.                         llkText = llkText.trim();
  449.                         llk=Integer.parseInt(llkText);
  450.                     }
  451.                     catch(Exception ee)
  452.                     { System.out.println ("Системна помилка: "+ee.toString());
  453.                         return;
  454.                     }
  455.                     testLang = new MyLang (fileName,llk);
  456.                     if (!testLang.isCreate()) break;  //не створили об'єкт
  457.                     System.out.println ("Граматика прочитана успішно");
  458.                     result=true;
  459.                     for (int jj=0;  jj<menu.length; jj++) {
  460.                         if (menu [jj].substring(0, 1).equals(" ")) continue;
  461.                         menu [jj]=menu [jj].replace(menu [jj].charAt(0), '*');
  462.                     }
  463.                     break;
  464.                 case 2: //2. Лабораторна робота студента
  465.                  //   long s = System.currentTimeMillis();
  466.  
  467.                     boolean ck = false;
  468.                     int[] term = testLang.getTerminals();
  469.                     int[] nonterm = testLang.getNonTerminals();
  470.  
  471.                     Map<Integer , Integer> notrm = new HashMap();
  472.                     Map<Integer , Integer> trm = new HashMap();
  473.  
  474.                     for(int i = 0 ; i < term.length ; ++i){
  475.                         trm.put(term[i] , i);
  476.                     }
  477.                     for(int i = 0 ; i < nonterm.length ; ++i){
  478.                         notrm.put(nonterm[i] , i);
  479.                     }
  480.  
  481.                     LlkContext[] llkTrmContext = testLang.getLlkTrmContext();
  482.                     LlkContext[] res_cur = new LlkContext[nonterm.length];
  483.  
  484.                     for (int i = 0; i < nonterm.length; ++i) {
  485.                         res_cur[i] = new LlkContext();
  486.                     }
  487.  
  488.                     for(int u : testLang.getEpsilonNonterminals()){
  489.                         res_cur[notrm.get(u)].addWord(new int[0]);
  490.                     }
  491.  
  492.                     ck = true;
  493.  
  494.                     while(ck){
  495.                         ck = false;
  496.  
  497.                         for(Node node : testLang.getLanguarge()) {
  498.                             int[] rule = node.getRoole();
  499.                             int left = notrm.get(rule[0]);
  500.                             int last = 1;
  501.                             if(rule.length == 1)continue;
  502.  
  503.                             Queue<ArrayList<Integer>> q = new LinkedList<>();
  504.  
  505.                             ArrayList<Integer> temp = new ArrayList<>();
  506.                             temp.add(-1);
  507.  
  508.                             q.add(temp);
  509.  
  510.                             ArrayList<ArrayList<Integer>> done = new ArrayList<>();
  511.  
  512.                             for(; last < rule.length ; ++last){
  513.                                 int cur = rule[last] > 0 ? trm.get(rule[last]) : notrm.get(rule[last]);
  514.                                 LlkContext tmp = rule[last] > 0 ? llkTrmContext[cur] : res_cur[cur];
  515.                                 if(rule[last] < 0 && res_cur[cur].calcWords() == 0)break;
  516.                                 boolean cont = false;
  517.                                 while(!q.isEmpty()){
  518.                                     ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  519.                                     if(word.get(0) == last){
  520.                                         cont = true;
  521.                                         break;
  522.                                     }
  523.                                     q.poll();
  524.                                     for(int i = 0 ; i < tmp.calcWords() ; ++i){
  525.                                         ArrayList<Integer> word1 = (ArrayList<Integer>)word.clone();
  526.                                         word1.set(0 , last);
  527.                                         for(int j = 0 ; j < tmp.getWord(i).length ; ++j){
  528.                                             word1.add(tmp.getWord(i)[j]);
  529.                                         }
  530.                                         if(word1.size() - 1 >= testLang.getLlkConst()){
  531.                                             done.add(word1);
  532.                                         }else{
  533.                                             q.add(word1);
  534.                                         }
  535.                                     }
  536.                                 }
  537.                                 if(cont)continue;
  538.                                 break;
  539.                             }
  540.  
  541.                             while(last == rule.length && !q.isEmpty()){
  542.                                 ArrayList<Integer> word = (ArrayList<Integer>)q.peek().clone();
  543.                                 q.poll();
  544.                                 done.add(word);
  545.                             }
  546.  
  547.                             for(int i = 0 ; i < done.size() ; ++i){
  548.                                 int word[] = new int[Math.min(done.get(i).size() - 1 , testLang.getLlkConst())];
  549.                                 for(int j = 0 ; j < word.length ; ++j){
  550.                                     word[j] = done.get(i).get(j + 1);
  551.                                 }
  552.                                 ck |= (res_cur[left].addWord(word));
  553.                             }
  554.                         }
  555.                     }
  556.  
  557.                     testLang.setFirstK(res_cur);
  558.                     testLang.printFirstkContext();
  559.  
  560.                  //   long f = System.currentTimeMillis() - s;
  561.                  //   System.out.print("Время работы: " + f);
  562.  
  563.                     break;
  564.                 case 3:  // Надрукувати граматику
  565.                     testLang.printGramma();
  566.                     break;
  567.                 case 4:  // надрукувати список терміналів та нетерміналів
  568.                     testLang.printTerminals();
  569.                     testLang.printNonterminals();
  570.                     result=true;
  571.                     break;
  572.                 case 5: // вивести непродуктивні правила
  573.                     result=testLang.createNonProdRools();
  574.                     break;
  575.                 case 6: // недосяжні нетермінали
  576.                     result=testLang.createNonDosNeterminals();
  577.                     break;
  578.                 case 7:  //Побудова списку епсілон-нетерміналів
  579.                     int [] epsilon=testLang.createEpsilonNonterminals ();
  580.                     testLang.setEpsilonNonterminals (epsilon);
  581.                     result=true;
  582.                     break;
  583.                 case 8: //Друк списку епсілон-нетерміналів
  584.                     testLang.printEpsilonNonterminals();
  585.                     break;
  586.                 case 9:    //Пошук ліворекурсивних нетерміналів"
  587.                     testLang.leftRecursNonnerminal();
  588.                     break;
  589.                 case 10:  //Пошук різних ліворекурсивних виводів мінімальної довжини"
  590.                     testLang.leftRecusionTrace();
  591.                     break;
  592.                 case 11:  //Пошук праворекурсивних нетерміналів"
  593.                     testLang.rightRecursNonnerminal();
  594.                     break;
  595.                 case 12:  //Пошук різних праворекурсивних виводів мінімальної довжини"
  596.                     testLang.rigthRecusionTrace();
  597.                     break;
  598.                 case 13:  //Побудувати множини FirstK
  599.                  //   s = System.currentTimeMillis();
  600.  
  601.                     LlkContext [] firstContext = testLang.firstK();
  602.                     testLang.setFirstK(firstContext);
  603.                     result=true;
  604.  
  605.                 //    f = System.currentTimeMillis() - s;
  606.                 //    System.out.print("Время работы: " + f);
  607.                     break;
  608.                 case 14:  //Друк множини FirstK
  609.                     testLang.printFirstkContext ( );
  610.                     break;
  611.                 case 15:  //Побудувати множини FollowK
  612.                     LlkContext [] followContext = testLang.followK();
  613.                     testLang.setFollowK(followContext);
  614.                     result=true;
  615.                     break;
  616.                 case 16:  //Друк множини FollowK
  617.                     testLang.printFollowkContext ( );
  618.                     break;
  619.                 case 17:  //Побудувати множини FirstK(w) + FollowK(A) для правила А->w
  620.                     testLang.firstFollowK ( );
  621.                     result=true;
  622.                     break;
  623.                 case 18:  //Друк множини FirstK(w) + FollowK(A) для правила А->w
  624.                     testLang.printFirstFollowK( );
  625.                     break;
  626.                 case 19:  //Друк множини FirstK(w) + FollowK(A) для вибраних правил А->w
  627.                     testLang.printFirstFollowForRoole();
  628.                     break;
  629.                 case 20:  //Перевірка сильної LL(k)-властивості",
  630.                     result=testLang. strongLlkCondition () ;
  631.                     break;
  632.                 case 21:  //Побудова таблиці LL(1)-синтаксичного аналізатора
  633.                     int [][] uprTable=testLang.createUprTable ();
  634.                     testLang.setUprTable(uprTable);
  635.                     break;
  636.                 case 22: // PASCAL
  637.                     String path;
  638.                     System.out.println("Введiть назву вхiдного файлу: ");
  639.                     try{
  640.                         textLen=System.in.read(readline);
  641.                         String codepath = new String (readline,0,textLen, "ISO-8859-1");
  642.                         LexPascal lex = new LexPascal(codepath);
  643.                     //    SQLparser sqlp = new SQLparser(codepath);
  644.                     //    ArrayList<Map<Tokens , String>> tokens = !sql ? lex.Tokenize() : sqlp.Tokenize();
  645.                         ArrayList<Map<Tokens , String>> tokens = lex.Tokenize();
  646.  
  647.                         if(debug)
  648.                         for(Map<Tokens , String> mp : tokens){
  649.                             for(Tokens tk : mp.keySet()){
  650.                                 System.out.println(tk.toString() + " " + mp.get(tk));
  651.                             }
  652.                         }
  653.                     //    if(sql)break;
  654.  
  655.                         boolean accepted = true;
  656.  
  657.                         Stack<Integer> st = new Stack<>();
  658.                         st.push(testLang.getAxioma());
  659.  
  660.                         int[][] table = testLang.getUprTable();
  661.  
  662.                         for(int kk = 0 ; kk < tokens.size() ; ++kk , kk = Math.max(kk , 0)){
  663.                             Map<Tokens , String> mp = tokens.get(kk);
  664.                             if(debug)
  665.                                 System.out.println(mp + " " + st.size() + " " + testLang.getLexemaText(st.peek()));
  666.                             if(debug)
  667.                                 Thread.sleep(250);
  668.                             boolean skip = false;
  669.                             for(Tokens tk : mp.keySet()){
  670.                                 if(tk == Tokens.Comment){
  671.                                     skip = true;
  672.                                 }
  673.                             }
  674.  
  675.                             if(skip) {
  676.                                 continue;
  677.                             }
  678.  
  679.                             if(st.isEmpty()){
  680.                                 System.out.println("Error, stack is empty! ");
  681.                                 accepted = false;
  682.                                 break;
  683.                             }
  684.  
  685.                             int top = st.peek();
  686.  
  687.                             if(top < 0){//top is non terminal
  688.                                 int cur = -1;
  689.                                 int nt[] = testLang.getNonTerminals();
  690.  
  691.                                 for(int i = 0 ; i < nt.length ; ++i){
  692.                                     if(top == nt[i]){
  693.                                         cur = i;
  694.                                         break;
  695.                                     }
  696.                                 }
  697.  
  698.  
  699.                                 int el = -1;
  700.                                 int tr[] = testLang.getTerminals();
  701.  
  702.                                 for(int i = 0 ; i < tr.length ; ++i){
  703.                                     String terminal = testLang.getLexemaText(tr[i]);
  704.                                     for(Tokens tk : mp.keySet()){
  705.                                         if(terminal.equals(mp.get(tk)) || terminal.equals(tk.toString())){
  706.                                             el = i;
  707.                                             break;
  708.                                         }
  709.                                     }
  710.                                     if(el >= 0)break;
  711.                                 }
  712.  
  713.                                 if(cur < 0 || el < 0){
  714.                                     System.out.println("Error, no such lexema found in the grammar!");
  715.                                 }
  716.  
  717.                                 int next = table[cur][el];
  718.  
  719.                                 LinkedList<Node> lang = testLang.getLanguarge();
  720.                                 int rule[] = lang.get(Math.max(next - 1 , 0)).getRoole();
  721.  
  722.                                 st.pop();
  723.  
  724.                                 for(int i = rule.length - 1; i >= 1 ; --i) {
  725.                                     st.push(rule[i]);
  726.                                 }
  727.  
  728.                                 --kk;
  729.                             }else{//top is terminal
  730.                                 String terminal = testLang.getLexemaText(top);
  731.  
  732.                                 boolean eq = false;
  733.  
  734.                                 for(Tokens tk : mp.keySet()){
  735.                                     if(debug)
  736.                                         System.out.println("Try to compare: " + terminal + " " + mp.get(tk) + "\nand " + terminal + " " + tk.toString());
  737.                                     if(terminal.equals(mp.get(tk)) || terminal.equals(tk.toString())){
  738.                                         eq = true;
  739.                                     }
  740.                                 }
  741.  
  742.                                 if(eq){
  743.                                     st.pop();
  744.                                     continue;
  745.                                 }else{
  746.                                     for(Tokens tk : mp.keySet()){
  747.                                         System.out.println("Syntax error before '" + mp.get(tk) + "'! ");
  748.                                     }
  749.                                     accepted = false;
  750.                                     break;
  751.                                 }
  752.  
  753.  
  754.                             }
  755.                         }
  756.  
  757.                         int[] eps = testLang.getEpsilonNonterminals();
  758.                         while(!st.isEmpty() && st.peek() < 0){
  759.                             boolean check = false;
  760.                             for(int e : eps){
  761.                                 if(e == st.peek()){
  762.                                     st.pop();
  763.                                     check = true;
  764.                                     break;
  765.                                 }
  766.                             }
  767.                             if(!check)
  768.                                 break;
  769.                         }
  770.  
  771.                         if(!st.isEmpty() && accepted){
  772.                             accepted = false;
  773.                             System.out.println("Error, analyzer have reached end of the code, but stack is not empty!");
  774.  
  775.                             if(debug)
  776.                                 while(!st.isEmpty()){
  777.                                     int el = st.pop();
  778.                                     System.out.println(testLang.getLexemaText(el));
  779.                                 }
  780.  
  781.                         }
  782.  
  783.                         if(accepted == true) {
  784.                             System.out.print("OK\n");
  785.                         //    System.out.println(st);
  786.                         }
  787.  
  788.  
  789.                     }catch (java.io.IOException e ){}
  790.                     catch (java.lang.Exception e){e.printStackTrace();}
  791.  
  792.  
  793.  
  794.  
  795.                     break;
  796.  
  797.                 case 23: // 23. Побудувати множини LocalK(A), A-нетермінал
  798.                     LinkedList <LlkContext> [] Localk=testLang.createLocalK();
  799.                     testLang.setLocalkContext(Localk);
  800.                     result=true;
  801.                     break;
  802.                 case 24: // 24. Вивести на термінал множини LocalK(A), A-нетермінал
  803.                     testLang.printLocalk();
  804.                     break;
  805.                 case 25: // 25. Перевірка LL(k)-властивості, k>1
  806.                     result= testLang.llkCondition();
  807.                     break;
  808.                 case 26: // rtrtrtr
  809.                     return;
  810.                 case 27:
  811.                     break;
  812.             }  // кінець switch
  813.             // блокуємо елемент обробки
  814.             if (result) // функція виконана успішно
  815.                 if (menu [codeAction-1].substring(0, 1).equals("*"))
  816.                     menu [codeAction-1]=menu [codeAction-1].replace('*', '+') ;
  817.         } while (true);  //глобальний цикл  обробки
  818.  
  819.     }  // кінець main
  820.  
  821.     static void tesrReadWrite(String fname)
  822.     {  String readline;
  823.         BufferedReader s;
  824.         BufferedWriter bw;
  825.         try {
  826.             s = new BufferedReader(new FileReader(fname));
  827.             bw = new BufferedWriter (new FileWriter("c:\\rez.txt"));
  828.             // s=new FileInputStream (fname);
  829.             //s=new FileInputStream ("C:\\Eclipse\\C1.txt");
  830.             //s=new FileInputStream ("C:\\test1.txt");
  831.             while ( s.ready() ) {
  832.                 readline= s.readLine();
  833.                 System.out.println(readline);
  834.                 //System.out.println("Read Line");
  835.                 //bw.write(readline, 0,readline.length() );
  836.                 //bw.write((int)'\r'); bw.flush();
  837.                 //System.out.println("Print Line");
  838.             }
  839.  
  840.             //bw.close();
  841.         }
  842.         catch(Exception ee)
  843.         {
  844.             System.out.print("File: " +fname + "not found\n");
  845.             //return;
  846.         }
  847.     }
  848. }
  849.  
  850. /*
  851. class SQLparser{
  852.     private String path = "";
  853.     private static Map<Tokens , Pattern> regular = new HashMap<Tokens , Pattern>();
  854.     private static Map<Tokens , Integer> priority = new HashMap<Tokens , Integer>();
  855.     private static Set<String> funcs = new HashSet<>();
  856.  
  857.     public SQLparser(String _path){
  858.         path = _path.trim();
  859.         InitRegex();
  860.         InitPriority();
  861.     }
  862.  
  863.     static void InitRegex(){
  864.         regular.put(Tokens.IDN , Pattern.compile("^(_|[a-z])([a-z]|[0-9]|_)*"));
  865.         regular.put(Tokens.Keyword , Pattern.compile("^(select|distinct|from|where|using|group|order|asc|desc|having|by|as|in)"));
  866.         regular.put(Tokens.FUNC_NAME , Pattern.compile("^(count|sum|avg|min|max)"));
  867.         regular.put(Tokens.DIGIT , Pattern.compile("^(0|[1-9]\\d*)"));
  868.         regular.put(Tokens.LITER_STR, Pattern.compile("^'(?:[^']+|(''))*'$"));
  869.         regular.put(Tokens.Comment, Pattern.compile("^(//(.*?)//|\\{(.*?)\\}|\\(\\*(.*?)\\*\\))"));
  870.         regular.put(Tokens.Punctuation, Pattern.compile("^(\\(|\\)|;|,|\\.|:|\\[|\\]|\\^|\\.\\.)"));
  871. //        regular.put(Tokens.Hex, Pattern.compile("^0[xX]((0|[1-9a-fA-F][\\da-fA-F]*))"));
  872.         regular.put(Tokens.Operator, Pattern.compile("^\\+|\\-|\\*|/|:=|<>|=|>|<|>=|<=|!=|div|mod|and|not"));
  873.         regular.put(Tokens.Double, Pattern.compile("^(((0|[1-9]\\d*)?\\.\\d+([eE][+-]?\\d+)?[FfDdMm]?)|((0|[1-9]\\d*)([eE][+-]?\\d+)[FfDdMm]?)|((0|[1-9]\\d*)[FfDdMm]))"));
  874. //        regular.put(Tokens.Directive, Pattern.compile("^mp:.*"));
  875.         regular.put(Tokens.TYPE_NAME , Pattern.compile("^(integer|real|char|boolean)"));
  876.     }
  877.  
  878.     private void InitPriority(){
  879.         priority.put(Tokens.Operator, 10);
  880.         priority.put(Tokens.Punctuation, 2);
  881.         priority.put(Tokens.Double, 3);
  882.         priority.put(Tokens.DIGIT, 4);
  883.         priority.put(Tokens.Hex, 4);
  884.         priority.put(Tokens.IDN, 5);
  885.         priority.put(Tokens.Keyword, 6);
  886.         priority.put(Tokens.LITER_STR, 7);
  887.         priority.put(Tokens.TYPE_NAME, 8);
  888.         priority.put(Tokens.Comment, 9);
  889.         priority.put(Tokens.FUNC_NAME , 7);
  890.     }
  891.  
  892.     private String Prepare(String text){
  893.         text = text.toLowerCase();
  894.         String code = "";
  895.         boolean ck = false;
  896.  
  897.         //  text = text.replace(";",";;");
  898.         text = text.replace("clrscr;","clrscr();");
  899.         text = text.replace("writeln;","writeln();");
  900.         text = text.replace("write;","write();");
  901.         text = text.replace("readln;","readln();");
  902.         text = text.replace("read;","read();");
  903.         text = text.replace("randomize;","randomize();");
  904.         text = text.replace("function","func");
  905.         text = text.replace("procedure","proc");
  906.         text = text.replace("true","1");
  907.         text = text.replace("false","0");
  908.  
  909.  
  910.         for(int i = 0 ; i < text.length() ; ++i){
  911.             char ch = text.charAt(i);
  912.             String small = "йцукенгшщзхъфывапролджэёячсмитьбю";
  913.             String big = "ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЁЯЧСМИТЬБЮ";
  914.             if(small.indexOf(ch) != -1 && !ck){
  915.                 code += 'a';
  916.                 ck = true;
  917.             }else if(big.indexOf(ch) != -1 && !ck){
  918.                 code += 'A';
  919.                 ck = true;
  920.             }else if(small.indexOf(ch) == -1 && big.indexOf(ch) == -1){
  921.                 code += ch;
  922.                 ck = false;
  923.             }
  924.         }
  925.         String temp = "";
  926.         boolean add = false;
  927.         int st = 0;
  928.         for(int i = 0 ; i < code.length() ; ++i){
  929.             char ch = code.charAt(i);
  930.             if(st == 0 && ch == '\''){
  931.                 add = false;
  932.                 temp += ch;
  933.                 st = 1;
  934.                 continue;
  935.             }
  936.             if(st == 1 && ch == '\''){
  937.                 st = 0;
  938.                 temp += ch;
  939.                 continue;
  940.             }
  941.             if(st == 1 && ch == '\\'){
  942.                 st = 2;
  943.                 continue;
  944.             }
  945.             if(st == 2){
  946.                 st = 1;
  947.                 continue;
  948.             }
  949.             if(st == 1) {
  950.                 if(add == false){
  951.                     temp += ch;
  952.                     add = true;
  953.                 }
  954.                 continue;
  955.             }
  956.             temp += ch;
  957.         }
  958.         return temp.toLowerCase();
  959.     }
  960.  
  961.     public ArrayList<Map<Tokens , String>> Tokenize() throws Exception{
  962.         File file = new File(path);
  963.         int tlast = -1;
  964.  
  965.         String text = "";
  966.         try {
  967.             FileInputStream fis = new FileInputStream(new File(path));
  968.             byte[] data = new byte[(int) file.length()];
  969.             fis.read(data);
  970.             fis.close();
  971.             text = new String(data, "UTF-8");
  972.         }catch(FileNotFoundException e){
  973.             System.out.print(path + " File not found");
  974.         }catch(IOException e) {
  975.             e.printStackTrace();
  976.         }
  977.  
  978.         ArrayList<Map<Tokens , String>> ans = new ArrayList<>();
  979.         String code = Prepare(text);
  980.         //    System.out.println(code);
  981.         while(code.length() > 0 && (code.charAt(0) == ' ' || code.charAt(0) == '\n' || code.charAt(0) == '\t'))code = code.substring(1);
  982.         while(code.length() > 0){
  983.             Tokens tokType = Tokens.Comment;
  984.             int len = -1;
  985.             for(Tokens tok : regular.keySet()){
  986.                 Pattern trg = regular.get(tok);
  987.  
  988.                 String tmp = code;
  989.                 for(int j = code.length() ; j > 0 ; --j){
  990.                     Matcher tmat = trg.matcher(tmp);
  991.                     if(tmat.matches()){
  992.                         if(j > len || (j == len && priority.get(tok) > priority.get(tokType))){
  993.                             len = j;
  994.                             tokType = tok;
  995.                             break;
  996.                         }
  997.                     }
  998.                     tmp = tmp.substring(0 , tmp.length() - 1);
  999.                 }
  1000.  
  1001.  
  1002.                 Matcher tmat = trg.matcher(code);
  1003.  
  1004.                 MatchResult res1 = tmat.toMatchResult();
  1005.                 try{
  1006.                     System.out.println(res1.end());
  1007.                 }catch(java.lang.IllegalStateException e){}
  1008.                 if(tmat.matches()){
  1009.                     MatchResult res = tmat.toMatchResult();
  1010.                     if(res.start() == 0){
  1011.                         if(res.end() > len){
  1012.                             len = res.end();
  1013.                             tokType = tok;
  1014.                         }
  1015.                     }
  1016.                 }
  1017.             }
  1018.             if(len <= 0){
  1019.                 throw new Exception("Unknown lexeme " + code);
  1020.             }
  1021.  
  1022.         //              table_name,
  1023.         //              col_name,
  1024.         //              name,
  1025.             if(tokType == Tokens.Keyword){
  1026.                 String cur_lex = code.substring(0 , len);
  1027.                 if(cur_lex.equals("select") || cur_lex.equals("by")){
  1028.                     tlast = 1;
  1029.                 }else if(cur_lex.equals("from")){
  1030.                     tlast = 2;
  1031.                 }else if(cur_lex.equals("where")){
  1032.                     tlast = 3;
  1033.                 }
  1034.             }
  1035.  
  1036.             if(tokType == Tokens.IDN){
  1037.                 int sz = ans.size();
  1038.                 if(sz == 0)throw new RuntimeException();
  1039.                 Map<Tokens , String> last = ans.get(sz - 1);
  1040.  
  1041.                 for(Tokens tk : last.keySet()){
  1042.                //     System.out.println("debug: " + last.get(tk));
  1043.                     if(last.get(tk).equals("as")){
  1044.                         tokType = Tokens.name;
  1045.                     }else if(last.get(tk).equals(".")){
  1046.                         if(sz - 2 < 0)throw new RuntimeException();
  1047.  
  1048.                         Map<Tokens , String> prev = ans.get(sz - 2);
  1049.                         Map<Tokens , String> new_prev = new HashMap<>();
  1050.  
  1051.                      //   if(tlast == 1){//select
  1052.                             for(Tokens tk2 : prev.keySet()){
  1053.                                 new_prev.put(Tokens.table_name , prev.get(tk2));
  1054.                             }
  1055.  
  1056.                             ans.set(sz - 2 , new_prev);
  1057.                             tokType = Tokens.col_name;
  1058.                      //   }else if(tlast == 2)//from
  1059.  
  1060.  
  1061.                     }else{
  1062.                         if(tlast == 1){//select
  1063.                             tokType = Tokens.col_name;
  1064.                         }else if(tlast == 2){//from
  1065.                             tokType = Tokens.table_name;
  1066.                         }else if(tlast == 3) {//where
  1067.                             tokType = Tokens.col_name;
  1068.                         }else{
  1069.                             throw new RuntimeException();
  1070.                         }
  1071.                     }
  1072.                 }
  1073.             }
  1074.  
  1075.  
  1076.             Map<Tokens , String> curans = new HashMap<>();
  1077.             curans.put(tokType , code.substring(0 , len));
  1078.             ans.add(curans);
  1079.             //      System.out.println(code.substring(0 , len) + " " + tokType.toString());
  1080.             code = code.substring(len);
  1081.             code = code.trim();
  1082.         }
  1083.         return ans;
  1084.     }
  1085. }*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement