/** * CheckWithNestingTester * classe didattica per illustrare l'uso di uno stack nella verifica della * correttezza sintattica di un'espressione * @author M. Dalpasso modificata da A. Luchetta * @version 20-Nov-2006 */ public class CheckWithNestingTester { /** 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 0 se la sintassi e' corretta, un codice di errore maggiore di zero se la sintassi non e' corretta. I codici di errore sono i seguenti: 2: Errore: parentesi chiusa senza corrispondente aperta 3: Errore: parentesi non accoppiate 4: Errore: parentesi aperta senza corrispondente chiusa */ public static int checkWithNesting(String s) { Stack st = new GrowingArrayStack(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (isOpeningBracket(c)) st.push(new Character(c)); else if (isClosingBracket(c)) try { Character ch = (Character)st.pop(); char cc = ch.charValue(); if (!areMatching(cc, c)) return 3; //Errore: parentesi non accoppiate } catch (EmptyStackException e) { return 2; //Errore: parentesi chiusa senza corrispondente aperta } } if (!st.isEmpty()) return 4; //Errore: parentesi aperta senza corrispondente chiusa return 0; } /* 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 le 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 */ public static void main(String[] args) { int result = checkWithNesting(args[0]); switch (result) { case 0: System.out.println(args[0] + " sintassi OK"); 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; } } }