#include #include // for strlen #include // filbehandling #include "stack.h" const int LF = 10; // line feed int check(char*); bool balance(itemType, itemType); void main(int argc, char * argv[]) { if (argc == 2) { int i = check(argv[1]); if (i == -2) cout << "Balanserer ikke"; else if (i == -1) cout << "Tom stack"; else if (i == 1) cout << "Balanserer."; } else cout << "Usage: balance filename"; } int check(char* fname) { Stack stack; itemType temp; ifstream Innfil; char c; int count, slashcount = 0; bool ignore1 = false, ignore2 = false, ignore3 = false, ignore4 = false; Innfil.open(fname); cout << "Sjekker filen " << fname << endl; // Løp gjennom filen, en etter en bokstav. while (Innfil.get(c), !Innfil.eof() ) { // Først må vi ta oss av noen spesialtilfeller /*// Vi skal ignorere ett tegn etter '\' if (ignore3 == true) { if (count >= 1) { ignore3 = false; count = 0; } else { count++; break; } } if (c == '\\') { ignore3 = true; count = 0; } */ // Vi skal ignorere alt mellom '' og "" if (c == '\'') ignore1 = !ignore1; if (c == '\"') ignore2 = !ignore2; // Vi skal ignorere alt mellom '//' og linefeed (LF) if (c == '/') { slashcount++; if (slashcount == 2) { ignore4 = true; } } if ( (int)c == LF && ignore4 == true ) { ignore4 = false; slashcount = 0; } if (!ignore1 && !ignore2 && !ignore3 && !ignore4) { // Hvis c er et start-symbol if ( c == '{' || c == '(' || c == '[' ) // så push det på stacken. stack.push(c); // Ellers, hvis det er et slutt-symbol else if ( c == '}' || c == ')' || c == ']' ) { // så er det en feil hvis stacken er tom. if ( stack.isEmpty() ) { Innfil.close(); // Lukk fila. return -1; // Returner feil. } // Hvis ikke stakken var tom, kan vi poppe fra den. temp = stack.pop(); // Så må vi sjekke om symbolene balanserer. // Hvis de ikke balanserer if (! balance(temp, c) ) { Innfil.close(); // så lukk fila return -2; // og returner feil. } } // Slutt else if. } // Slutt if (!ignore1 && !ignore2 && !ignore3) } // Slutt while-løkke return 1; // Returner suksess. } bool balance(itemType a, itemType b) { return ( (a == '{' && b == '}') || (a == '(' && b == ')') || (a == '[' && b == ']') ); }