home *** CD-ROM | disk | FTP | other *** search
- +++Date last modified: 05-Jul-1997
-
- Basically, EVAL.C converts infix notation to postfix notation. If you're
- not familiar with these terms, infix notation is standard human-readable
- equations such as you write in a C program. Postfix notation is most familiar
- as the "reverse Polish" notation used in Hewlett Packard calculators and in
- the Forth language. Internally, all languages work by converting to postfix
- evaluation. Only Forth makes it obvious to the programmer.
-
- EVAL.C performs this conversion by maintaining 2 stacks, an operand stack
- and an operator stack. As it scans the input, each time it comes across a
- numerical value, it pushes it onto the operand stack. Whenever it comes
- across an operator, it pushes it onto the operator stack. Once the input
- expression has been scanned, it evaluates it by popping operands off the
- operand stack and applying the operators to them.
-
- For example the simple expression "2+3-7" would push the values 2, 3, and 7
- onto the operand stack and the operators "+" and "-" onto the operator stack.
- When evaluating the expression, it would first pop 3 and 7 off the operand
- stack and then pop the "-" operator off the operator stack and apply it. This
- would leave a value of -4 on the stack. Next the value of 2 would be popped
- from the operand stack and the remaining operator off of the operator stack.
- Applying the "+" operator to the values 2 and -4 would leave the result of
- the evaluation, -2, on the stack to be returned.
-
- The only complication of this in EVAL.C is that instead of raw operators
- (which would all have to be 1 character long), I use operator tokens which
- allow multicharacter operators and precedence specification. What I push on
- the operator stack is still a single character token, but its the operator
- token which is defined in the 'verbs' array of valid tokens. Multicharacter
- tokens are always assumed to include any leading parentheses. For example, in
- the expression "SQRT(37)", the token is "SQRT(".
-
- Using parentheses forces evaluation to be performed out of the normal
- sequence. I use the same sort of mechanism to implement precedence rules.
- Unary negation is yet another feature which takes some explicit exception
- processing to process. Other than these exceptions, it's pretty
- straightforward stuff.