mul and div
This commit is contained in:
83
lexer.c
83
lexer.c
@@ -32,6 +32,8 @@ typedef enum{
|
|||||||
TOKEN_FLOAT,
|
TOKEN_FLOAT,
|
||||||
TOKEN_SPACE,
|
TOKEN_SPACE,
|
||||||
TOKEN_STRING,
|
TOKEN_STRING,
|
||||||
|
TOKEN_MUL,
|
||||||
|
TOKEN_DIV,
|
||||||
intdef,
|
intdef,
|
||||||
TOKEN_UNKNOWN,
|
TOKEN_UNKNOWN,
|
||||||
} symbols;
|
} symbols;
|
||||||
@@ -170,7 +172,7 @@ Token read_from_tok(char* text, uint cursor){
|
|||||||
switch (text[cursor]){
|
switch (text[cursor]){
|
||||||
case '+':
|
case '+':
|
||||||
mytoks.type = TOKEN_PLUS;
|
mytoks.type = TOKEN_PLUS;
|
||||||
// asigning text is not really needed unless for debug. could however be useful for codegen later.
|
// asigning text is not really needed unless for debug. could however be useful for codegen later. NOW IT BECAME A MUST LOL
|
||||||
mytoks.text = strdup("+");
|
mytoks.text = strdup("+");
|
||||||
mytoks.behaviour = BHV_STACK;
|
mytoks.behaviour = BHV_STACK;
|
||||||
break;
|
break;
|
||||||
@@ -183,6 +185,16 @@ Token read_from_tok(char* text, uint cursor){
|
|||||||
mytoks.type = TOKEN_SPACE;
|
mytoks.type = TOKEN_SPACE;
|
||||||
mytoks.text = strdup("space");
|
mytoks.text = strdup("space");
|
||||||
break;
|
break;
|
||||||
|
case '*':
|
||||||
|
mytoks.type = TOKEN_MUL;
|
||||||
|
mytoks.text = strdup("*");
|
||||||
|
mytoks.behaviour = BHV_STACK;
|
||||||
|
break;
|
||||||
|
case '/':
|
||||||
|
mytoks.type = TOKEN_DIV;
|
||||||
|
mytoks.text = strdup("/");
|
||||||
|
mytoks.behaviour = BHV_STACK;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
mytoks.type = TOKEN_UNKNOWN;
|
mytoks.type = TOKEN_UNKNOWN;
|
||||||
mytoks.behaviour = BHV_UNDEFINED;
|
mytoks.behaviour = BHV_UNDEFINED;
|
||||||
@@ -274,37 +286,60 @@ void main2() {
|
|||||||
while (i < length1) {
|
while (i < length1) {
|
||||||
Token result = read_from_tok(input, i);
|
Token result = read_from_tok(input, i);
|
||||||
printf("text: %s\ntype: %u (%s)\n\n", result.text, result.type, token_type_to_string(result.type));
|
printf("text: %s\ntype: %u (%s)\n\n", result.text, result.type, token_type_to_string(result.type));
|
||||||
i += result.cursor_skip;
|
i += result.cursor_skip;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void astparser(const char* input) {
|
void astparser(const char* input) {
|
||||||
TokenArr stack = tokenize_all(input);
|
TokenArr stack = tokenize_all(input);
|
||||||
int sum = 0;
|
int result = 0;
|
||||||
|
int current = 0;
|
||||||
int sign = 1;
|
int sign = 1;
|
||||||
for (size_t i = 0; i < stack.size; ++i) {
|
int op = 0;
|
||||||
switch (stack.unit[i].type) {
|
|
||||||
case TOKEN_PLUS:
|
for (size_t i = 0; i < stack.size; ++i) {
|
||||||
sign = 1;
|
switch (stack.unit[i].type) {
|
||||||
break;
|
case TOKEN_INTEGER: {
|
||||||
case TOKEN_MINUS:
|
int value = str_to_int(stack.unit[i].text);
|
||||||
sign = -1;
|
if (op == 1) {
|
||||||
break;
|
current *= value;
|
||||||
case TOKEN_INTEGER:
|
op = 0;
|
||||||
sum += sign * str_to_int(stack.unit[i].text);
|
} else if (op == 2) {
|
||||||
sign = 1;
|
current /= value;
|
||||||
break;
|
op = 0;
|
||||||
default:
|
} else {
|
||||||
break;
|
current = value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TOKEN_PLUS:
|
||||||
|
result += sign * current;
|
||||||
|
sign = 1;
|
||||||
|
op = 0;
|
||||||
|
break;
|
||||||
|
case TOKEN_MINUS:
|
||||||
|
result += sign * current;
|
||||||
|
sign = -1;
|
||||||
|
op = 0;
|
||||||
|
break;
|
||||||
|
case TOKEN_MUL:
|
||||||
|
op = 1;
|
||||||
|
break;
|
||||||
|
case TOKEN_DIV:
|
||||||
|
op = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("%d\n", sum);
|
result += sign * current; // add the last term
|
||||||
for (size_t j = 0; j < stack.size; ++j) {
|
printf("%d\n", result);
|
||||||
free(stack.unit[j].text);
|
for (size_t j = 0; j < stack.size; ++j) {
|
||||||
|
free(stack.unit[j].text);
|
||||||
}
|
}
|
||||||
free(stack.unit);
|
free(stack.unit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -338,7 +373,7 @@ int main4() {
|
|||||||
|
|
||||||
|
|
||||||
int main(){
|
int main(){
|
||||||
char* input = "1+69+3";
|
char* input = "3*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