mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.0 KiB
142 lines
4.0 KiB
/*
|
|
* 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;
|
|
long 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;
|
|
};
|
|
|
|
static struct tok_tab_rec 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 }
|
|
};
|