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

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

12
print.c
View file

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

2
read.c
View file

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

2
util.c
View file

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

20
util.h
View file

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