step: deal with parenthesis
This commit is contained in:
parent
015ee9595f
commit
495418dadc
20
src/mumble.c
20
src/mumble.c
|
@ -23,6 +23,11 @@ long evaluate_operation(char* op, long x, long y)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int is_ignorable(mpc_ast_t* t){
|
||||||
|
int is_regex = !strcmp(t->tag, "regex");
|
||||||
|
int is_parenthesis = !strcmp(t->tag, "char") && !strcmp(t->contents, "(");
|
||||||
|
return is_regex || is_parenthesis;
|
||||||
|
}
|
||||||
long evaluate_ast(mpc_ast_t* t)
|
long evaluate_ast(mpc_ast_t* t)
|
||||||
{
|
{
|
||||||
// Base case #1: It's a number
|
// Base case #1: It's a number
|
||||||
|
@ -41,24 +46,25 @@ long evaluate_ast(mpc_ast_t* t)
|
||||||
printf("\nCase #2, %s", t->children[0]->contents);
|
printf("\nCase #2, %s", t->children[0]->contents);
|
||||||
return atoi(t->children[0]->contents);
|
return atoi(t->children[0]->contents);
|
||||||
}
|
}
|
||||||
|
// Base case #3: Top level parenthesis
|
||||||
// Case #3: Parenthesis case
|
if (t->children_num == 2 && strstr(t->children[0]->tag, "expr|>") && !strcmp(t->children[1]->tag, "regex")) {
|
||||||
|
if (VERBOSE)
|
||||||
if (t->children_num == 2 && !strcmp(t->children[0]->tag, "expr|>") && strstr(t->children[1]->tag, "regex")) {
|
printf("\nCase #3, top level parenthesis");
|
||||||
return evaluate_ast(t->children[0]);
|
return evaluate_ast(t->children[0]);
|
||||||
}
|
}
|
||||||
// Case #4: Unary operations case
|
|
||||||
|
|
||||||
|
// Case #4: Unary operations case
|
||||||
// Case #5: Binary (or more) operations case
|
// Case #5: Binary (or more) operations case
|
||||||
long x;
|
long x;
|
||||||
char* operation;
|
char* operation;
|
||||||
if (t->children_num > 3 && !strcmp(t->children[0]->tag, "regex") && strstr(t->children[1]->tag, "operator")) {
|
if (t->children_num > 3 && is_ignorable(t->children[0]) && strstr(t->children[1]->tag, "operator")) {
|
||||||
operation = t->children[1]->contents;
|
operation = t->children[1]->contents;
|
||||||
if (VERBOSE)
|
if (VERBOSE)
|
||||||
printf("\nCase #5, %s", operation);
|
printf("\nCase #5, %s", operation);
|
||||||
x = evaluate_ast(t->children[2]);
|
x = evaluate_ast(t->children[2]);
|
||||||
int i = 3;
|
int i = 3;
|
||||||
while ((i < t->children_num) && strstr(t->children[i]->tag, "expr")) {
|
while ((i < t->children_num) && strstr(t->children[i]->tag, "expr")) {
|
||||||
|
// note that when reaching a closing parenthesis, ^ returns false
|
||||||
long y = evaluate_ast(t->children[i]);
|
long y = evaluate_ast(t->children[i]);
|
||||||
x = evaluate_operation(operation, x, y);
|
x = evaluate_operation(operation, x, y);
|
||||||
i++;
|
i++;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user