#define MAXTOKENLEN     6

#define ERRORTOKEN      -1
#define STARTTOKEN      0
#define LPAREN          1
#define RPAREN          2
#define NOT             3
#define NEG             4
#define COMPL           5
#define MULT            6
#define DIV             7
#define MOD             8
#define ADD             9
#define SUB             10
#define LESS            11
#define GREATER         12
#define LESSEQUAL       13
#define GREATEREQUAL    14
#define EQUAL           15
#define NOTEQUAL        16
#define BITWISEAND      17
#define BITWISEOR       18
#define BITWISEXOR      19
#define AND             20
#define OR              21
#define MAXTOKENTYPES   24      // there are two valid token strings for NOTEQUAL & EQUAL
                                // NEG and SUB have the same token string

#define STS_IDENTIFIER          MAXTOKENTYPES + 1
#define LEN_IDENTIFIER          MAXTOKENTYPES + 2
#define SD_IDENTIFIER           MAXTOKENTYPES + 3
#define NODE_IDENTIFIER         MAXTOKENTYPES + 4
#define FC_IDENTIFIER           MAXTOKENTYPES + 5
#define DSAP_IDENTIFIER         MAXTOKENTYPES + 6
#define SSAP_IDENTIFIER         MAXTOKENTYPES + 7
#define GAP_IDENTIFIER          MAXTOKENTYPES + 8
#define DATA_BYTE_IDENTIFIER    MAXTOKENTYPES + 9
#define DATA_WORD_IDENTIFIER    MAXTOKENTYPES + 10
#define NUMBER                  MAXTOKENTYPES + 11
#define CMD_ARG_IDENTIFIER      MAXTOKENTYPES + 12

#define ENDTOKEN                MAXTOKENTYPES + 13

#define FIRSTOPERTOKEN  NOT
#define LASTOPERTOKEN   OR

// define error types
#define MISSINGPARENTH  300 //Missing parenthesis
#define MISSINGPARAM    301 //Missing parameter
#define MISSINGOPER     302 //Missing operator
#define INVALIDPARAM    303 //Invalid parameter
#define INVALIDOPER     304 //Invalid operator
#define INVALIDVALUE    305 //Invalid value
#define AMBIGOPER       306 //Ambiguous operators require parenthesis

#define STS_CHAR        'M'
#define LEN_CHAR        'N'
#define SD_CHAR         'O'
#define NODE_CHAR       'P'
#define FC_CHAR         'Q'
#define DSAP_CHAR       'R'
#define SSAP_CHAR       'S'
#define GAP_CHAR        'T'
#define DATA_BYTE_CHAR  'U'
#define DATA_WORD_CHAR  'V'
#define CMD_ARG_CHAR    'W'

int InfixToPostfix(char *ExpString, int MaxParamID, int *Error);
int EvaluatePostfixExpression(BYTE Sts, BYTE Len, BYTE Sd, BYTE * pNode, BYTE * Fc, BYTE * pDSap, BYTE * pSSap, DWORD Gap, BYTE * Data);