diff --git a/eval.c b/eval.c index b15f79a..71599a7 100644 --- a/eval.c +++ b/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; } } diff --git a/print.c b/print.c index 0116963..0b66d2d 100644 --- a/print.c +++ b/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 { diff --git a/read.c b/read.c index e56ee30..df855a8 100644 --- a/read.c +++ b/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); diff --git a/util.c b/util.c index 72395f2..f520c58 100644 --- a/util.c +++ b/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) { diff --git a/util.h b/util.h index ee2d640..312c631 100644 --- a/util.h +++ b/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;