feat: add input_number function
This commit is contained in:
parent
bcaf2cb3b7
commit
d562af9876
8 changed files with 61 additions and 11 deletions
|
@ -29,14 +29,16 @@ ToDo List:
|
||||||
- [X] add modulus operator '%'
|
- [X] add modulus operator '%'
|
||||||
- [ ] add support for multiple characters operators
|
- [ ] add support for multiple characters operators
|
||||||
- [ ] add inclusive operators like '!=', '>=', '<='
|
- [ ] 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 type() std function
|
||||||
- [ ] add ceil() and floor() std functions
|
- [ ] add ceil() and floor() std functions
|
||||||
- [X] base of the CLI
|
- [X] base of the CLI
|
||||||
- [ ] evaluate expression from stdin
|
- [ ] evaluate expression from stdin
|
||||||
- [X] read a file
|
- [X] read a file
|
||||||
- [X] if statements
|
- [X] if statements
|
||||||
- [ ] while statements (with break and continue)
|
- [X] while statements (with break and continue)
|
||||||
|
- [ ] repeat statement
|
||||||
- [ ] add functions support
|
- [ ] add functions support
|
||||||
- [ ] add config header file
|
- [ ] add config header file
|
||||||
- [ ] ability to modify keywords and customize the lang
|
- [ ] ability to modify keywords and customize the lang
|
||||||
|
@ -141,6 +143,8 @@ abs(nb)
|
||||||
sqrt,sin,cos,exp,ln,log etc.
|
sqrt,sin,cos,exp,ln,log etc.
|
||||||
print_number(nb)
|
print_number(nb)
|
||||||
input_number()
|
input_number()
|
||||||
|
ceil(nb)
|
||||||
|
floor(nb)
|
||||||
random_int(min, max)
|
random_int(min, max)
|
||||||
random_float(min, max)
|
random_float(min, max)
|
||||||
type(var) -> return the type of a var as int
|
type(var) -> return the type of a var as int
|
||||||
|
|
|
@ -2,5 +2,4 @@
|
||||||
set a to input_number()
|
set a to input_number()
|
||||||
set b to input_number()
|
set b to input_number()
|
||||||
set res to a+b
|
set res to a+b
|
||||||
|
print_number(res)
|
||||||
print_int(res)
|
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
# test modulus operator
|
set a to input_number()
|
||||||
print_number(20.2 % 10)
|
print_number(a)
|
||||||
|
|
||||||
|
|
|
@ -536,7 +536,7 @@ int evaluate(struct StateContainer* state, char* inputStr, int* resultPtr, unsig
|
||||||
// parse float success
|
// parse float success
|
||||||
list_set(&evalList, evalList.num_elements, TYPE_FLOAT, &res);
|
list_set(&evalList, evalList.num_elements, TYPE_FLOAT, &res);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (st != 0) {
|
if (st != 0) {
|
||||||
// identify token
|
// identify token
|
||||||
|
@ -623,6 +623,10 @@ int evaluate(struct StateContainer* state, char* inputStr, int* resultPtr, unsig
|
||||||
int typeRes = list_get_type(&evalList, 0);
|
int typeRes = list_get_type(&evalList, 0);
|
||||||
*typePtr = typeRes;
|
*typePtr = typeRes;
|
||||||
list_get(&evalList, 0, resultPtr);
|
list_get(&evalList, 0, resultPtr);
|
||||||
|
if (EVALUATOR_DEBUG_LEVEL >= 2) {
|
||||||
|
printf("End of evaluation, dumping evalList: \n");
|
||||||
|
list_print(&evalList);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
31
src/funcs.c
31
src/funcs.c
|
@ -80,6 +80,36 @@ int print_newline_impl(int* res, unsigned char* resType, unsigned char* types, i
|
||||||
return 0;
|
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)
|
int simple_float_func(float (*func)(float), int* res, unsigned char* resType, unsigned char* types, int* args)
|
||||||
{
|
{
|
||||||
float x = 0;
|
float x = 0;
|
||||||
|
@ -252,6 +282,7 @@ struct FuncIntro intros[] = {
|
||||||
{"print_number", &print_number_impl, 1},
|
{"print_number", &print_number_impl, 1},
|
||||||
{"print_ascii", &print_ascii_impl, 1},
|
{"print_ascii", &print_ascii_impl, 1},
|
||||||
{"print_newline", &print_newline_impl, 0},
|
{"print_newline", &print_newline_impl, 0},
|
||||||
|
{"input_number", &input_number_impl, 0},
|
||||||
{"", 0, 0}
|
{"", 0, 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ int parse_clean_positive_integer(int inputStrLen, char* inputStr, int* result) {
|
||||||
|
|
||||||
int parse_int(char* inputStr, int* resultPtr) {
|
int parse_int(char* inputStr, int* resultPtr) {
|
||||||
int i = 0;
|
int i = 0;
|
||||||
char cleanStr[strlen(inputStr)];
|
char cleanStr[strlen(inputStr)+1];
|
||||||
int cleanStrLen = 0;
|
int cleanStrLen = 0;
|
||||||
int hasNegSign = 0;
|
int hasNegSign = 0;
|
||||||
while (inputStr[i] != 0) {
|
while (inputStr[i] != 0) {
|
||||||
|
@ -61,7 +61,11 @@ int parse_int(char* inputStr, int* resultPtr) {
|
||||||
//printf("clean str: %s/ \n", cleanStr);
|
//printf("clean str: %s/ \n", cleanStr);
|
||||||
|
|
||||||
int inter = 0;
|
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;
|
*resultPtr = inter;
|
||||||
if (hasNegSign) {
|
if (hasNegSign) {
|
||||||
|
@ -72,11 +76,12 @@ int parse_int(char* inputStr, int* resultPtr) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int parse_float(char* inputStr, float* resultPtr) {
|
int parse_float(char* inputStr, float* resultPtr) {
|
||||||
|
if (NB_PARSING_DEBUG_LEVEL >= 2) printf("Parsing as float: '%s'\n", inputStr);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
char cleanStrIntPart[strlen(inputStr)];
|
char cleanStrIntPart[strlen(inputStr)+1];
|
||||||
int cleanStrIntPartLen = 0;
|
int cleanStrIntPartLen = 0;
|
||||||
|
|
||||||
char cleanStrFloatPart[strlen(inputStr)];
|
char cleanStrFloatPart[strlen(inputStr)+1];
|
||||||
int cleanStrFloatPartLen = 0;
|
int cleanStrFloatPartLen = 0;
|
||||||
|
|
||||||
int part = 0; // 0 for first part, 1 for snd part
|
int part = 0; // 0 for first part, 1 for snd part
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef NB_PARSING_H_
|
#ifndef NB_PARSING_H_
|
||||||
#define NB_PARSING_H_
|
#define NB_PARSING_H_
|
||||||
|
|
||||||
|
#define NB_PARSING_DEBUG_LEVEL 0
|
||||||
|
|
||||||
int is_char_numeral(char candidate);
|
int is_char_numeral(char candidate);
|
||||||
int integer_pow(int base, int exponent);
|
int integer_pow(int base, int exponent);
|
||||||
int parse_clean_positive_integer(int inputStrLen, char* inputStr, int* result);
|
int parse_clean_positive_integer(int inputStrLen, char* inputStr, int* result);
|
||||||
|
|
|
@ -68,6 +68,10 @@ void test_evaluation()
|
||||||
evaluate(state, "(cos(2)^2)+(sin(2)^2)", &resVal, &resType);
|
evaluate(state, "(cos(2)^2)+(sin(2)^2)", &resVal, &resType);
|
||||||
assert(resType == TYPE_FLOAT);
|
assert(resType == TYPE_FLOAT);
|
||||||
assert(float_almost_equal(1, get_float_from_int_rep(resVal)));
|
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);
|
evaluate(state, "random_int(1, 100)", &resVal, &resType);
|
||||||
assert(resType == TYPE_INT);
|
assert(resType == TYPE_INT);
|
||||||
|
|
Loading…
Reference in a new issue