Промењен систем за руковање грешкама
This commit is contained in:
parent
ecba64be1b
commit
0bbdb0a68a
34
eval.c
34
eval.c
|
@ -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
12
print.c
|
@ -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
2
read.c
|
@ -140,7 +140,7 @@ token *lex1Token(char *input, int *i)
|
|||
regcomp(®Space, "^[[:space:]]*", REG_EXTENDED);
|
||||
|
||||
regcomp(®Number, "^[-+]?[[:digit:]]+", REG_EXTENDED);
|
||||
regcomp(®Symbol, "^[-+/*[:alpha:]][-+/*[:alnum:]]*", REG_EXTENDED);
|
||||
regcomp(®Symbol, "^[-+/*[:alnum:]]+", REG_EXTENDED);
|
||||
regcomp(®LParenthesis, "^\\(", REG_EXTENDED);
|
||||
regcomp(®RParenthesis, "^\\)", REG_EXTENDED);
|
||||
|
||||
|
|
2
util.c
2
util.c
|
@ -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
20
util.h
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue