⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbtab.c

📁 Creation d un mini-interpreteur C
💻 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 + -