From 84430c5ad6b32f03f0a0021e5525893f6b07ea8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9l=C3=A8ne=20TRAN?= <helene.tran@ensiie.fr> Date: Wed, 3 Jan 2018 12:50:36 +0100 Subject: [PATCH] SHOW quasiment au point --- Labgen/a.out | Bin 13800 -> 18376 bytes Labgen/labgen | Bin 33608 -> 38336 bytes Labgen/labgen.c | 584 ++++++++++++++++++++++++++++++--------- Labgen/labgen.h | 49 +++- Labgen/labgen.o | Bin 5024 -> 10344 bytes Labgen/labgen.y | 84 ++++-- Labgen/labgen_RS.c | 349 +++++++++++++++++++++++ Labgen/labgen_varpoint.c | 74 +++++ Labgen/test | 2 + Labgen/y.tab.c | 176 +++++++++--- Labgen/y.tab.h | 13 +- a.out | Bin 0 -> 22664 bytes 12 files changed, 1117 insertions(+), 214 deletions(-) create mode 100644 Labgen/labgen_RS.c create mode 100644 Labgen/labgen_varpoint.c create mode 100644 Labgen/test create mode 100755 a.out diff --git a/Labgen/a.out b/Labgen/a.out index a7f31d8ddde3f96c4943183255bde0d4207c6297..ec9f63aae8488934de4dca48253c6242c673237c 100755 GIT binary patch literal 18376 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 RtAF@L&Sn*k0pqOy{{ey@^1=WB literal 13800 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 diff --git a/Labgen/labgen b/Labgen/labgen index cd0167934fe91538b41a5337518646aea13c32bf..bbd91329f76d3eba512f856e6da02fe3c998f156 100755 GIT binary patch literal 38336 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 literal 33608 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 K$ym8nQv5Hk^23k- diff --git a/Labgen/labgen.c b/Labgen/labgen.c index 313e927..4f68128 100644 --- a/Labgen/labgen.c +++ b/Labgen/labgen.c @@ -1,9 +1,26 @@ #include "labgen.h" -Point size; /*Attention c'est la taille de l'énoncé. */ -/* char *** matrice = NULL ; */ -int in,out; +#include<stdio.h> +#include<stdlib.h> +#include<string.h> +char DIR[2] = {'N','SW'}; +char* DIR = calloc(8,sizeof(char)); +DIR[0] = "N"; +DIR[1] = "NE"; +DIR[2] = "E"; +DIR[3] = "SE"; +DIR[4] = "S"; +DIR[5] = "SW"; +DIR[6] = "W"; +DIR[7] = "NW"; + +Point size; +/*int in,out;*/ variables listevars; - +variables listLAB; +variables listIDENT; +variables listCOUNT; +Point in; +/*Point** listOUT;*/ /* Crée un nouveau point de coordonnées (c,l) * --> Attention : l'ordre n'est pas logique (colonne, ligne) @@ -17,6 +34,15 @@ Point new_point(int c, int l) } +/* Crée un pointeur de point de coodonnées (c,l) */ +Point* new_point_ptr(int c, int l){ + Point* res; + res = malloc(sizeof(Point)); + *res = new_point(c,l); + return res; +} + + /* Crée une matrice de taille (s1, s2) * --> Attention : l'ordre n'est pas logique (colonne, ligne) * s1 est le nombre de colonnes @@ -37,8 +63,8 @@ char*** create_matrice(int s1, int s2) } } size = new_point(s1,s2); - in = 0; - out = 0; + /*in = 0; + out = 0;*/ return matrice; } @@ -83,39 +109,243 @@ void change_val_matrice(Point p, char * msg, char*** matrice) -/*void ligne(){ +void ligne(Point sizeLAB){ int j; - for (j=0;j<size.l;j++) - printf(" -------"); + printf(" +"); + for (j=0;j<=sizeLAB.c;j++) + printf("----+"); printf("\n"); -}*/ +} -void affichmat(char*** matrice) { +void affichmat(char*** matrice, Point sizeLAB) { int i,j; + char* tmp; + + printf(" "); + for (i=0; i<=sizeLAB.c; i++){ + printf(" %d ",i); + } + printf("\n"); - /*ligne();*/ - for(i=0;i<=size.l;i++){ - for(j=0;j<=size.c;j++){ - printf("|%s \t",matrice[i][j]); + ligne(sizeLAB); + for(i=0;i<=sizeLAB.l;i++){ + printf("%d",i); + for(j=0;j<=sizeLAB.c;j++){ + tmp = matrice[i][j]; + if (strcmp(tmp,"") == 0){ + printf("| "); + } + else + printf("| %s ",tmp); } printf("|\n"); - /*ligne();*/ + ligne(sizeLAB); + } +} + +/* Crée un tableau de pointeurs à une dimension */ +Point** init_tab(Point size){ + Point** res; + int i; + int taille = (size.c+1) * (size.l+1); + + res = calloc(taille,sizeof(Point*)); + for (i=0 ; i<taille ; i++) + res[i] = malloc(sizeof(Point)); + return res; +} + +char* concat_string(char *s1,char *s2) { + char *s3[100]; + strcat(s3,s1); + strcat(s3,s2); + return s3; +} + +/* Vérifie que deux points sont identiques + * Si égaux retourne 1, sinon retourne 0 */ +int equals_pt(Point pt1, Point pt2){ + if (pt1.c == pt2.c && pt1.l == pt2.l) + return 1; + return 0; +} + + +/* Ajouter pt à tab */ +Point** add_tab(Point pt, Point** tab, int taille){ + int i; + /* Ajouter condition quand dépassement de taille */ + /* On vérifie que le point à mettre n'est pas déjà dans tab */ + for (i=0 ; i<taille ; i++){ + if (1 == equals_pt(pt,*(tab[i]))){ + /*listCOUNT = increment_var(ident,listCOUNT);*/ + return tab; + } + } + /*Vérifier pour l'incrémentation de la taille*/ + *(tab[taille]) = pt; + return tab; +} + + +void check_obligatoire(variables listCount){ + if (find_var("IN",listCount) == -1){ + fprintf(stderr,"Erreur : IN n'existe pas."); + exit(1); + } + + if (find_var("OUT",listCount) == -1){ + fprintf(stderr,"Erreur : OUT n'existe pas.\n"); + exit(1); + } + + if (find_var("SIZE",listCount) == -1){ + fprintf(stderr,"Erreur : SIZE n'existe pas.\n"); + exit(1); } - /*ligne();*/ } +/*int check_show(char* id, variables listevars){ + int index = find_var(id,listevars); + if (index == -1){ + fprintf(stderr,"Erreur : %s n'existe pas.\n",id); + exit(1); + } + return index; +}*/ + +/* La fonction show permet l'affichage de la matrice du labyrinthe + * listLAB contient toutes les informations sur le labyrinthe + * On suppose qu'on a dans listLAB: + * - SIZEc : la colonne de SIZE + * - SIZEl : la ligne de SIZE + * - INc : la colonne de IN + * - INl : la ligne de IN + * - OUTc : la colonne de OUT + * - OUTl : la ligne de OUT */ + + /* Conventions finales : + * - Point size + * - Point in + * - Point** listOUT (tableau de pointeurs sur un Point OUT) + * - Point** listWALL (tableau de pointeurs sur un Point WALL) + * - Point** listTDV (tableau de pointeurs sur un Point TDV) + * - varpoint*** listPM (tableau de pointeurs sur un pointeur pointant sur un listevars) + * - */ +void show(Point size, Point in, Point** listOUT, Point** listWALL, + Point** listTDV, varpoint** listPM, variables listCOUNT){ + char*** mat; + int i,n; + int index; + Point pt; + varpoint var; + char s[100]; + + /* Vérifie qu'on a des informations sur la taille, l'entrée et au moins + * une sortie du labyrinthe */ + check_obligatoire(listCOUNT); + mat = create_matrice(size.c,size.l); + + /* Ajout de l'entrée*/ + change_val_matrice(in,"E ",mat); + + /* Ajout des sorties */ + n=value_var("OUT",listCOUNT); + for (i=0 ; i<n ; i++){ + pt = *(listOUT[i]); + change_val_matrice(pt,"O ",mat); + } + + /* Ajout des murs */ + n=value_var("WALL",listCOUNT); + for (i=0 ; i<n ; i++){ + pt = *(listWALL[i]); + change_val_matrice(pt,"* ",mat); + } + + /* Ajout des trous de vers */ + n=value_var("TDV",listCOUNT); + for (i=0 ; i<n ; i=i+2){ + pt = *(listTDV[i]); + sprintf(s,"%d",i); + + char chaine1[100] = "W"; + char chaine2[100] = "w"; + strcat(chaine1,s); + strcat(chaine2,s); + + change_val_matrice(pt,chaine1,mat); + pt = *(listTDV[i+1]); + change_val_matrice(pt,chaine2,mat); + } + + /* Ajout des portes magiques */ + n = value_var("PM",listCOUNT); + for (i=0 ; i<n ; i++){ + var = *(listPM[i]); + index=find_varpoint("DEP",var); + if (index==-1){ + fprintf(stderr,"Erreur : pas de point de départ de porte magique.\n"); + exit(1); + } + pt = value_varpoint("DEP",var); + change_val_matrice(pt,"A ",mat); + + for (i=0 ; i<8 ; i++){ + if ((index = find_varpoint(DIR[i],var)) != -1){ + pt = value_varpoint(DIR[i],var); + + sprintf(s,"%d",i); + char chaine1[100] = "a"; + strcat(chaine1,s); + + change_val_matrice(pt,chaine1,mat); + } + } + + /*if ((index = find_varpoint("N",var)) != -1){ + pt = value_varpoint("N",var); + change_val_matrice(pt,"AN",mat); + } + + if ((index = find_varpoint("E",var)) != -1){ + pt = value_varpoint("E",var); + change_val_matrice(pt,"AE",mat); + } + + if ((index = find_varpoint("W",var)) != -1){ + pt = value_varpoint("W",var); + change_val_matrice(pt,"AW",mat); + } + + if ((index = find_varpoint("S",var)) != -1){ + pt = value_varpoint("S",var); + change_val_matrice(pt,"AS",mat); + }*/ + } + + + affichmat(mat,size); + +} + +/******************************************************************************/ +/* Fonctions de base de listevars */ +/******************************************************************************/ /* Initialise listevars */ -void init_listevars(){ - listevars.last = 0; +variables init_listevars(){ + variables res; + res.last = 0; + return res; } /* Vérifie si var est dans listevars : - * - si oui, renvoie l'adresse correspondante - - sinon, renvoie NULL */ -int find_var(char* var) { + * - si oui, renvoie l'indice correspondante + - sinon, renvoie -1 */ +int find_var(char* var,variables listevars) { int i; int ret; @@ -129,13 +359,24 @@ int find_var(char* var) { } +/* Renvoie la valeur de l'identifiant var dans la liste listevars */ +int value_var(char* var,variables listevars){ + int index = find_var(var,listevars); + if (index == -1){ + fprintf(stderr,"Aucune valeur ne correspond à %s.\n",var); + exit(1); + } + return listevars.val[index]; +} + + /* Modifie la valeur de la variable : * - Si "nom" fait partie de la liste des variables, alors la variable est * directement modifiée * - Sinon rajoute le nom de la variable et sa valeur dans listevars si la taille de listevars le permet */ -void create_modif_var(char* nom, int val) { - int index = find_var(nom); +variables create_modif_var(char* nom, int val, variables listevars) { + int index = find_var(nom,listevars); if (index != -1) { @@ -147,133 +388,203 @@ void create_modif_var(char* nom, int val) { printf("Il n'y a plus de place pour tous ces variables.\n"); exit(1); } - else + else{ listevars.ident[listevars.last] = malloc(strlen(nom)*sizeof(char)); + } strcpy(listevars.ident[listevars.last],nom); listevars.val[listevars.last] = val; listevars.last++; } + return listevars; + } + /* ---------------> on peut y gérer l'unicité */ +/* Incrémente la valeur de l'identifiant : + * - si l'identifiant existe dans listevars, il incrémente la valeur existante + * - sinon, il crée l'identifiant et l'initialise à 1 + * Utile pour listCOUNT */ +variables increment_var(char* nom,variables listevars){ + int index = find_var(nom,listevars); + if (index != -1) + listevars.val[index] ++; -/* Règles sémantiques : - * Retourne 1 quand c'est correct - * Retourne 0 sinon */ + else{ + if (listevars.last > TAILLE) { + printf("Il n'y a plus de place pour tous ces variables.\n"); + exit(1); + } + else{ + listevars.ident[listevars.last] = malloc(strlen(nom)*sizeof(char)); + } -/* RS1 : Le labyrinthe doit avoir au moins 2 lignes et au moins 2 colonnes */ -int RS1(Point size){ - if (size.c >= 1 && size.l >= 1) - return 1; - printf("RS1 : Le labyrinthe doit avoir au moins 2 lignes et au moins 2 colonnes.\n"); - return 0; -} + strcpy(listevars.ident[listevars.last],nom); + listevars.val[listevars.last] = 1; + listevars.last++; + } -/* RS2_count : Le labyrinthe doit avoir une et une seule entrée */ -int RS2_count(int countE){ - if (countE == 1) - return 1; - printf("RS2 : Le labyrinthe doit avoir une et une seule entrée.\n"); - return 0; + return listevars; } -/* RS2_check : L'entrée ne peut être ni une sortie ni une entrée de trou de vers */ -int RS2_check(){ - /* A faire */ - return 0; +/******************************************************************************/ +/* Fonctions de base de listevarpoint */ +/******************************************************************************/ +varpoint init_listevarpoint(){ + varpoint res; + res.last = 0; + return res; } -/* RS3_count : Le labyrinthe doit avoir au moins une sortie */ -int RS3_count(int countS){ - if (countS >= 1) - return 1; - printf("RS3 : Le labyrinthe doit avoir au moins une sortie.\n"); - return 0; + +/* Vérifie si var est dans list : + * - si oui, renvoie l'indice correspondante + - sinon, renvoie -1 */ +int find_varpoint(char* var,varpoint list) { + int i; + int ret; + + for (i=0; i<list.last; i++) { + ret = strcmp(list.ident[i], var); + if (ret==0) { + return i; + } + } + return -1; } -/* RS3_check : La sortie ne peut être ni l'entrée ni une entrée de trou de vers */ -int RS3_check(){ - /* A faire */ - return 0; + +/* Renvoie la valeur de l'identifiant var dans la liste list */ +Point value_varpoint(char* var,varpoint list){ + int index = find_varpoint(var,list); + if (index == -1){ + fprintf(stderr,"Aucune valeur ne correspond à %s.\n",var); + exit(1); + } + return *(list.val[index]); } -/* RS4 : L'entrée et les sorties du labyrinthe doivent se situer sur la périphérie - * du labyrinthe - * E est le point d'entrée - * S est un tableau dynamique de l'ensemble des sorties - * nb_S est le nombre de sorties - * size est un point donnant la taille du tableau */ -int RS4(Point E, Point* S, int nb_S, Point size){ - int i; - Point tmp; - - if (S == NULL){ - fprintf(stderr,"RS4 : La liste des sorties est non initialisée.\n"); - exit(1); - } - - else if (nb_S == 0){ - printf("RS4 : La liste des sorties est vide.\n"); - return 0; - } - - /* Vérification pour l'entrée */ - else if (E.c != 0 && E.l != 0 && E.c != size.c && E.l != size.l){ - return 0; - } - - /* Vérification pour toutes les sorties */ - else { - for (i=0 ; i<nb_S ; i++){ - tmp = S[i]; - if (tmp.c != 0 && tmp.l != 0 && tmp.c != size.c && tmp.l != size.l){ - return 0; - } - } - } - return 1; - } - - -/* Test des fonctions pour les règles sémantiques */ -int main(){ - char*** matrice = create_matrice(5,6); - Point size = new_point(5,6); - - Point entree1 = new_point(0,0); - Point entree2 = new_point(5,6); - Point entree3 = new_point(5,0); - Point entree4 = new_point(0,5); - - change_val_matrice(entree1,"E",matrice); - change_val_matrice(entree2,"E",matrice); - change_val_matrice(entree3,"E",matrice); - change_val_matrice(entree4,"E",matrice); - - - Point* listeS = NULL; - listeS = calloc(1,sizeof(Point)); - listeS[0] = new_point(5,6); - /* A tester : pour plusieurs sorties */ - change_val_matrice(new_point(5,6),"S",matrice); - affichmat(matrice); - - printf("\nlisteS[0] : (%d,%d)\n",listeS[0].c, listeS[0].l); - - printf("Test entree1 : %d\n", RS4(entree1,listeS,1,size)); - printf("Test entree2 : %d\n", RS4(entree2,listeS,1,size)); - printf("Test entree3 : %d\n", RS4(entree3,listeS,1,size)); - printf("Test entree4 : %d\n", RS4(entree4,listeS,1,size)); +/* Modifie la valeur de la variable : + * - Si "nom" fait partie de la liste des variables, alors la variable est + * directement modifiée + * - Sinon rajoute le nom de la variable et sa valeur dans listevars + si la taille de listevars le permet */ +varpoint create_modif_varpoint(char* nom, Point val, varpoint list) { + int index = find_varpoint(nom,list); - return 0; -} + if (index != -1) + { + *(list.val[index]) = val; + } + + else{ + if (list.last > TAILLE) { + printf("Il n'y a plus de place pour tous ces variables.\n"); + exit(1); + } + else{ + list.ident[list.last] = malloc(strlen(nom)*sizeof(char)); + list.val[list.last] = malloc(sizeof(Point)); + } + + strcpy(list.ident[list.last],nom); + *(list.val[list.last]) = val; + list.last++; + } + return list; +} /* Test des fonctions de base de la matrice et de listevars */ -/*int main () { - char*** matrice = create_matrice(5,6); +int main() { + /* Tester varpoint */ + /*varpoint tmp; + Point* tmp_pt; + Point* tmp_pt2; + tmp_pt = new_point_ptr(2,3); + tmp_pt2 = new_point_ptr(2,4); + tmp = init_listevarpoint(); + tmp = create_modif_varpoint("IDENT",*tmp_pt,tmp); + tmp = create_modif_varpoint("IDENT",*tmp_pt2,tmp); + Point res_value = value_varpoint("IDENT",tmp); + printf("listevarpoint tmp : (%d,%d)\n",res_value.c,res_value.l);*/ + + /*variables listLAB; + variables listCOUNT; + listLAB = init_listevars(); + listLAB = create_modif_var("SIZEc",5,listLAB); + listLAB = create_modif_var("SIZEl",6,listLAB); + listCOUNT = increment_var("SIZE",listCOUNT); + listLAB = create_modif_var("INc",2,listLAB); + listLAB = create_modif_var("INl",0,listLAB); + listCOUNT = increment_var("IN",listCOUNT); + listLAB = create_modif_var("OUTc",5,listLAB); + listLAB = create_modif_var("OUTl",0,listLAB); + listCOUNT = increment_var("OUT",listCOUNT);*/ + + Point sizeLAB; + Point in; + Point** listOUT; + Point** listWALL; + Point** listTDV; + varpoint** listPM; + variables listCOUNT; + + sizeLAB = new_point(5,6); + in = new_point(2,0); + listOUT = init_tab(sizeLAB); + listOUT = add_tab(new_point(0,5),listOUT,0); + /*Ajouter paramètre incrémentation taille */ + listOUT = add_tab(new_point(5,0),listOUT,1); + + listWALL = init_tab(sizeLAB); + listWALL = add_tab(new_point(3,0),listWALL,0); + listWALL = add_tab(new_point(3,1),listWALL,1); + listWALL = add_tab(new_point(4,2),listWALL,2); + listWALL = add_tab(new_point(4,3),listWALL,3); + listWALL = add_tab(new_point(5,4),listWALL,4); + + listTDV = init_tab(sizeLAB); + listTDV = add_tab(new_point(3,4),listTDV,0); + listTDV = add_tab(new_point(2,5),listTDV,1); + listTDV = add_tab(new_point(0,1),listTDV,2); + listTDV = add_tab(new_point(0,3),listTDV,3); + + int taille = (sizeLAB.c+1)*(sizeLAB.l+1); + int i; + listPM = calloc(taille,sizeof(varpoint*)); + for (i=0 ; i<taille ; i++){ + listPM[i] = malloc(sizeof(varpoint)); + } + + *listPM[0] = init_listevarpoint(); + *listPM[0] = create_modif_varpoint("DEP",new_point(3,2),*listPM[0]); + *listPM[0] = create_modif_varpoint("W",new_point(0,0),*listPM[0]); + *listPM[0] = create_modif_varpoint("E",new_point(5,2),*listPM[0]); + + + listCOUNT = init_listevars(); + listCOUNT = increment_var("IN",listCOUNT); /*la fonction incrémente si points non identiques*/ + listCOUNT = increment_var("SIZE",listCOUNT); + listCOUNT = increment_var("OUT",listCOUNT); + listCOUNT = increment_var("OUT",listCOUNT); + listCOUNT = increment_var("WALL",listCOUNT); + listCOUNT = increment_var("WALL",listCOUNT); + listCOUNT = increment_var("WALL",listCOUNT); + listCOUNT = increment_var("WALL",listCOUNT); + listCOUNT = increment_var("WALL",listCOUNT); + listCOUNT = increment_var("TDV",listCOUNT); + listCOUNT = increment_var("TDV",listCOUNT); + listCOUNT = increment_var("TDV",listCOUNT); + listCOUNT = increment_var("TDV",listCOUNT); + listCOUNT = increment_var("PM",listCOUNT); /* on incrémente par porte d'entrée */ + + + show(sizeLAB,in,listOUT,listWALL,listTDV,listPM,listCOUNT); + + /*char*** matrice = create_matrice(5,6); Point p1 = new_point(4,2); printf("Point p1 (%d,%d)\n",p1.c,p1.l); @@ -282,23 +593,22 @@ int main(){ change_val_matrice(p1,"ABC",matrice); printf("Point p1 :%s\n", lecture(p1,matrice)); printf("\nAppel de la fonction change_val_matrice(p1,DEF)\n"); - change_val_matrice(p1, "DEF", matrice); + change_val_matrice(p1, "D", matrice); printf("Point p1 :%s\n", lecture(p1,matrice)); printf("\nTaille de la matrice : (%d,%d)\n",size.c,size.l); printf("Matrice correspondante :\n"); - affichmat(matrice); - - init_listevars(); - create_modif_var("IDENT",1); - create_modif_var("IDENT",2); - create_modif_var("IDENT",1); - create_modif_var("IDENT2",5); - printf("\n\nTaille listevars : %d\n",listevars.last); + affichmat(matrice,size); + + listevars = init_listevars(); + listevars = create_modif_var("IDENT",1,listevars); + listevars = create_modif_var("IDENT",2,listevars); + listevars = create_modif_var("IDENT",1,listevars); + listevars = create_modif_var("IDENT2",5,listevars); printf("Premier nom : %s\n",listevars.ident[0]); printf("Première valeur : %d\n",listevars.val[0]); printf("Deuxième nom : %s\n",listevars.ident[1]); - printf("Deuxième valeur : %d\n",listevars.val[1]); + printf("Deuxième valeur : %d\n",listevars.val[1]);*/ return 0; -}*/ +} diff --git a/Labgen/labgen.h b/Labgen/labgen.h index c943c52..68309da 100644 --- a/Labgen/labgen.h +++ b/Labgen/labgen.h @@ -1,6 +1,6 @@ -#include<stdio.h> -#include<stdlib.h> -#include<string.h> +#ifndef _LABGEN_H +#define _LABGEN_H + #define TAILLE 255 typedef struct { @@ -8,19 +8,54 @@ int c; int l; } Point; +typedef struct Point* point_ptr; + typedef struct { char* ident[TAILLE]; int val[TAILLE]; int last; } variables; +typedef struct { +char* ident[TAILLE]; +Point* val[TAILLE]; +int last; +} varpoint; + Point new_point(int ,int); +Point* new_point_ptr(int, int); char*** create_matrice(int,int); char* lecture(Point,char***); void change_val_matrice(Point,char*, char***); -void affichmat(char***); +void affichmat(char***,Point); + +variables init_listevars(); +int find_var(char*,variables); +int value_var(char*,variables); +variables create_modif_var(char*,int,variables); +variables increment_var(char*,variables); + +varpoint init_listevarpoint(); +int find_varpoint(char* var,varpoint list); +Point value_varpoint(char* var,varpoint list); +varpoint create_modif_varpoint(char* nom, Point val, varpoint list); + +Point** init_tab(Point size); +int equals_pt(Point pt1, Point pt2); +Point** add_tab(Point pt, Point** tab, int taille); + +void show(Point size, Point in, Point** listOUT, Point** listWALL, Point** listTDV, varpoint** listPM, variables listCOUNT); +int RS1(Point); +int RS2_count(int); +int RS3_count(int); +int RS2_3_check(Point E, Point* listeS, int sizeS, Point* listeETV, int sizeETV); +int RS4(Point E, Point* S, int nb_S, Point size); +int RS5(); /* A remodifier */ +int RS6(Point* listeETV, int sizeETV, Point sizeLAB); +int RS7(Point* listePM, int sizePM, Point sizeLAB); +int RS8_PTA(Point* listePTA, int sizePTA, Point sizeLAB); +int RS8_PTD(Point PTD, Point* wallptd, int sizeW, int* wallr, Point sizeLAB); +int RS8_R(Point PTA1, Point PTA2, Point sizeLAB); -void init_listevars(); -int find_var(char*); -void create_modif_var(char*,int); +#endif diff --git a/Labgen/labgen.o b/Labgen/labgen.o index faa8e7a8f832a1c5243512a18f60e5b1820c09fc..97b6c4cdb421dc5d3c4f9c66fb8ebd712b3ffb67 100644 GIT binary patch literal 10344 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 KLs6)Fvi|@gBURb} literal 5024 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 diff --git a/Labgen/labgen.y b/Labgen/labgen.y index fa40e20..b072f4f 100644 --- a/Labgen/labgen.y +++ b/Labgen/labgen.y @@ -10,20 +10,36 @@ FILE * yyin; FILE * yyout; char * yytext; //extern char *** matrice; -char *** matrice=NULL; +char *** matrice = NULL; extern variables listevars; + +/* listeLAB contient les infos sur le labyrinthe */ +extern variables listLAB; +/* listIDENT Contient la liste des IDENT (max par ex) et ses valeurs */ +extern variables listIDENT; +/* listCOUNT compte le nombre de points pour chaque identifiant + * Par exemple : 1 seul point pour IN et pour SIZE, 1 ou plus pour OUT*/ +extern variables listCOUNT; +/* listOUT contiendra toutes les sorties OUT */ +extern Point** listOUT; +extern Point size; +extern Point in; /*Point d'entrée du labyrinthe*/ + void yyerror(const char *); extern int yylineno; char file[255]; + %} -%union yylval -{ + + +%union { int cnum ; char* ident; char* op; char* dir; +struct Point* point; } @@ -35,6 +51,9 @@ char* dir; %token<cnum> OUT WALL PTD SHOW UNWALL END R F PTA FOR TOGGLE WH MD %token<op> OP %token<dir> DIR +%type<cnum> xcst +%type<point> pt + %left MULT DIV MOD @@ -43,18 +62,30 @@ char* dir; %% file: -listinstr +listinstr {listLAB = init_listevars(); + listIDENT = init_listevars(); + listCOUNT = init_listevars(); } ; -; listinstr: instruction |listinstr instruction ; + instruction: -IDENT '=' xcst END { } +IDENT '=' xcst END + { listIDENT = create_modif_var($1,$3,listIDENT); } |SIZE xcst END + { listCOUNT = increment_var("SIZE",listCOUNT); + listLAB = create_modif_var("SIZEc",$2,listLAB); + listLAB = create_modif_var("SIZEl",$2,listLAB); + size = new_point($2,$2); } |SIZE xcst ',' xcst END + { listCOUNT = increment_var("SIZE",listCOUNT); + listLAB = create_modif_var("SIZEc",$2,listLAB); + listLAB = create_modif_var("SIZEl",$4,listLAB); + size = new_point($2,$4); } |IN pt END + |WALL END |TOGGLE END |UNWALL END @@ -62,17 +93,12 @@ IDENT '=' xcst END { } |TOGGLE R pt pt END |UNWALL R pt pt END |SHOW { -printf("test\n"); matrice = create_matrice(5,4); -affichmat(matrice); +size = new_point(5,4); -point p1 = new_point(1,2); -change_val_matrice(p1, "ABC", matrice); -printf("%s\n", lecture(p1,matrice)); - -change_val_matrice(p1, "DEF", matrice); -printf("%s\n", lecture(p1,matrice)); -affichmat(matrice); +Point p1 = new_point(1,2); +change_val_matrice(p1, "E", matrice); +affichmat(matrice,size); } @@ -105,16 +131,16 @@ xcst */ xcst: -IDENT -|CNUM -|PLUS CNUM -|MOINS CNUM -| xcst PLUS xcst -|xcst MOINS xcst -|xcst MULT xcst -| xcst DIV xcst -| xcst MOD xcst -| '(' xcst ')' ; +IDENT {$$ = value_var($1,listIDENT);} +|CNUM {$$ = $1;} +|PLUS CNUM {$$ = $2;} +|MOINS CNUM {$$ = -$2;} +|xcst PLUS xcst {$$ = $1 + $3;} +|xcst MOINS xcst {$$ = $1 - $3;} +|xcst MULT xcst {$$ = $1 * $3;} +| xcst DIV xcst {$$ = $1 / $3;} +| xcst MOD xcst {$$ = $1 % $3;} +| '(' xcst ')' {$$ = $2;} ; @@ -160,7 +186,7 @@ r: "*" | xcst; -pt: '('xcst ',' xcst')' ; +pt: '('xcst ',' xcst')' {$$=new_point_ptr($2,$4);}; range: @@ -192,6 +218,7 @@ range %% + void yyerror(const char* mess){ fprintf(stderr," %s:%i:syntaxe error (near %s) \n", file,yylineno,yytext); exit(1); @@ -209,7 +236,7 @@ int main(int argc, char *argv[]){ printf("Reading input from file succeded: %s\n",argv[1]); yyin = fp; - listevars.last = 0; + /*listevars.last = 0;*/ yyparse(); } else { @@ -220,7 +247,8 @@ int main(int argc, char *argv[]){ else if (argc == 3){ - printf("A faire : lecture dans le fichier argc[1] + exécutable argc[2]\n"); + listLAB = init_listevars(); + printf("A faire : lecture dans le fichier argc[1] + exécutable argc[2]\n"); } else{ diff --git a/Labgen/labgen_RS.c b/Labgen/labgen_RS.c new file mode 100644 index 0000000..504511b --- /dev/null +++ b/Labgen/labgen_RS.c @@ -0,0 +1,349 @@ +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "labgen.h" + +/******************************************************************************/ +/* Règles sémantiques : + * Retourne 1 quand c'est correct + * Retourne 0 sinon */ +/******************************************************************************/ + +/* RS1 : Le labyrinthe doit avoir au moins 2 lignes et au moins 2 colonnes */ +int RS1(Point size){ + if (size.c >= 1 && size.l >= 1) + return 1; + printf("RS1 : Le labyrinthe doit avoir au moins 2 lignes et au moins 2 colonnes.\n"); + return 0; +} + +/* RS2_count : Le labyrinthe doit avoir une et une seule entrée */ +int RS2_count(int countE){ + if (countE == 1) + return 1; + printf("RS2 : Le labyrinthe doit avoir une et une seule entrée.\n"); + return 0; +} + + +/* RS3_count : Le labyrinthe doit avoir au moins une sortie */ +int RS3_count(int countS){ + if (countS >= 1) + return 1; + printf("RS3 : Le labyrinthe doit avoir au moins une sortie.\n"); + return 0; +} + + + +/* RS2_3_check : L'entrée ne peut être ni une sortie ni une entrée de trou de vers + * Les sorties ne peuvent être une entrée d'un trou de vers + * E est le point d'entrée + * listeS est la liste de toutes les sorties + * sizeS est la taille de listeS + * listeETV est la liste de toutes les entrées de trous de vers + * liste est la taille de listeETV */ +int RS2_3_check(Point E, Point* listeS, int sizeS, Point* listeETV, int sizeETV){ + int i,j; + int Ec = E.c; + int El = E.l; + Point tmpS, tmpETV; + + /* Vérifie que l'entrée ne correspond à aucune des entrées de trous de vers */ + for (j=0; j<sizeETV; j++){ + tmpETV = listeETV[j]; + if (Ec == tmpETV.c && El == tmpETV.l) + return 0; + } + + /* Vérifie que l'entrée ne correspond à aucune des sorties */ + for (i=0; i<sizeS; i++){ + tmpS = listeS[i]; + if (Ec == tmpS.c && El == tmpS.l) + return 0; + + /*Vérifie que la sortie ne correspond pas à une entrée de vers*/ + for (j=0; j<sizeETV; j++){ + tmpETV = listeETV[j]; + if (tmpETV.c == tmpS.c && tmpETV.l == tmpS.l) + return 0; + } + } + + return 1; +} + + +/* RS4 : L'entrée et les sorties du labyrinthe doivent se situer sur la périphérie + * du labyrinthe + * E est le point d'entrée + * S est un tableau dynamique de l'ensemble des sorties + * nb_S est le nombre de sorties + * size est un point donnant la taille du tableau */ +int RS4(Point E, Point* S, int nb_S, Point size){ + int i; + Point tmp; + int sizec = size.c; + int sizel = size.l; + + if (S == NULL){ + fprintf(stderr,"RS4 : La liste des sorties est non initialisée.\n"); + exit(1); + } + + else if (nb_S == 0){ + printf("RS4 : La liste des sorties est vide.\n"); + return 0; + } + + /* Vérification pour l'entrée */ + else if (E.c != 0 && E.l != 0 && E.c != sizec && E.l != sizel){ + return 0; + } + + /* Vérification pour toutes les sorties */ + else { + for (i=0 ; i<nb_S ; i++){ + tmp = S[i]; + if (tmp.c != 0 && tmp.l != 0 && tmp.c != sizec && tmp.l != sizel){ + return 0; + } + } + } + return 1; + } + + + /* RS5 : Tant que la taille du labyrinthe n'est pas définie, il est interdit : + * - de définir l'entrée ou des sorties + * - d'utiliser des instructions de tracé + * - De définir des portes magiques ou des trous de vers */ +int RS5(){ + /* A faire */ + return 0; +} + + +/* Cette fonction est une fonction auxiliaire qui permet de vérifier si + * l'ensemble des points de la liste sont dans le labyrinthe. + * - liste est la liste de tous les points + * - sizeL est la longueur de la liste + * - sizeLAB est la taile du labyrinthe */ +int danslelaby(Point* liste, int sizeL, Point sizeLAB, char* msg){ + int i; + Point tmp; + int sizec = sizeLAB.c; + int sizel = sizeLAB.l; + + if (sizeL == 0){ + printf("La liste des %s est vide.\n",msg); + return 1; + /* Vrai car le labyrinthe peut ne pas contenir d'ETV, de PM ou de murs */ + } + + for (i=0; i<sizeL; i++){ + tmp = liste[i]; + if (tmp.c < 0 || tmp.c > sizec || tmp.l < 0 || tmp.l > sizel) + return 0; + } + return 1; +} + + +/* RS6 : L'entrée et la sortie des trous de vers doivent être dans le + * labyrinthe + * listeETV contient la liste de toutes les entrées et sorties de vers + * sizeETV est la longueur de listeETV + * sizeLAB est la taille du labyrinthe */ +int RS6(Point* listeETV, int sizeETV, Point sizeLAB){ + return danslelaby(listeETV,sizeETV,sizeLAB,"entrées de vers"); +} + + +/* RS7 : L'entrée et les sorties des portes magiques doivent être dans le + labyrinthe + * listePM est la liste des entrées et sorties des portes magiques + * sizePM est la longueur de listePM + * sizeLAB est la taille du labyrinthe */ + int RS7(Point* listePM, int sizePM, Point sizeLAB){ + return danslelaby(listePM,sizePM,sizeLAB,"portes magiques"); + } + + +/* RS8_PTA : Pour les tracés de murs les points définis par l'instruction + * WALL PTA doivent être dans le labyrinthe + * listePTA est la liste de tous les murs définis par PTA + * sizePTA est la longueur de listePTA + * sizeLAB est la taille du labyrinthe */ +int RS8_PTA(Point* listePTA, int sizePTA, Point sizeLAB){ + return danslelaby(listePTA,sizePTA,sizeLAB,"murs définis par PTA"); +} + + +/* RS8_PTD : Pour les tracés de murs les points définis par l'instruction + * WALL PTD doivent être dans le labyrinthe + * PTD est le point de départ + * wallptd est la liste des points donnant le déplacement + * wallr est la liste d'entiers, éventuellement nuls, donnant le nombre de + * de déplacement pour chaque point wallptd. + * On suppose que les listes wallptd et wallr ont la même taille + * sizeW donne la longueur de la liste wallptd + * sizeLAB est la taille du labyrinthe */ +int RS8_PTD(Point PTD, Point* wallptd, int sizeW, int* wallr, Point sizeLAB){ + int sizec = sizeLAB.c; + int sizel = sizeLAB.l; + int i,j; + Point res; + Point tmpW; + int tmpR; + + /* On vérifie que le point de départ est dans le labyrinthe */ + if (PTD.c < 0 || PTD.c > sizec || PTD.l < 0 || PTD.l > sizel) + return 0; + /* On vérifie que le déplacement ne nous fait pas sortir du labyrinthe */ + res = PTD; + for (i=0; i<sizeW; i++){ + tmpW = wallptd[i]; + tmpR = wallr[i]; + res.c += tmpW.c; + res.l += tmpW.l; + if (res.c < 0 || res.c > sizec || res.l < 0 || res.l > sizel) + return 0; + if (tmpR > 1){ + for (j=1; j<tmpR; j++){ /*On le fait bien tmpR-1 fois car on a déjà fait 1 fois avant */ + res.c += tmpW.c; + res.l += tmpW.l; + if (res.c < 0 || res.c > sizec || res.l < 0 || res.l > sizel) + return 0; + } + } + } + + return 1; +} + + +/* RS8_R : Pour les tracés de murs les points définis par l'instruction WALL R + * doivent être dans le labyrinthe + * PTA1 est le premier point définissant le mur, PTA2 le deuxième + * sizeLAB est la taille du labyrinthe */ +int RS8_R(Point PTA1, Point PTA2, Point sizeLAB){ + int sizec = sizeLAB.c; + int sizel = sizeLAB.l; + + if (PTA1.c < 0 || PTA1.c > sizec || PTA1.l < 0 || PTA1.l > sizel) + return 0; + if (PTA2.c < 0 || PTA2.c > sizec || PTA2.l < 0 || PTA2.l > sizel) + return 0; + return 1; +} + +int RS8_FOR(){ + /* A faire */ + return 0; +} + +int RS8_1F(){ + /* A faire */ + return 0; +} + +int RS9(){ + /* A faire */ + return 0; +} + +int RS10(){ + /* A faire */ + return 0; +} + +int RS11(){ + /* A faire */ + return 0; +} + +/* Test des fonctions pour les règles sémantiques */ +int main(){ + char*** matrice = create_matrice(5,6); + Point size = new_point(5,6); + + Point entree1 = new_point(0,0); + Point entree2 = new_point(5,6); + Point entree3 = new_point(5,0); + Point entree4 = new_point(0,5); + + change_val_matrice(entree1,"E",matrice); + change_val_matrice(entree2,"E",matrice); + change_val_matrice(entree3,"E",matrice); + change_val_matrice(entree4,"E",matrice); + + Point* listeS = NULL; + listeS = calloc(5,sizeof(Point)); + listeS[0] = new_point(5,5); + listeS[1] = new_point(3,6); + listeS[2] = new_point(0,0); + listeS[3] = new_point(0,4); + listeS[4] = new_point(1,6); + + Point* listeETV = NULL; + listeETV = calloc(6,sizeof(Point)); + listeETV[0] = new_point(2,4); + listeETV[1] = new_point(1,0); + listeETV[2] = new_point(1,1); + listeETV[3] = new_point(4,3); + listeETV[4] = new_point(5,6); + listeETV[5] = new_point(0,7); + + Point* listePM = NULL; + listePM = calloc(6,sizeof(Point)); + listePM[0] = new_point(2,4); + listePM[1] = new_point(1,0); + listePM[2] = new_point(1,1); + listePM[3] = new_point(4,3); + listePM[4] = new_point(5,6); + listePM[5] = new_point(0,7); + + Point* wallPTD = NULL; + wallPTD = calloc(5,sizeof(Point)); + wallPTD[0] = new_point(1,-1); + wallPTD[1] = new_point(0,1); + wallPTD[2] = new_point(1,0); + wallPTD[3] = new_point(1,1); + wallPTD[4] = new_point(1,0); + + int* wallr = NULL; + wallr = calloc(5,sizeof(int)); + wallr[0] = 0; + wallr[1] = 3; + wallr[2] = 0; + wallr[3] = 0; + wallr[4] = 2; + + + change_val_matrice(new_point(5,5),"S",matrice); + change_val_matrice(new_point(5,6),"S",matrice); + change_val_matrice(new_point(0,0),"S",matrice); + change_val_matrice(new_point(0,4),"S",matrice); + change_val_matrice(new_point(1,6),"S",matrice); + + affichmat(matrice,size); + + printf("Test RS2_check - entree1 : %d [0]\n", RS2_3_check(entree1,listeS,5,listeETV,5)); + printf("Test RS2_check - entree2 : %d [0]\n", RS2_3_check(entree2,listeS,5,listeETV,5)); + printf("Test RS2_check - entree3 : %d [1]\n", RS2_3_check(entree3,listeS,5,listeETV,5)); + printf("Test RS2_check - entree4 : %d [1]\n", RS2_3_check(entree4,listeS,5,listeETV,5)); + printf("Test RS4 - entree1 : %d [1]\n", RS4(entree1,listeS,5,size)); + printf("Test RS4 - entree2 : %d [1]\n", RS4(entree2,listeS,5,size)); + printf("Test RS4 - entree3 : %d [1]\n", RS4(entree3,listeS,5,size)); + printf("Test RS4 - entree4 : %d [1]\n", RS4(entree4,listeS,5,size)); + printf("Test RS6 : %d [1]\n", RS6(listeETV,5,size)); + printf("Test RS6 : %d [0]\n", RS6(listeETV,6,size)); + printf("Test RS7 : %d [1]\n", RS6(listePM,5,size)); + printf("Test RS7 : %d [0]\n", RS6(listePM,6,size)); + printf("Test RS8_PTD : %d [1]\n",RS8_PTD(new_point(0,2),wallPTD,5,wallr,size)); + + + return 0; +} diff --git a/Labgen/labgen_varpoint.c b/Labgen/labgen_varpoint.c new file mode 100644 index 0000000..9534e93 --- /dev/null +++ b/Labgen/labgen_varpoint.c @@ -0,0 +1,74 @@ +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include "labgen.h" + +/******************************************************************************/ +/* Fonctions de base de listevarpoint */ +/******************************************************************************/ +varpoint init_listevarpoint(){ + varpoint res; + res.last = 0; + return res; +} + + +/* Vérifie si var est dans list : + * - si oui, renvoie l'indice correspondante + - sinon, renvoie -1 */ +int find_varpoint(char* var,varpoint list) { + int i; + int ret; + + for (i=0; i<list.last; i++) { + ret = strcmp(list.ident[i], var); + if (ret==0) { + return i; + } + } + return -1; +} + + +/* Renvoie la valeur de l'identifiant var dans la liste list */ +Point value_varpoint(char* var,varpoint list){ + int index = find_varpoint(var,list); + if (index == -1){ + fprintf(stderr,"Aucune valeur ne correspond à %s.\n",var); + exit(1); + } + return *(list.val[index]); +} + + +/* Modifie la valeur de la variable : + * - Si "nom" fait partie de la liste des variables, alors la variable est + * directement modifiée + * - Sinon rajoute le nom de la variable et sa valeur dans listevars + si la taille de listevars le permet */ +varpoint create_modif_varpoint(char* nom, Point val, varpoint list) { + int index = find_varpoint(nom,list); + + if (index != -1) + { + *(list.val[index]) = val; + } + + else{ + if (list.last > TAILLE) { + printf("Il n'y a plus de place pour tous ces variables.\n"); + exit(1); + } + else{ + list.ident[list.last] = malloc(strlen(nom)*sizeof(char)); + list.val[list.last] = malloc(sizeof(Point)); + } + + strcpy(list.ident[list.last],nom); + *(list.val[list.last]) = val; + list.last++; + } + return list; + +} diff --git a/Labgen/test b/Labgen/test new file mode 100644 index 0000000..d0d7037 --- /dev/null +++ b/Labgen/test @@ -0,0 +1,2 @@ +SIZE 4; +SHOW; diff --git a/Labgen/y.tab.c b/Labgen/y.tab.c index 68d77cd..ff53872 100644 --- a/Labgen/y.tab.c +++ b/Labgen/y.tab.c @@ -74,15 +74,29 @@ FILE * yyin; FILE * yyout; char * yytext; //extern char *** matrice; -char *** matrice=NULL; +char *** matrice = NULL; extern variables listevars; + +/* listeLAB contient les infos sur le labyrinthe */ +extern variables listLAB; +/* listIDENT Contient la liste des IDENT (max par ex) et ses valeurs */ +extern variables listIDENT; +/* listCOUNT compte le nombre de points pour chaque identifiant + * Par exemple : 1 seul point pour IN et pour SIZE, 1 ou plus pour OUT*/ +extern variables listCOUNT; +/* listOUT contiendra toutes les sorties OUT */ +extern Point** listOUT; +extern Point size; +extern Point in; /*Point d'entrée du labyrinthe*/ + void yyerror(const char *); extern int yylineno; char file[255]; -#line 86 "y.tab.c" /* yacc.c:339 */ + +#line 100 "y.tab.c" /* yacc.c:339 */ # ifndef YY_NULLPTR # if defined __cplusplus && 201103L <= __cplusplus @@ -173,20 +187,21 @@ extern int yydebug; /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -#line 21 "labgen.y" /* yacc.c:355 */ -union yylval + +union YYSTYPE { -#line 22 "labgen.y" /* yacc.c:355 */ +#line 37 "labgen.y" /* yacc.c:355 */ int cnum ; char* ident; char* op; char* dir; +struct Point* point; -#line 187 "y.tab.c" /* yacc.c:355 */ +#line 202 "y.tab.c" /* yacc.c:355 */ }; -#line 21 "labgen.y" /* yacc.c:355 */ -typedef union yylval YYSTYPE; + +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif @@ -200,7 +215,7 @@ int yyparse (void); /* Copy the second part of user declarations. */ -#line 204 "y.tab.c" /* yacc.c:358 */ +#line 219 "y.tab.c" /* yacc.c:358 */ #ifdef short # undef short @@ -500,14 +515,14 @@ static const yytype_uint8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 46, 46, 50, 51, 54, 55, 56, 57, 58, - 59, 60, 61, 62, 63, 64, 80, 81, 82, 83, - 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, - 94, 95, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 124, 125, 128, 129, 133, 134, 137, 138, - 139, 140, 147, 148, 149, 150, 153, 154, 155, 156, - 160, 161, 163, 167, 168, 169, 170, 173, 174, 178, - 179, 183, 184, 187, 188 + 0, 65, 65, 70, 71, 75, 77, 82, 87, 89, + 90, 91, 92, 93, 94, 95, 106, 107, 108, 109, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 134, 135, 136, 137, 138, 139, 140, 141, + 142, 143, 150, 151, 154, 155, 159, 160, 163, 164, + 165, 166, 173, 174, 175, 176, 179, 180, 181, 182, + 186, 187, 189, 193, 194, 195, 196, 199, 200, 204, + 205, 209, 210, 213, 214 }; #endif @@ -1393,33 +1408,120 @@ yyreduce: YY_REDUCE_PRINT (yyn); switch (yyn) { - case 5: -#line 54 "labgen.y" /* yacc.c:1646 */ - { } -#line 1400 "y.tab.c" /* yacc.c:1646 */ + case 2: +#line 65 "labgen.y" /* yacc.c:1646 */ + {listLAB = init_listevars(); + listIDENT = init_listevars(); + listCOUNT = init_listevars(); } +#line 1417 "y.tab.c" /* yacc.c:1646 */ + break; + + case 5: +#line 76 "labgen.y" /* yacc.c:1646 */ + { listIDENT = create_modif_var((yyvsp[-3].ident),(yyvsp[-1].cnum),listIDENT); } +#line 1423 "y.tab.c" /* yacc.c:1646 */ + break; + + case 6: +#line 78 "labgen.y" /* yacc.c:1646 */ + { listCOUNT = increment_var("SIZE",listCOUNT); + listLAB = create_modif_var("SIZEc",(yyvsp[-1].cnum),listLAB); + listLAB = create_modif_var("SIZEl",(yyvsp[-1].cnum),listLAB); + size = new_point((yyvsp[-1].cnum),(yyvsp[-1].cnum)); } +#line 1432 "y.tab.c" /* yacc.c:1646 */ + break; + + case 7: +#line 83 "labgen.y" /* yacc.c:1646 */ + { listCOUNT = increment_var("SIZE",listCOUNT); + listLAB = create_modif_var("SIZEc",(yyvsp[-3].cnum),listLAB); + listLAB = create_modif_var("SIZEl",(yyvsp[-1].cnum),listLAB); + size = new_point((yyvsp[-3].cnum),(yyvsp[-1].cnum)); } +#line 1441 "y.tab.c" /* yacc.c:1646 */ break; case 15: -#line 64 "labgen.y" /* yacc.c:1646 */ +#line 95 "labgen.y" /* yacc.c:1646 */ { -printf("test\n"); matrice = create_matrice(5,4); -affichmat(matrice); - -point p1 = new_point(1,2); -change_val_matrice(p1, "ABC", matrice); -printf("%s\n", lecture(p1,matrice)); +size = new_point(5,4); -change_val_matrice(p1, "DEF", matrice); -printf("%s\n", lecture(p1,matrice)); -affichmat(matrice); +Point p1 = new_point(1,2); +change_val_matrice(p1, "E", matrice); +affichmat(matrice,size); } -#line 1419 "y.tab.c" /* yacc.c:1646 */ +#line 1455 "y.tab.c" /* yacc.c:1646 */ break; + case 32: +#line 134 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = value_var((yyvsp[0].ident),listIDENT);} +#line 1461 "y.tab.c" /* yacc.c:1646 */ + break; -#line 1423 "y.tab.c" /* yacc.c:1646 */ + case 33: +#line 135 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[0].cnum);} +#line 1467 "y.tab.c" /* yacc.c:1646 */ + break; + + case 34: +#line 136 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[0].cnum);} +#line 1473 "y.tab.c" /* yacc.c:1646 */ + break; + + case 35: +#line 137 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = -(yyvsp[0].cnum);} +#line 1479 "y.tab.c" /* yacc.c:1646 */ + break; + + case 36: +#line 138 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[-2].cnum) + (yyvsp[0].cnum);} +#line 1485 "y.tab.c" /* yacc.c:1646 */ + break; + + case 37: +#line 139 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[-2].cnum) - (yyvsp[0].cnum);} +#line 1491 "y.tab.c" /* yacc.c:1646 */ + break; + + case 38: +#line 140 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[-2].cnum) * (yyvsp[0].cnum);} +#line 1497 "y.tab.c" /* yacc.c:1646 */ + break; + + case 39: +#line 141 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[-2].cnum) / (yyvsp[0].cnum);} +#line 1503 "y.tab.c" /* yacc.c:1646 */ + break; + + case 40: +#line 142 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[-2].cnum) % (yyvsp[0].cnum);} +#line 1509 "y.tab.c" /* yacc.c:1646 */ + break; + + case 41: +#line 143 "labgen.y" /* yacc.c:1646 */ + {(yyval.cnum) = (yyvsp[-1].cnum);} +#line 1515 "y.tab.c" /* yacc.c:1646 */ + break; + + case 62: +#line 189 "labgen.y" /* yacc.c:1646 */ + {(yyval.point)=new_point_ptr((yyvsp[-3].cnum),(yyvsp[-1].cnum));} +#line 1521 "y.tab.c" /* yacc.c:1646 */ + break; + + +#line 1525 "y.tab.c" /* yacc.c:1646 */ default: break; } /* User semantic actions sometimes alter yychar, and that requires @@ -1647,7 +1749,8 @@ yyreturn: #endif return yyresult; } -#line 194 "labgen.y" /* yacc.c:1906 */ +#line 220 "labgen.y" /* yacc.c:1906 */ + void yyerror(const char* mess){ fprintf(stderr," %s:%i:syntaxe error (near %s) \n", file,yylineno,yytext); @@ -1666,7 +1769,7 @@ int main(int argc, char *argv[]){ printf("Reading input from file succeded: %s\n",argv[1]); yyin = fp; - listevars.last=0; + /*listevars.last = 0;*/ yyparse(); } else { @@ -1677,7 +1780,8 @@ int main(int argc, char *argv[]){ else if (argc == 3){ - printf("A faire : lecture dans le fichier argc[1] + exécutable argc[2]\n"); + listLAB = init_listevars(); + printf("A faire : lecture dans le fichier argc[1] + exécutable argc[2]\n"); } else{ diff --git a/Labgen/y.tab.h b/Labgen/y.tab.h index f28a282..d27ac00 100644 --- a/Labgen/y.tab.h +++ b/Labgen/y.tab.h @@ -101,20 +101,21 @@ extern int yydebug; /* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -#line 21 "labgen.y" /* yacc.c:1909 */ -union yylval + +union YYSTYPE { -#line 22 "labgen.y" /* yacc.c:1909 */ +#line 37 "labgen.y" /* yacc.c:1909 */ int cnum ; char* ident; char* op; char* dir; +struct Point* point; -#line 115 "y.tab.h" /* yacc.c:1909 */ +#line 116 "y.tab.h" /* yacc.c:1909 */ }; -#line 21 "labgen.y" /* yacc.c:1909 */ -typedef union yylval YYSTYPE; + +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 # define YYSTYPE_IS_DECLARED 1 #endif diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..53421a5a8971839aafa1be1bb57b6fb3d2ea8f74 GIT binary patch literal 22664 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 DWLHbX literal 0 HcmV?d00001 -- GitLab