Промењен систем за руковање грешкама

This commit is contained in:
kappa 2019-01-16 23:24:23 +01:00
parent ecba64be1b
commit 0bbdb0a68a
5 changed files with 41 additions and 29 deletions

34
eval.c
View file

@ -4,14 +4,6 @@
#include "util.h"
char *improperListError = "Конс објекат мора бити правилна листа да би\
могао бити евалуиран";
char *typeError = "Неправилан тип аргумента прослеђен функцији";
char *unrecognizedSymbolError = "Непознати симбол";
char *notApplicableError = "Објекат није примењив";
char *divisionByZeroError = "Дељење нулом";
char *argumentNumberError = "Функцији није прослеђен правилан број аргумената";
object apply(object function, object parameters);
object eval(object input)
@ -32,7 +24,7 @@ object eval(object input)
{
deleteObject(input);
TYPE(result) = errorObject;
ERRMSG(result) = unrecognizedSymbolError;
ERR(result) = unrecognizedSymbolError;
}
}
else if (TYPE(input) == consObject)
@ -41,7 +33,7 @@ object eval(object input)
{
deleteObject(input);
TYPE(result) = errorObject;
ERRMSG(result) = improperListError;
ERR(result) = improperListError;
}
object *currentCell = &input;
@ -54,7 +46,7 @@ object eval(object input)
{
noErrors = 0;
TYPE(result) = errorObject;
ERRMSG(result) = ERRMSG(CAR(*currentCell));
ERR(result) = ERR(CAR(*currentCell));
break;
}
currentCell = &CDR(*currentCell);
@ -83,7 +75,7 @@ object apply(object function, object parameters)
{
deleteObject(function);
TYPE(result) = errorObject;
ERRMSG(result) = notApplicableError;
ERR(result) = notApplicableError;
}
/* TODO Ово налажење ће се касније извршавати кроз табелу симбола */
else if (!strcmp(SYM(function), "+"))
@ -106,7 +98,7 @@ object apply(object function, object parameters)
{
deleteObject(function);
TYPE(result) = errorObject;
ERRMSG(result) = improperListError;
ERR(result) = improperListError;
}
return result;
@ -134,7 +126,7 @@ object add(object parameters)
if (!allNumbers(parameters))
{
TYPE(result) = errorObject;
ERRMSG(result) = typeError;
ERR(result) = typeError;
}
else if (listLength(parameters) == 0)
{
@ -160,12 +152,12 @@ object subtract(object parameters)
if (!allNumbers(parameters))
{
TYPE(result) = errorObject;
ERRMSG(result) = typeError;
ERR(result) = typeError;
}
else if (listLength(parameters) == 0)
{
TYPE(result) = errorObject;
ERRMSG(result) = argumentNumberError;
ERR(result) = argumentNumberError;
}
else if (listLength(parameters) == 1)
{
@ -187,7 +179,7 @@ object multiply(object parameters)
if (!allNumbers(parameters))
{
TYPE(result) = errorObject;
ERRMSG(result) = typeError;
ERR(result) = typeError;
}
else if (listLength(parameters) == 0)
{
@ -213,12 +205,12 @@ object divide(object parameters)
if (!allNumbers(parameters))
{
TYPE(result) = errorObject;
ERRMSG(result) = typeError;
ERR(result) = typeError;
}
else if (listLength(parameters) == 0)
{
TYPE(result) = errorObject;
ERRMSG(result) = argumentNumberError;
ERR(result) = argumentNumberError;
}
else if (listLength(parameters) == 1)
{
@ -229,7 +221,7 @@ object divide(object parameters)
else
{
TYPE(result) = errorObject;
ERRMSG(result) = divisionByZeroError;
ERR(result) = divisionByZeroError;
}
}
else
@ -241,7 +233,7 @@ object divide(object parameters)
else
{
TYPE(result) = errorObject;
ERRMSG(result) = divisionByZeroError;
ERR(result) = divisionByZeroError;
}
}

12
print.c
View file

@ -2,13 +2,23 @@
#include "util.h"
char *errors[] =
{
"Конс објекат мора бити правилна листа да би могао бити евалуиран",
"Неправилан тип аргумента прослеђен функцији",
"Непознати симбол",
"Објекат није примењив",
"Дељење нулом",
"Функцији није прослеђен правилан број аргумената"
};
void printValue(object input);
void print(object input)
{
if (input.type == errorObject)
{
fprintf(stderr, "\nГРЕШКА: %s\n\n", ERRMSG(input));
fprintf(stderr, "\nГРЕШКА: %s\n\n", errors[ERR(input)]);
}
else
{

2
read.c
View file

@ -140,7 +140,7 @@ token *lex1Token(char *input, int *i)
regcomp(&regSpace, "^[[:space:]]*", REG_EXTENDED);
regcomp(&regNumber, "^[-+]?[[:digit:]]+", REG_EXTENDED);
regcomp(&regSymbol, "^[-+/*[:alpha:]][-+/*[:alnum:]]*", REG_EXTENDED);
regcomp(&regSymbol, "^[-+/*[:alnum:]]+", REG_EXTENDED);
regcomp(&regLParenthesis, "^\\(", REG_EXTENDED);
regcomp(&regRParenthesis, "^\\)", REG_EXTENDED);

2
util.c
View file

@ -49,7 +49,7 @@ object copyObject(object input)
TYPE(result) = TYPE(input);
if (TYPE(input) == errorObject)
{
ERRMSG(result) = ERRMSG(input);
ERR(result) = ERR(input);
}
else if (TYPE(input) == numberObject)
{

20
util.h
View file

@ -7,10 +7,7 @@
#define CDR(x) (((x).value.consCell)->cdr)
#define NUM(x) ((x).value.number)
#define SYM(x) ((x).value.symbol)
#define ERRMSG(x) ((x).value.errmsg)
typedef struct object object;
typedef struct cons cons;
#define ERR(x) ((x).value.err)
typedef enum
{
@ -21,12 +18,25 @@ typedef enum
errorObject
} dataType;
typedef enum
{
improperListError,
typeError,
unrecognizedSymbolError,
notApplicableError,
divisionByZeroError,
argumentNumberError
} error;
typedef struct object object;
typedef struct cons cons;
struct object
{
dataType type;
union
{
char *errmsg;
error err;
char *symbol;
long long int number;
cons *consCell;