📄 symbtab.c
字号:
/* Symbtab.c realisee par Grobost Frederick */#include <symbtab.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <assert.h>#include <malloc.h>/* On cree une nouvelle structure pour stocker les variables que le programme va utiliser, chaque variable possedant un nom et une valeur, et sachant son voisin */typedef struct variable_ *variable; struct variable_ { char * name; int value; variable next; };variable var1; /* notre premiere variable de notre liste */variable NIL; /* variable nulle *//* ---- On va creer des variables afin de traiter les operations demandees ----*//* On cree une variable avec nom, valeur et variable suivante */variable creationvar(char * name, int value, variable next) { assert(name!=NULL); variable newvar; newvar = (variable)malloc(sizeof(struct variable_)); newvar -> name = name; newvar -> value = value; newvar -> next = next; return newvar;}/* On renvoie la variable actuelle, utilisee en dernier */variable currentvar() { variable currentvar; currentvar = var1; while(currentvar -> next != NIL) currentvar = currentvar -> next; return currentvar;}/* On recherche la variable qui possede le nom specifiee */variable seekvar (char * name) { assert(name != NULL); variable currentvar; currentvar = var1; while (strcmp(currentvar->name,name)) /* renvoie 0 si vraie */ currentvar = currentvar->next; return currentvar;}/* -- On definie les fonctions qui manipuleront la table -- *//* -----Retourne 1 si name existe dans la table, 0 sinon ---- */extern int symbtabIsMember (char *name){ assert(name != NULL); variable currentvar; currentvar = var1; if(currentvar == NIL) /* Cas ou la table est vide */ return 0; else { while ((strcmp (currentvar -> name,name) ) && (currentvar -> next != NIL)) /*teste toutes les variables, on teste la variable suivante si strcmp renvoie 1,cad pas de concordance, et si il reste encore des variables a tester */ currentvar = currentvar -> next; if (!strcmp(currentvar->name,name)) return 1; else return 0; /* Cas ou le nom n'existe pas */ } return 0;}/* ---- Fonction permettant d'ajouter un nouvel element a la table ---- *//* Contrat: name n'existe pas deja dans la table */extern void symbtabAddElt (char * name, int value) { assert(name != NULL); if (!symbtabIsMember(name)) { variable var; if ( var1 == NIL ) // La table est vide var1 = creationvar(name, value, NIL); /* On cree la premiere variable */ else { var = currentvar(); /* On se deplace jusqu'a la derniere variable */ var -> next = creationvar(name, value, NIL); /* et on cree la suivante*/ } } else printf("La variable de nom %s existe deja dans la table des symboles.", name);} /* ---- Fonction retournant la valeur de la variable "name" ---- */ /* Contrat: name existe dans la table*/extern int symbtabGetValue (char * name) { assert(name != NULL); if(symbtabIsMember (name)){ variable currentvar; currentvar = seekvar (name); return (currentvar -> value); } else return 0;}/* ---- Fonction mettant a jour la valeur de la variable "name" ---- *//* Contrat: name doit deja exister dans la table */extern void symbtabUpdate(char * name, int value){ assert(name != NULL); if(symbtabIsMember (name)){ variable currentvar; currentvar = seekvar (name); currentvar -> value = value; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -