diff --git a/README.md b/README.md index 8a2ef8c..11722cb 100644 --- a/README.md +++ b/README.md @@ -29,14 +29,16 @@ ToDo List: - [X] add modulus operator '%' - [ ] add support for multiple characters operators - [ ] add inclusive operators like '!=', '>=', '<=' -- [ ] add input_number() std function +- [ ] add support for priority operators +- [X] add input_number() std function - [ ] add type() std function - [ ] add ceil() and floor() std functions - [X] base of the CLI - [ ] evaluate expression from stdin - [X] read a file - [X] if statements -- [ ] while statements (with break and continue) +- [X] while statements (with break and continue) +- [ ] repeat statement - [ ] add functions support - [ ] add config header file - [ ] ability to modify keywords and customize the lang @@ -141,6 +143,8 @@ abs(nb) sqrt,sin,cos,exp,ln,log etc. print_number(nb) input_number() +ceil(nb) +floor(nb) random_int(min, max) random_float(min, max) type(var) -> return the type of a var as int diff --git a/examples/input_and_compute.ltor b/examples/input_and_compute.ltor index 8fcaad8..e093c14 100644 --- a/examples/input_and_compute.ltor +++ b/examples/input_and_compute.ltor @@ -2,5 +2,4 @@ set a to input_number() set b to input_number() set res to a+b - -print_int(res) +print_number(res) diff --git a/examples/sandbox.ltor b/examples/sandbox.ltor index ba642e2..250378f 100644 --- a/examples/sandbox.ltor +++ b/examples/sandbox.ltor @@ -1,2 +1,3 @@ -# test modulus operator -print_number(20.2 % 10) +set a to input_number() +print_number(a) + diff --git a/src/evaluator.c b/src/evaluator.c index 5f1796c..9ad577b 100644 --- a/src/evaluator.c +++ b/src/evaluator.c @@ -536,7 +536,7 @@ int evaluate(struct StateContainer* state, char* inputStr, int* resultPtr, unsig // parse float success list_set(&evalList, evalList.num_elements, TYPE_FLOAT, &res); } - } + } if (st != 0) { // identify token @@ -623,6 +623,10 @@ int evaluate(struct StateContainer* state, char* inputStr, int* resultPtr, unsig int typeRes = list_get_type(&evalList, 0); *typePtr = typeRes; list_get(&evalList, 0, resultPtr); + if (EVALUATOR_DEBUG_LEVEL >= 2) { + printf("End of evaluation, dumping evalList: \n"); + list_print(&evalList); + } return 0; } diff --git a/src/funcs.c b/src/funcs.c index d998e34..8249449 100644 --- a/src/funcs.c +++ b/src/funcs.c @@ -80,6 +80,36 @@ int print_newline_impl(int* res, unsigned char* resType, unsigned char* types, i return 0; } +int input_number_impl(int* res, unsigned char* resType, unsigned char* types, int* args) +{ + printf("? "); + + char* line; + size_t len = 0; + size_t lineSize = 0; + + lineSize = getline(&line, &len, stdin); + + // printf("len=%d, lineSize=%d '%s' \n", len, lineSize, line); + + char* toParse[lineSize+1]; + str_extract(toParse, line, 0, lineSize-1); + + int st = parse_int(toParse, res); + if (st == 0) { + *resType = TYPE_INT; + return 0; + } + if (st != 0) { + st = parse_float(toParse, (float*) res); + if (st == 0) { + *resType = TYPE_FLOAT; + return 0; + } + } + return 1; +} + int simple_float_func(float (*func)(float), int* res, unsigned char* resType, unsigned char* types, int* args) { float x = 0; @@ -252,6 +282,7 @@ struct FuncIntro intros[] = { {"print_number", &print_number_impl, 1}, {"print_ascii", &print_ascii_impl, 1}, {"print_newline", &print_newline_impl, 0}, + {"input_number", &input_number_impl, 0}, {"", 0, 0} }; diff --git a/src/number_parsing.c b/src/number_parsing.c index 13fd306..65e82cd 100644 --- a/src/number_parsing.c +++ b/src/number_parsing.c @@ -31,7 +31,7 @@ int parse_clean_positive_integer(int inputStrLen, char* inputStr, int* result) { int parse_int(char* inputStr, int* resultPtr) { int i = 0; - char cleanStr[strlen(inputStr)]; + char cleanStr[strlen(inputStr)+1]; int cleanStrLen = 0; int hasNegSign = 0; while (inputStr[i] != 0) { @@ -61,7 +61,11 @@ int parse_int(char* inputStr, int* resultPtr) { //printf("clean str: %s/ \n", cleanStr); int inter = 0; - parse_clean_positive_integer(cleanStrLen, cleanStr, &inter); + byte stat = parse_clean_positive_integer(cleanStrLen, cleanStr, &inter); + if (NB_PARSING_DEBUG_LEVEL >= 2) { + printf("Parse clean positive integer stat: %d\n", stat); + printf("Got value: %d\n", inter); + } *resultPtr = inter; if (hasNegSign) { @@ -72,11 +76,12 @@ int parse_int(char* inputStr, int* resultPtr) { } int parse_float(char* inputStr, float* resultPtr) { + if (NB_PARSING_DEBUG_LEVEL >= 2) printf("Parsing as float: '%s'\n", inputStr); int i = 0; - char cleanStrIntPart[strlen(inputStr)]; + char cleanStrIntPart[strlen(inputStr)+1]; int cleanStrIntPartLen = 0; - char cleanStrFloatPart[strlen(inputStr)]; + char cleanStrFloatPart[strlen(inputStr)+1]; int cleanStrFloatPartLen = 0; int part = 0; // 0 for first part, 1 for snd part diff --git a/src/number_parsing.h b/src/number_parsing.h index 8aa5725..fc5441f 100644 --- a/src/number_parsing.h +++ b/src/number_parsing.h @@ -1,6 +1,8 @@ #ifndef NB_PARSING_H_ #define NB_PARSING_H_ +#define NB_PARSING_DEBUG_LEVEL 0 + int is_char_numeral(char candidate); int integer_pow(int base, int exponent); int parse_clean_positive_integer(int inputStrLen, char* inputStr, int* result); diff --git a/tests/test_evaluation.c b/tests/test_evaluation.c index 3ba3067..3391706 100644 --- a/tests/test_evaluation.c +++ b/tests/test_evaluation.c @@ -68,6 +68,10 @@ void test_evaluation() evaluate(state, "(cos(2)^2)+(sin(2)^2)", &resVal, &resType); assert(resType == TYPE_FLOAT); assert(float_almost_equal(1, get_float_from_int_rep(resVal))); + + evaluate(state, "get_pi()", &resVal, &resType); + assert(resType == TYPE_FLOAT); + assert(float_almost_equal(3.14159, get_float_from_int_rep(resVal))); evaluate(state, "random_int(1, 100)", &resVal, &resType); assert(resType == TYPE_INT);