/*!\file check.c * * \author SOUPLET Antoine * \version 1.0 * \date 10-01-2012 * * \brief Fichier contenant les fonctions de vérification de la justesse des lignes écrites dans les fichiers L-System et Flamme * */ #include "functionAdd.h" #include #include "check.h" #include "postfix.h" #include #include //Teste si la chaine de caractère correspondant au numéro de la ligne du fichier passée en paramètre est correcte void testCorrectFlameFunction(char* pc_function, char* pc_fileName, int i_line) { int i;//entier, variable de boucle testCorrectParenthesis(pc_function, pc_fileName, i_line);//Vérifie que la syntaxe des parenthèses dans la ligne du fichier est correcte for (i = 0; i < strlen(pc_function); i++) { if (!(0<=pc_function[i]-48 && pc_function[i]-48<10)) {//Si le caractère en cours de lecture n'est pas un chiffre, on vérifie que c'est un caractère permit i=i+isAllowChar(pc_fileName, i_line, i, pc_function)-1; } } } //Teste si la syntaxe des parenthèses dans la ligne du fichier passée en paramètre est correcte void testCorrectParenthesis(char* pc_function, char* pc_fileName, int i_line) { int i;//entier, variable de boucle int i_parenthesisNumber;//entier correspondant au nombre de parenthèses ouvrantes non fermées i_parenthesisNumber=0; for (i = 0; i < strlen(pc_function); i++) { if (pc_function[i]=='(') {//Si le caractère en cours de lecture est une paranthèse ouvrante, on incrémente le nombre de parenthèses ouvrantes non fermées i_parenthesisNumber++; } else if (pc_function[i]==')') {//Si le caractère en cours de lecture est une parenthèse fermante, on décrémente le nombre de parenthèses ouvrante non fermées i_parenthesisNumber--; } } if (i_parenthesisNumber!=0) {//Si le nombre de parenthèses ouvrante non fermées est différent de 0, alors il y a une erreur de syntaxe au niveau des parenthèses et on quitte donc le programme en affichant un message d'erreur exitErrorSyntaxParenthesis(pc_fileName, pc_function, i_line); } } //Teste si un caractère est permit, c'est à dire s'il correspond à un opérateur, un opérande pré-enregistré, un chiffre ou une parenthèse int isAllowChar(char* pc_fileName, int i_line, int i_pos, char* pc_function) { switch(pc_function[i_pos]) { case 'c': return(isCorrectCos(pc_fileName, i_line, i_pos, pc_function)); break; case 's': return(isCorrectSin(pc_fileName, i_line, i_pos, pc_function)); break; case 't': return(isCorrectTan(pc_fileName, i_line, i_pos, pc_function)); break; case 'a': return(isCorrectArc(pc_fileName, i_line, i_pos, pc_function)); break; case 'e': return(isCorrectExp(pc_fileName, i_line, i_pos, pc_function)); break; case 'h': return(isCorrectHyp(pc_fileName, i_line, i_pos, pc_function)); break; case 'X': return (isCorrectOperand(pc_fileName, i_line, i_pos, pc_function)); break; case 'Y': return (isCorrectOperand(pc_fileName, i_line, i_pos, pc_function)); break; case 'P': return(isCorrectPi(pc_fileName, i_line, i_pos, pc_function)); break; case 'S': return(isCorrectSqrt(pc_fileName, i_line, i_pos, pc_function)); break; case 'R': return (isCorrectOperand(pc_fileName, i_line, i_pos, pc_function)); break; default:{//Si le caratère ne correspond pas aux précédents cas du switch, alors on teste si celui ci correspond à un opérateur différent ou à une parenthèse return isAllowOperatorOrParenthesis(pc_fileName, i_line, i_pos, pc_function); } } } //Teste si la fonction cosinus reconnue par l'analyseur syntaxique est correcte int isCorrectCos(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function) >= i_pos +4) { if (pc_function[i_pos+1]=='o' && pc_function[i_pos+2]=='s'&& pc_function[i_pos+3]=='(' && !isParticularOperatorBinary(pc_function[i_pos+4])) { return (4); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+4); return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function));//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } //Teste si la fonction sinus reconnue par l'analyseur syntaxique est correcte int isCorrectSin(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function)>= i_pos +4) { printf("1\n"); if (pc_function[i_pos+1]=='i' && pc_function[i_pos+2]=='n' && pc_function[i_pos+3]=='(' && !isParticularOperatorBinary(pc_function[i_pos+4])) { return (4); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+4); return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function));//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } //Teste si la fonction tan reconnue par l'analyseur syntaxique est correcte int isCorrectTan(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function) >= i_pos +4) { if (pc_function[i_pos+1]=='a' && pc_function[i_pos+2]=='n'&& pc_function[i_pos+3]=='(' && !isParticularOperatorBinary(pc_function[i_pos+4])) { return (4); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+4); return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function));//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } //Teste si la fonction de type arc (arccos, arcsin ou arctan) reconnue par l'analyseur syntaxique est correcte int isCorrectArc(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function) >= i_pos +7) { if (pc_function[i_pos+1]=='r' && pc_function[i_pos+2]=='c' && pc_function[i_pos+3]=='c' && pc_function[i_pos+4]=='o' && pc_function[i_pos+5]=='s' && pc_function[i_pos+6]=='(' && !isParticularOperatorBinary(pc_function[i_pos+7])) { return (7); } else if (pc_function[i_pos+1]=='r' && pc_function[i_pos+2]=='c' && pc_function[i_pos+3]=='s' && pc_function[i_pos+4]=='i' && pc_function[i_pos+5]=='n'&& pc_function[i_pos+6]=='(' && !isParticularOperatorBinary(pc_function[i_pos+7])) { return (7); } else if (pc_function[i_pos+1]=='r' && pc_function[i_pos+2]=='c' && pc_function[i_pos+3]=='t' && pc_function[i_pos+4]=='a' && pc_function[i_pos+5]=='n'&& pc_function[i_pos+6]=='(' && !isParticularOperatorBinary(pc_function[i_pos+7])) { return (7); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+7); return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function));//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } //Teste si la fonction hyperbolique reconnue par l'analyseur syntaxique est correcte int isCorrectHyp(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function) >= i_pos +5) { if (pc_function[i_pos+1]=='s' && pc_function[i_pos+2]=='i' && pc_function[i_pos+3]=='n' && pc_function[i_pos+4]=='(' && !isParticularOperatorBinary(pc_function[i_pos+5])) { return (5); } else if (pc_function[i_pos+1]=='c' && pc_function[i_pos+2]=='o' && pc_function[i_pos+3]=='s'&& pc_function[i_pos+4]=='(' && !isParticularOperatorBinary(pc_function[i_pos+5])) { return (5); } else if (pc_function[i_pos+1]=='t' && pc_function[i_pos+2]=='a' && pc_function[i_pos+3]=='n'&& pc_function[i_pos+4]=='(' && !isParticularOperatorBinary(pc_function[i_pos+5])) { return (5); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+5); return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function));//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } //Teste si la l'opérande Pi reconnu par l'analyseur syntaxique est correct int isCorrectPi(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function) >= i_pos +1) { if (pc_function[i_pos+1]=='i') { return (2); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+1); return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function));//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } //Teste si la fonction racine carrée reconnue par l'analyseur syntaxique est correcte int isCorrectSqrt(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function) >= i_pos +5) { if (pc_function[i_pos+1]=='q' && pc_function[i_pos+2]=='r' && pc_function[i_pos+3]=='t' && pc_function[i_pos+4]=='(' && !isParticularOperatorBinary(pc_function[i_pos+5])) { return (5); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+5);//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function));//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } //Teste si la fonction exponentielle reconnue par l'analyseur syntaxique est correcte int isCorrectExp(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(strlen(pc_function) >= i_pos +4) { if (pc_function[i_pos+1]=='x' && pc_function[i_pos+2]=='p' && pc_function[i_pos+3]=='(' && !isParticularOperatorBinary(pc_function[i_pos+4])) { return (4); } else { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+4);//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return (-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, strlen(pc_function)); return (-1); } //Teste si la parenthèse ouvrante reconnue par l'analyseur syntaxique est correcte int isCorrectParenthesisOpen(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(i_pos1)) { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+1);//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return(-1); } } exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+1);//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return(-1); } //Teste si l'opérande reconnu par l'analyseur syntaxique est correct int isCorrectOperand(char* pc_fileName, int i_line, int i_pos, char* pc_function) { if(i_pos1)) { exitErrorSyntax(pc_fileName, pc_function, i_line, i_pos, i_pos+1);//si il y a une erreur de syntaxe, on quitte le programme après avoir affichée une erreur précisant la position du caractère à problème, la ligne et le fichier contenant l'erreur return(-1); } } return(1); } //Teste si un caractère est un opérande prédéfinit int isConstant(char c_char) { if (c_char=='X'||c_char=='Y'||c_char=='P'||c_char=='R') { return (1);//retourne 1 si le caractère est un opérande prédéfinit } else { return (0);//retourne 0 si le caractère n'est pas un opérande prédéfinit } } //Teste si un caractère est un opérateur binaire particulier (différent de + ou -) int isParticularOperatorBinary(char c_char) { if (c_char=='*'||c_char=='/'||c_char=='%'|| c_char=='^') { return (1);//retourne 1 si le caractère est un opérateur binaire particulier (différent de + ou -) } else { return (0);//retourne 0 si le caractère n'est pas un opérateur binaire particulier (différent de + ou -) } } //Teste si un caractère est un opérateur correct int isCorrectOperator(char* pc_fileName, int i_line, int i_pos,char* pc_function) { if(i_posi_nbLine){ exitErrorNumberLine(pc_fileName);//Quitte le programme en affichant un message d'erreur } }