2013-09-19 21:51:49 +00:00
|
|
|
#include "expression.h"
|
|
|
|
|
|
|
|
#include "../lib/xalloc.h"
|
2013-09-13 19:32:17 +00:00
|
|
|
|
2013-09-19 22:19:12 +00:00
|
|
|
/* Static helper functions */
|
|
|
|
|
|
|
|
static node_t* alloc_node();
|
|
|
|
static int eval_single_node(node_t* node);
|
|
|
|
|
|
|
|
static node_t* alloc_node()
|
2013-09-13 19:32:17 +00:00
|
|
|
{
|
2013-09-19 21:51:49 +00:00
|
|
|
node_t *node = xmalloc(sizeof(node_t));
|
2013-09-13 19:32:17 +00:00
|
|
|
memset(node, 0, sizeof(node_t));
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
2013-09-19 22:19:12 +00:00
|
|
|
/* Exposed functions */
|
|
|
|
|
2013-09-13 19:32:17 +00:00
|
|
|
node_t* make_op_node(enum operation op)
|
|
|
|
{
|
|
|
|
node_t* node = alloc_node();
|
|
|
|
node->type = OP;
|
|
|
|
node->value.op = op;
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
node_t* make_field_node(char *fieldname)
|
|
|
|
{
|
|
|
|
node_t *node = alloc_node();
|
|
|
|
node->type = FIELD;
|
2013-09-19 22:19:12 +00:00
|
|
|
node->value.field.fieldname = fieldname;
|
2013-09-13 19:32:17 +00:00
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
node_t* make_string_node(char *literal)
|
|
|
|
{
|
|
|
|
node_t *node = alloc_node();
|
|
|
|
node->type = STRING;
|
|
|
|
node->value.string_literal = literal;
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
node_t* make_int_node(int literal)
|
|
|
|
{
|
|
|
|
node_t *node = alloc_node();
|
|
|
|
node->type = INT;
|
|
|
|
node->value.int_literal = literal;
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
|
|
|
|
int evaluate_expression(node_t *root) {
|
2013-09-19 21:51:49 +00:00
|
|
|
if (!root) return 0;
|
2013-09-13 19:32:17 +00:00
|
|
|
int result = 1;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
void print_expression(node_t *root) {
|
|
|
|
if (!root) return;
|
|
|
|
printf("%s", "( ");
|
|
|
|
print_expression(root->left_child);
|
|
|
|
switch (root->type) {
|
|
|
|
case OP:
|
|
|
|
printf(" %i ", root->value.op);
|
|
|
|
break;
|
|
|
|
case FIELD:
|
2013-09-19 22:19:12 +00:00
|
|
|
printf(" (%s", root->value.field.fieldname);
|
2013-09-13 19:32:17 +00:00
|
|
|
break;
|
|
|
|
case STRING:
|
|
|
|
printf("%s) ", root->value.string_literal);
|
|
|
|
break;
|
|
|
|
case INT:
|
|
|
|
printf(" %d) ", root->value.int_literal);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
print_expression(root->right_child);
|
|
|
|
printf("%s", " )");
|
|
|
|
}
|