/** * CheckWithoutNestingTester * classe didattica per illustrare l'uso la verifica della correttezza * sintattica di un'espressione * non sono ammesse parentesi annidate * @author M. Dalpasso modificata da A. Luchetta * @version 20-Nov-2006 */ public class CheckWithoutNestingTester { /** verifica la correttezza sintattica di una espressione contenete parentesi ad ogni parentesi aperta deve corrispondere una parentesi chiusa dello stesso tipo @param s la stringa su cui effettuare la verifica @return codice di errore, secondo la codifica seguente 0: sintassi corretta. 1: Errore 1: parentesi annidate 2: Errore 2: parentesi chiusa senza corrispondente aperta 3: Errore 3: parentesi non accoppiate 4: Errore 4: parentesi aperta senza corrispondente chiusa */ public static int checkWithoutNesting(String s) { final boolean IN = true; final boolean OUT = false; boolean status = OUT; char bracket = '0'; // un valore qualsiasi for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (isOpeningBracket(c)) if (status == OUT) { status = IN; bracket = c; } else return 1; //Errore: parentesi annidate if (isClosingBracket(c)) if (status == OUT) return 2;//Errore: parentesi chiusa senza corrispondente aperta else if(areMatching(bracket, c)) status = OUT; else return 3; //Errore: parentesi non accoppiate } if (status == IN) return 4; //Errore: parentesi aperta e non chiusa return 0; // OK } /* verifica se il carattere e' una parentesi aperta @param c il carattere su cui effettuare la verifica */ private static boolean isOpeningBracket(char c) { return c == '(' || c == '[' || c == '{'; } /* verifica se il carattere e' una parentesi chiusa @param c il carattere su cui effettuare la verifica */ private static boolean isClosingBracket(char c) { return c == ')' || c == ']' || c == '}'; } /* verifica se due parentesi sono corrispondenti le seguenti coppie di parentesi sono corrispondenti: ( ) [ ] { } @param c1 il primo carattere su cui effettuare la verifica @param c2 il secondo carattere su cui effettuare la verifica */ private static boolean areMatching(char c1, char c2) { return c1 == '(' && c2 == ')' || c1 == '[' && c2 == ']' || c1 == '{' && c2 == '}'; } /* rende eseguibile la classe la stringa da verificare e' passata come argomento sulla riga di comando */ public static void main(String[] args) { int result = checkWithoutNesting(args[0]); switch (result) { case 0: System.out.println(args[0] + " sintassi OK"); break; case 1: System.out.println(args[0] + " parentesi annidate"); break; case 2: System.out.println(args[0] + " parentesi chiusa senza corrispondente aperta"); break; case 3: System.out.println(args[0] + " parentesi non accoppiate"); break; case 4: System.out.println(args[0] + " parentesi aperta senza corrispondente chiusa"); break; default: System.out.println(args[0] + " errore non noto"); break; } } }