Advertisement
ridjis

BracketPrettyPrinter

Dec 15th, 2014
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.02 KB | None | 0 0
  1. import java.util.Stack;
  2.  
  3. class Zagrada {
  4.     private char z;
  5.     private int pozicija;
  6.    
  7.     public Zagrada(char z, int pozicija){
  8.         this.z = z;
  9.         this.pozicija = pozicija;
  10.     }
  11.     public String toString(){
  12.         return z + ": " + pozicija;
  13.     }
  14.     public char getZagrada(){
  15.         return z;
  16.     }
  17. }
  18.  
  19. class NepravilneZagrade extends Exception{
  20.     private Zagrada z;
  21.    
  22.     public NepravilneZagrade(String poruka, Zagrada z){
  23.         super(poruka);
  24.         this.z = z;
  25.     }
  26.     public Zagrada getZagrada(){
  27.         return z;
  28.     }  
  29. }
  30.  
  31. class OtvorenaViseca extends NepravilneZagrade{
  32.     public OtvorenaViseca(Zagrada z){
  33.         super("Otvorena " + z + " nema zatvorenu", z);
  34.     }
  35. }
  36.  
  37. class ZatvorenaViseca extends NepravilneZagrade{
  38.     public ZatvorenaViseca(Zagrada z){
  39.         super("Zatvorena " + z + " bez otvorene", z);
  40.     }
  41. }
  42.  
  43. class ZatvorenaPogresna extends NepravilneZagrade {
  44.     public ZatvorenaPogresna(Zagrada otvorena, Zagrada zatvorena){
  45.         super("Otvorena " + otvorena + " zatvorena sa " + zatvorena, otvorena);
  46.     }
  47. }
  48.  
  49. public class BracketPrettyPrinter {
  50.    
  51.     public static boolean kompatibilna (char z1, char z2){
  52.         if (z1 == '{') return z2 == '}';
  53.         else if (z1 == '[') return z2 == ']';
  54.         else return z2 == ')';
  55.     }
  56.  
  57.     private static StringBuilder uvuci(int level) {
  58.         StringBuilder sb = new StringBuilder();
  59.         sb.append('\n');
  60.         for (int i = 0; i< level; i++){
  61.             sb.append("  ");
  62.         }
  63.         return sb;
  64.     }
  65.    
  66.     public static String format(String ulaz) throws NepravilneZagrade {
  67.         Stack<Zagrada> stek = new Stack<Zagrada>();
  68.         StringBuilder sb = new StringBuilder();
  69.        
  70.         int level = 0;
  71.        
  72.         for(int i = 0; i < ulaz.length();i++){
  73.             char c = ulaz.charAt(i);
  74.             if (c == '(' || c == '[' || c == '{'){
  75.                 stek.push(new Zagrada(c,i));
  76.                 ++level;
  77.                 sb.append(uvuci(level));
  78.             } else if (c == ')' || c == ']' || c == '}') {
  79.                 if (stek.empty())
  80.                     throw new ZatvorenaViseca(new Zagrada(c,i));
  81.                
  82.                 Zagrada poslednjaOtvorena = stek.pop();
  83.                 if (!kompatibilna(poslednjaOtvorena.getZagrada(), c))
  84.                     throw new ZatvorenaPogresna(poslednjaOtvorena, new Zagrada(c,i));
  85.                
  86.                 level--;
  87.                
  88.             } else {
  89.                 sb.append(c);
  90.             }
  91.         } // end for petlje
  92.        
  93.         if (!stek.empty()){
  94.             throw new OtvorenaViseca(stek.pop());
  95.         }
  96.         return sb.toString();
  97.     }
  98.    
  99.     public static void main(String[] args) {
  100.         String[] slucajevi = {
  101.             "if [<= n 1] {1} (* {n} faktorijel (-n 1)))",
  102.             "Neke([] { } zagrade )] )))",
  103.             "Ot ((( nema zatvorene",
  104.             "Zdravko{Zdr(av)ko[dren]]"
  105.         };
  106.        
  107.         int brZatvorenaPogresna = 0, brViseca = 0, ok = 0;
  108.         for (int i = 0; i < slucajevi.length; i++){
  109.             try {
  110.                 System.out.println(BracketPrettyPrinter.format(slucajevi[i]));
  111.                 ok++;
  112.             } catch(NepravilneZagrade e){
  113.                 System.err.println(e.getLocalizedMessage());
  114.            
  115.                 if (e instanceof ZatvorenaPogresna)
  116.                     brZatvorenaPogresna++;
  117.                 else
  118.                     brViseca++;
  119.             }
  120.         } // kraj for petlje
  121.        
  122.         System.out.println("\nProsle test primera: " + ok);    
  123.         System.out.println("Zatvoreno pogresnih: " + brZatvorenaPogresna);
  124.         System.out.println("Visećih: " + brViseca);
  125.     }  
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement