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