1 #include "expression.h"
7 int get_precedence(unsigned char op
) {
26 double apply_operator(unsigned char op
, double value1
, double value2
) {
28 printf("Applying %c on %f and %f\n", op
, value1
, value2
);
32 return pow(value1
, value2
);
50 double get_value(char *string
) {
51 int i
= strlen(string
);
52 if (!strchr(string
, '.')) {
53 strcat(string
, ".0\0");
58 void evaluate(Expression
*expr
) {
60 * XXX first expression?
61 * If expr->precendence < next->precedence:
63 * new_value = apply_operator(expr->op, expr->value, next->value);
64 * next->value = new_value;
65 * next->prev = expr->prev;
66 * prev->next = expr->next;
68 Expression
*next
= expr
->next
;
70 if (!next
) { // Last expression, do nothing(must be an integer constant)
73 if (expr
->precedence
< next
->precedence
) { // Next expression has higher precendence
75 evaluate(expr
); // Re-evaluate expr again
78 new_value
= apply_operator(expr
->op
, expr
->value
, next
->value
);
79 next
->value
= new_value
;
82 if (expr
->prev
) { // not first expression
83 next
->prev
= expr
->prev
;
84 expr
->prev
->next
= next
;
85 } else { // first expression
90 void finish_expression(Expression
*expr
, char *expression
, unsigned char op
, int precedence_factor
) {
91 if (expr
->prev
&& expr
->prev
->op
== 0) {
96 expr
->flags
|= CONSTANT
;
100 expr
->value
= get_value(expression
);
101 expr
->precedence
= get_precedence(op
)*precedence_factor
;
105 void print_expression(Expression
*expr
) {
106 printf("Value: \t\t%f\nOperator: \t%c\nPrecedence: \t%d\n===\n", expr
->value
, expr
->op
, expr
->precedence
);