|
|
// header file with all the necessary structures and tables for
// the expression evaluator.
//
// Modifications:
//
// 15-Nov-1993 JdR Major speed improvements
// 26-Jul-1988 rj Removed entry defining "^" as bitwise xor. Left the
// BIT_XOR entries in to avoid bothering with rpn.c.
// Then realized it had to go in, so fixed it to handle
// IBM and Microsoft versions properly.
typedef struct rpn_info { UCHAR type; INT_PTR valPtr; // value or ptr to string
}RPNINFO;
// The precedence vector is also indexed by the operator/operand type
// code to get the precedence for the operator/operand.
// The precedence is used to determine if an item is to stay on the
// temporary stack or is to be moved to the reverse-polish list.
static UCHAR precVector[] = { 0, // right paren ')'
1, // logical or
2, // logical and
3, // bit or
4, // bit xor
5, // bit and
6, // equals '!='
6, // equals '=='
7, // relation '>'
7, // relation '<'
7, // relation '>='
7, // relation '<='
8, // shift '>>'
8, // shift '<<'
9, // add '-'
9, // add '+'
10, // mult '%'
10, // mult '/'
10, // mult '*'
11, // unary '-'
11, // unary '~'
11, // unary '!'
12, // primary int
12, // primary str
12, // primary str-sp
0 // left paren '('
};
// these are the various type codes for the operator/operand tokens
#define RIGHT_PAREN 0
#define LOGICAL_OR 1
#define LOGICAL_AND 2
#define BIT_OR 3
#define BIT_XOR 4
#define BIT_AND 5
#define NOT_EQUAL 6
#define EQUAL 7
#define GREATER_THAN 8
#define LESS_THAN 9
#define GREATER_EQ 10
#define LESS_EQ 11
#define SHFT_RIGHT 12
#define SHFT_LEFT 13
#define BINARY_MINUS 14
#define ADD 15
#define MODULUS 16
#define DIVIDE 17
#define MULTIPLY 18
#define UNARY_MINUS 19
#define COMPLEMENT 20
#define LOGICAL_NOT 21
#define INTEGER 22
#define STR 23
#define PROG_INVOC_STR 24
#define LEFT_PAREN 25
// error table used by the getTok() routines to detect illegal token combinations.
// The table is explained with the routine check_syntax_error()
static UCHAR errTable[5][5] = { { 0, 1, 0, 0, 1 }, { 1, 0, 1, 1, 0 }, { 1, 0, 0, 1, 0 }, { 1, 0, 1, 1, 0 }, { 0, 1, 0, 0, 1 } };
// we save space by placing most of the tokens returned to the
// expr-eval parser in a table as shown below. At any time, the
// longest possible token is to be returned, hence the order of
// the strings is very important. eg: '||' is placed BEFORE '|'
typedef struct _tok_tab_rec { char *op_str; UCHAR op; } TOKTABREC;
static TOKTABREC tokTable[] = { { "(", LEFT_PAREN }, { ")", RIGHT_PAREN }, { "*", MULTIPLY }, { "/", DIVIDE }, { "%", MODULUS }, { "+", ADD }, { "<<", SHFT_LEFT }, { ">>", SHFT_RIGHT }, { "<=", LESS_EQ }, { ">=", GREATER_EQ }, { "<", LESS_THAN }, { ">", GREATER_THAN }, { "==", EQUAL }, { "!=", NOT_EQUAL }, { "&&", LOGICAL_AND }, { "||", LOGICAL_OR }, { "&", BIT_AND }, { "|", BIT_OR }, { "^^", BIT_XOR }, { "~", COMPLEMENT }, { "!", LOGICAL_NOT }, { NULL, 0 } };
|