Advertisement
Ladies_Man

#COMPLR Lab3 (Regex) COMPLETE

Mar 18th, 2016
317
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.83 KB | None | 0 0
  1. // Лексический анализатор на основе регулярных выражений
  2.  
  3. import java.io.File;
  4. import java.util.Scanner;
  5. import java.util.regex.Matcher;
  6. import java.util.regex.Pattern;
  7.  
  8. public class complab3 {
  9.  
  10.     //Var 11
  11.     public static void main(String args[]) {
  12.  
  13.         String text = "";
  14.         Scanner scanner;
  15.  
  16.         try {
  17.             scanner = new Scanner(new File("src/in.txt"));
  18.         } catch (java.io.FileNotFoundException e) {
  19.             System.out.println(e.toString());
  20.             return;
  21.         }
  22.  
  23.         while (scanner.hasNextLine())
  24.             text += scanner.nextLine() + "\n";
  25.  
  26.         //Комментарии: начинаются с «(∗» или «{», заканчиваются на «∗)» или «}»
  27.         // и могут пересекать границы строк текста.
  28.         String comment_1 = "(\\{[^\\}]*\\})";
  29.         String comment_2 = "(\\(\\*([^\\*]|\\*($|[^\\)]))*\\*\\))";
  30.         // exclude "not|this": ^([^nt]|n($|[^o]|o($|[^t]))|t($|[^h]|h($|[^i]|i($|[^s]))))*$
  31.  
  32.         //Идентификаторы: последовательности латинских букв,
  33.         // представляющие собой конкатенации двух одинаковых слов («zz», «abab»).
  34.         String ident = "(([A-Za-z]+)\\10)";
  35.  
  36.         //Ключевые слова: « ifif », «do», «dodo».
  37.         String keyword = "(ifif|dodo|do)";
  38.  
  39.         String whitespace = "(\r| |\t)";
  40.  
  41.         String linebreak = "\n";
  42.  
  43.  
  44.                                                                      // groups:
  45.         String pattern = "(^" + comment_1 + "|^" + comment_2 +       // 1 2 3 4 5
  46.                         ")|(^" + keyword +                           // 6 7
  47.                         ")|(^" + ident +                             // 8 9 10
  48.                         ")|(^" + whitespace +                        // 11 12
  49.                         ")|(^" + linebreak + ")";                    // 13
  50.  
  51.         Pattern p = Pattern.compile(pattern);
  52.  
  53.         int line = 1, linepos = 1;
  54.         boolean err = false;
  55.  
  56.         while (!text.equals("")) {
  57.  
  58.             Matcher m = p.matcher(text);
  59.             if (m.find()) {
  60.  
  61.                 err = false;
  62.  
  63.                 if (null != m.group(1)) {
  64.                     String tmp = m.group(1);
  65.  
  66.                     System.out.println("COMMENT (" + line + ", " + linepos + "): " + tmp.replaceAll("\n", " "));
  67.  
  68.                     while (tmp.contains("\n")) {
  69.                         line++;
  70.                         linepos = 1;
  71.                         tmp = tmp.substring(tmp.indexOf("\n") + 1);
  72.                     }
  73.                     linepos += tmp.length();
  74.                     text = text.substring(m.end());
  75.                     continue;
  76.                 }
  77.  
  78.                 if (null != m.group(6))
  79.                     System.out.println("KEYWORD (" + line + ", " + linepos + "): " + m.group(6));
  80.  
  81.                 if (null != m.group(9))
  82.                     System.out.println("IDENT (" + line + ", " + linepos + "): " + m.group(9));
  83.  
  84.                 if (null != m.group(13)) {
  85.                     //System.out.println("linebreak (" + line + ", " + linepos + ")");
  86.                     line++;
  87.                     linepos = 0;
  88.                 }
  89.  
  90.                 //if (null != m.group(11))
  91.                 //   System.out.println("whitespace (" + line + ", " + linepos + ")");
  92.  
  93.                 text = text.substring(m.end());
  94.                 linepos += m.end();
  95.  
  96.             } else {
  97.  
  98.                 if (!err) {
  99.                     System.out.println("Syntax Error (" + line + ", " + linepos + ")");
  100.                     err = true;
  101.                 }
  102.                 text = text.substring(1);
  103.                 linepos++;
  104.             }
  105.  
  106.         }
  107.     }
  108.  
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement