addition and substraction added. supports multiple numbers
This commit is contained in:
39
lexer.c
39
lexer.c
@@ -280,24 +280,31 @@ void main2() {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void astparser(const char* input){
|
void astparser(const char* input) {
|
||||||
TokenArr stack = tokenize_all(input);
|
TokenArr stack = tokenize_all(input);
|
||||||
|
int sum = 0;
|
||||||
size_t j=0;
|
int sign = 1;
|
||||||
|
for (size_t i = 0; i < stack.size; ++i) {
|
||||||
for (size_t i=0; i < stack.size; ++i){
|
switch (stack.unit[i].type) {
|
||||||
Token stack_save = stack.unit[i];
|
case TOKEN_PLUS:
|
||||||
//printf("current token: %s\nCurrent i: %d\n\n", stack_save.text, i);
|
sign = 1;
|
||||||
if (stack_save.behaviour == BHV_STACK){
|
break;
|
||||||
assert(i < stack.size-1);
|
case TOKEN_MINUS:
|
||||||
assert(i > 0);
|
sign = -1;
|
||||||
assert(stack.unit[i+1].type == TOKEN_INTEGER);
|
break;
|
||||||
assert(stack.unit[i-1].type == TOKEN_INTEGER);
|
case TOKEN_INTEGER:
|
||||||
printf("%d\n", str_to_int(stack.unit[i+1].text) + str_to_int(stack.unit[i-1].text));
|
sum += sign * str_to_int(stack.unit[i].text);
|
||||||
// may switch to atoi later even here.
|
sign = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
printf("%d\n", sum);
|
||||||
|
for (size_t j = 0; j < stack.size; ++j) {
|
||||||
|
free(stack.unit[j].text);
|
||||||
|
}
|
||||||
|
free(stack.unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -331,7 +338,7 @@ int main4() {
|
|||||||
|
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
char* input = "1+2";
|
char* input = "1+69+3";
|
||||||
printf("input: %s\n\n", input);
|
printf("input: %s\n\n", input);
|
||||||
astparser(input);
|
astparser(input);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user