osipyonok

SP Lab3 Syntax

May 9th, 2017
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.92 KB | None | 0 0
  1.                     String path;
  2.                     System.out.println("Введiть назву вхiдного файлу: ");
  3.                     try{
  4.                         textLen=System.in.read(readline);
  5.                         String codepath = new String (readline,0,textLen, "ISO-8859-1");
  6.                         LexPascal lex = new LexPascal(codepath);
  7.                         ArrayList<Map<Tokens , String>> tokens = lex.Tokenize();
  8.  
  9.                         boolean accepted = true;
  10.  
  11.                         Stack<Integer> st = new Stack<>();
  12.                         st.push(testLang.getAxioma());
  13.  
  14.                         int[][] table = testLang.getUprTable();
  15.  
  16.                         for(int kk = 0 ; kk < tokens.size() ; ++kk , kk = Math.max(kk , 0)){
  17.                             Map<Tokens , String> mp = tokens.get(kk);
  18.  
  19.                             boolean skip = false;
  20.                             for(Tokens tk : mp.keySet()){
  21.                                 if(tk == Tokens.Comment){
  22.                                     skip = true;
  23.                                 }
  24.                             }
  25.  
  26.                             if(skip) {
  27.                                 continue;
  28.                             }
  29.  
  30.                             if(st.isEmpty()){
  31.                                 System.out.println("Error, stack is empty! ");
  32.                                 accepted = false;
  33.                                 break;
  34.                             }
  35.  
  36.                             int top = st.peek();
  37.  
  38.                             if(top < 0){//top is non terminal
  39.                                 int cur = -1;
  40.                                 int nt[] = testLang.getNonTerminals();
  41.  
  42.                                 for(int i = 0 ; i < nt.length ; ++i){
  43.                                     if(top == nt[i]){
  44.                                         cur = i;
  45.                                         break;
  46.                                     }
  47.                                 }
  48.  
  49.                                 //check that cur != -1
  50.  
  51.                                 int el = -1;
  52.                                 int tr[] = testLang.getTerminals();
  53.  
  54.                                 for(int i = 0 ; i < tr.length ; ++i){
  55.                                     String terminal = testLang.getLexemaText(tr[i]);
  56.                                     for(Tokens tk : mp.keySet()){
  57.                                         if(terminal.equals(mp.get(tk)) || terminal.equals(tk.toString())){
  58.                                             el = i;
  59.                                             break;
  60.                                         }
  61.                                     }
  62.                                 }
  63.  
  64.                                 if(cur < 0 || el < 0){
  65.                                     System.out.println("Error, no such lexema found in the grammar!");
  66.                                 }
  67.  
  68.                                 int next = table[cur][el];
  69.  
  70.                                 LinkedList<Node> lang = testLang.getLanguarge();
  71.                                 int rule[] = lang.get(Math.max(next - 1 , 0)).getRoole();
  72.  
  73.                                 st.pop();
  74.  
  75.                                 for(int i = rule.length - 1; i >= 1 ; --i) {
  76.                                     st.push(rule[i]);
  77.                                 }
  78.  
  79.                                 --kk;
  80.                             }else{//top is terminal
  81.                                 String terminal = testLang.getLexemaText(top);
  82.  
  83.                                 boolean eq = false;
  84.  
  85.                                 for(Tokens tk : mp.keySet()){
  86.                                     if(terminal.equals(mp.get(tk)) || terminal.equals(tk.toString())){
  87.                                         eq = true;
  88.                                     }
  89.                                 }
  90.  
  91.                                 if(eq){
  92.                                     st.pop();
  93.                                     continue;
  94.                                 }else{
  95.                                     System.out.println("Error: " + mp + " found, expected: " + terminal);
  96.                                     accepted = false;
  97.                                     break;
  98.                                 }
  99.  
  100.  
  101.                             }
  102.                         }
  103.                         if(!st.isEmpty() && accepted){
  104.                             accepted = false;
  105.                             System.out.println("Error, analyzer have reached end of the code, but stack is not empty!");
  106.                         }
  107.  
  108.                         if(accepted == true) {
  109.                             System.out.print("OK\n");
  110.                         //    System.out.println(st);
  111.                         }
  112.  
  113.  
  114.                     }catch (java.io.IOException e ){}
  115.                     catch (java.lang.Exception e){e.printStackTrace();}
  116.  
  117.  
  118.  
  119.  
  120.                     break;
Advertisement
Add Comment
Please, Sign In to add comment