Evaluation of Expressions

14
Evaluation of Expressions 5 th week, 2007

description

Evaluation of Expressions. 5 th week, 2007. Evaluation of Expression. X = a / b - c + d * e - a * c If a = 4, b = c = 2, d = e = 3 Interpretation 1: ((4/2)-2)+(3*3)-(4*2)=0 + 8+9=1 Interpretation 2: (4/(2-2+3))*(3-4)*2=(4/3)*(-1)*2=-2.666… - PowerPoint PPT Presentation

Transcript of Evaluation of Expressions

Page 1: Evaluation of Expressions

Evaluation of Expressions

Evaluation of Expressions

5th week, 2007

Page 2: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 2 –

Evaluation of ExpressionEvaluation of Expression X = a / b - c + d * e - a * c If a = 4, b = c = 2, d = e = 3

Interpretation 1: ((4/2)-2)+(3*3)-(4*2)=0 + 8+9=1

Interpretation 2:(4/(2-2+3))*(3-4)*2=(4/3)*(-1)*2=-2.666…

How to generate the machine instructions corresponding to a given expression? precedence rule + associative rule

Page 3: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 3 –

Infix and PostfixInfix and Postfix

Infix Postfix

2+3*4 234*+

a*b+5 ab*5+

(1+2)*7 12+7*

a*b/c ab*c/

(a/(b-c+d))*(e-a)*c abc-d+/ea-*c*

a/b-c+d*e-a*c ab/c-de*ac*-

Page 4: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 4 –

6/2 – 3 + 4 * 2

Token Stack Top[0] [1] [2]

6 6 02 6 2 1/ 6 /2 03 6 /2 3 1- 6 /2 - 3 04 6 /2 - 3 4 12 6 /2 - 3 4 2 2* 6 /2 - 3 4 * 2 1+ 6 /2 – 3+4*2 0

Postfix EvaluationPostfix Evaluation

Page 5: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 5 –

Infix to PostfixInfix to Postfix Assumptions:

operators: +, -, *, /, % operands: single digit integer

#define MAX_STACK_SIZE 100#define MAX_EXPR_SIZE 100 typedef enum{1paran, rparen, plus, minus, times,divide, mod, eos, operand} precedence;int stack[MAX_STACK_SIZE]; /* global stack */char expr[MAX_EXPR_SIZE]; /* input string */

Page 6: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 6 –

int eval(void) {precedence token;char symbol;int op1, op2;int n = 0; /* counter for the expression string */int top = -1;token = get_token(&symbol, &n);while (token != eos) {

if (token == operand)add(&top, symbol-’0’); /* stack insert */

else {op2 = delete(&top); /* stack delete */op1 = delete(&top);

Code Part Code Part

Page 7: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 7 –

switch(token) { case plus: add(&top, op1+op2); break; case minus: add(&top, op1-op2); break; case times: add(&top, op1*op2); break; case divide: add(&top, op1/op2); break; case mod: add(&top, op1%op2);

}}token = get_token (&symbol, &n);

}return delete(&top); /* return result */}

Code Part Code Part

Page 8: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 8 –

get_tokenget_tokenprecedence get_token(char *symbol, int *n){ *symbol =expr[(*n)++]; switch (*symbol) { case ‘(‘ : return lparen; case ’)’ : return rparen; case ‘+’: return plus; case ‘-’ : return minus;

case ‘/’ : return divide; case ‘*’ : return times; case ‘%’ : return mod; case ‘\0‘ : return eos; default : return operand; /* no error checking, default is operand */ }}

Page 9: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 9 –

Fully parenthesize expression a / b - c + d * e - a * c --> ((((a / b) - c) + (d * e)) - a * c))

All operators replace their corresponding right parentheses. ((((a / b) - c) + (d * e)) - a * c))

Delete all parentheses. a b / c – d e * + a c * -

two passes

Infix to Postfix Conversion

Infix to Postfix Conversion

Page 10: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 10 –

ex. a + b * cex. a + b * c The orders of operands in infix and postfix

are the same.Toke

nStack Top Top

[0] [1] [2]

a -1 a

+ + 0 a

b + 0 ab

* + * 1 ab

c + * 1 abc

eos -1

Page 11: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 11 –

ex. a*(b+c)*dex. a*(b+c)*dToke

nStack Top Top

[0] [1] [2]a -1 a* * 0 a( * ( 1 ab * ( 1 ab+ * ( + 2 abc * ( + 2 abc) * 0 abc+* * 0 abc+*d * 0 abc+*deos 0 abc+*d*

Page 12: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 12 –

RulesRulesOperators are taken out of the stack

as long as their in-stack precedence is higher than or equal to the incoming precedence of the new operator.

( has low in-stack precedence, and high incoming precedence.

( ) + - * / % eosisp 0 19 12 12 13 13 13 0icp 20 19 12 12 13 13 13 0

Page 13: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 13 –

Postfix Postfix void postfix(void) {

char symbol;precedence token;int n = 0;int top = 0; /* place eos on stack */stack[0] = eos;for (token = get _token(&symbol, &n); token != eos; token = get_token(&symbol, &n)) { if (token == operand) printf (“%c”, symbol); else if (token == rparen ) { while (stack[top] != lparen) print_token(delete(&top));

Page 14: Evaluation of Expressions

Sungkyunkwan University, Hyoung-Kee Choi ©

– 14 –

Postfix Postfix delete(&top); /*discard the left parenthesis */ } else { /* remove and print symbols whose isp is greater than or equal to the current token’s icp */ while(isp[stack[top]] >= icp[token] ) print_token(delete(&top)); add(&top, token); } } while ((token = delete(&top)) != eos) print_token(token); print(“\n”);}