'--------------------------------------------------------- ' ' File: ' ' Monitor.VBS ' ' Description: ' ' Script file to extend the standard WMI event query language ' ' Author: ' ' Steve Menzies ' ' Date: ' ' 01/12/00 ' ' Version: ' ' Draft 1.0 ' ' ' E ::= E Or A | A ' A ::= A And L | L ' L ::= L < R | L > R | L >= R | L <= R | L = R | L <> R | R ' R ::= R + T | R - T | T ' T ::= T * F | T / F | F ' F ::= ID | BOOLEAN | NUMBER | REAL | STRING | ( E ) | P ( E ) | NOT E | ID ISA STRING | - E ' P ::= LIKE | LOWER | UPPER ' ' ' ' E ::= A E_ ' E_ ::= Or A E_ | e ' ' A ::= L A_ ' A_ :: = And L A_ | e ' L ::= R L_ ' L_ ::= < R L_ | > R L_ | >= R L_ | <= R L_ | = R L_ | <> R L_ | e ' R ::= T R_ ' R_ ::= + T R_ | - T R_ | e ' T ::= F T_ ' T_ ::= * F T_ | / F T_ | e ' F ::= ID | BOOLEAN | NUMBER | REAL | STRING | ( E ) | P ( E ) | NOT E | ID ISA STRING | -E ' P ::= LIKE | LOWER | UPPER ' ' ' ' Type Info ' ' Unary Arithmetic Table ' ' ' Real - Real ' ' Integer - Integer ' ' Boolean ' ' String ' ' Null ' ' Binary Arithmetic Table ' ' ' Real Integer Boolean String Null ' ' Real * / + - Real * / + - Real ' ' Integer * / + - Real * / + - Integer ' ' Boolean ' ' String + String ' ' Null ' ' Operator Argument Table ' ' And Boolean ' Or Boolean ' Not Boolean ' Isa String ' Like String ' Upper String ' Lower String ' = Real,Integer,String,Boolean,Null ' <> Real,Integer,String,Boolean,Null ' < Real,Integer,String ' > Real,Integer,String ' <= Real,Integer,String ' >= Real,Integer,String ' + Real,Integer,String ' - Real,Integer ' * Real,Integer ' / Real,Integer ' Unary - Real,Integer ' ' Operator Result Table ' ' And Boolean ' Or Boolean ' Not Boolean ' Isa Boolean ' Like Boolean ' Upper Boolean ' Lower Boolean ' = Boolean ' <> Boolean ' < Boolean ' > Boolean ' <= Boolean ' >= Boolean ' + Real,Integer,String ' - Real,Integer ' * Real,Integer ' / Real,Integer ' Unary - Real,Integer ' ' ' Type Table ' ' ' Real Integer Boolean String Null ' ' And X ' Or X ' Not X ' Isa X ' Like X ' Upper X ' Lower X ' = X X X X X ' <> X X X X X ' < X X X ' > X X X ' <= X X X ' >= X X X ' + X X X ' - X X X ' * X X ' / X X ' Unary - X X ' ' '--------------------------------------------------------- '--------------------------------------------------------- ' ' Function: ' ' Globals ' ' Description: ' ' Initialize global variables ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Option Explicit Dim g_WshArguments Set g_WshArguments = WScript.Arguments const wbemCimtypeSint8 = 16 const wbemCimtypeUint8 = 17 const wbemCimtypeSint16 = 2 const wbemCimtypeUint16 = 18 const wbemCimtypeSint32 = 3 const wbemCimtypeUint32 = 19 const wbemCimtypeSint64 = 20 const wbemCimtypeUint64 = 21 const wbemCimtypeReal32 = 4 const wbemCimtypeReal64 = 5 const wbemCimtypeBoolean = 11 const wbemCimtypeString = 8 const wbemCimtypeDatetime = 101 const wbemCimtypeReference = 102 const wbemCimtypeChar16 = 103 const wbemCimtypeObject = 13 Dim g_Debug g_Debug = 0 const Error_Success = 0 const Error_NoArgs = -1 const Error_InsufficientArgs = -2 const Error_InvalidArgs = -3 const Error_ImpossibleState = -4 const Error_UnexpectedEof = -5 const Error_SyntaxError = -6 const Parser_Success = 0 const Parser_Syntax_Error = -1 const Parser_Lexical_Error = -2 const Parser_Failed = -3 const Parser_Buffer_Too_Small = -4 const SQL_1_TOK_EOF = 0 const SQL_1_TOK_ERROR = 1 const SQL_1_TOK_IDENT = 100 const SQL_1_TOK_QSTRING = 101 const SQL_1_TOK_INT = 102 const SQL_1_TOK_REAL = 103 const SQL_1_TOK_CHAR = 104 const SQL_1_TOK_BOOL = 105 const SQL_1_TOK_LE = 106 const SQL_1_TOK_LT = 107 const SQL_1_TOK_GE = 108 const SQL_1_TOK_GT = 109 const SQL_1_TOK_EQ = 110 const SQL_1_TOK_NE = 111 const SQL_1_TOK_DOT = 112 const SQL_1_TOK_OPEN_PAREN = 113 const SQL_1_TOK_CLOSE_PAREN = 114 const SQL_1_TOK_ASTERISK = 115 const SQL_1_TOK_COMMA = 116 const SQL_1_TOK_PLUS = 117 const SQL_1_TOK_MINUS = 118 const SQL_1_TOK_DIVIDE = 119 const SQL_1_TOK_SELECT = 120 const SQL_1_TOK_WHERE = 121 const SQL_1_TOK_FROM = 122 const SQL_1_TOK_LIKE = 123 const SQL_1_TOK_OR = 124 const SQL_1_TOK_AND = 125 const SQL_1_TOK_NOT = 126 const SQL_1_TOK_ISA = 127 const SQL_1_TOK_NULL = 128 const SQL_1_TOK_WITHIN = 129 const GLEX_ACCEPT = 1 ' Add the char to the token const GLEX_CONSUME = 2 ' Consume the char without adding to token const GLEX_PUSHBACK = 4 ' Place the char back in the source buffer for next token const GLEX_NOT = 8 ' A match occurs if the char is NOT the one specified const GLEX_LINEFEED = 16 ' Increase the source linecount const GLEX_RETURN = 32 ' Return the indicated token to caller const GLEX_ANY = 65535 ' wchar_t(0xFFFF) Any character const GLEX_EMPTY = 65534 ' wchar_t(0xFFFE) When subrange is not specified const ST_STRING = 26 const ST_IDENT = 31 const ST_GE = 37 const ST_LE = 39 const ST_NE = 42 const ST_NUMERIC = 44 const ST_REAL = 47 const ST_STRING2 = 53 const ST_STRING_ESC = 58 const ST_STRING2_ESC = 59 ' State First Last New state, Return tok, Instructions ' ======================================================================= Dim DFA_Definition DFA_Definition = Array ( _ 65, 90, ST_IDENT, 0, GLEX_ACCEPT, _ 97 , 122, ST_IDENT, 0, GLEX_ACCEPT, _ 95, GLEX_EMPTY , ST_IDENT, 0, GLEX_ACCEPT, _ 128 , 65533 , ST_IDENT, 0, GLEX_ACCEPT, _ 40, GLEX_EMPTY , 0, SQL_1_TOK_OPEN_PAREN, GLEX_ACCEPT, _ 41, GLEX_EMPTY , 0, SQL_1_TOK_CLOSE_PAREN, GLEX_ACCEPT, _ 46, GLEX_EMPTY , 0, SQL_1_TOK_DOT, GLEX_ACCEPT, _ 42, GLEX_EMPTY , 0, SQL_1_TOK_ASTERISK, GLEX_ACCEPT, _ 47, GLEX_EMPTY , 0, SQL_1_TOK_DIVIDE, GLEX_ACCEPT, _ 43, GLEX_EMPTY , 0, SQL_1_TOK_PLUS, GLEX_ACCEPT, _ 45, GLEX_EMPTY , 0, SQL_1_TOK_MINUS, GLEX_ACCEPT, _ 61, GLEX_EMPTY , 0, SQL_1_TOK_EQ, GLEX_ACCEPT, _ 62, GLEX_EMPTY , ST_GE, 0, GLEX_ACCEPT, _ 60, GLEX_EMPTY , ST_LE, 0, GLEX_ACCEPT, _ 48, 57, ST_NUMERIC, 0, GLEX_ACCEPT, _ 34, GLEX_EMPTY , ST_STRING, 0, GLEX_CONSUME, _ 39, GLEX_EMPTY , ST_STRING2, 0, GLEX_CONSUME, _ 33, GLEX_EMPTY , ST_NE, 0, GLEX_ACCEPT, _ 45, GLEX_EMPTY , ST_NUMERIC, 0, GLEX_ACCEPT, _ 32, GLEX_EMPTY , 0, 0, GLEX_CONSUME, _ 9, GLEX_EMPTY , 0, 0, GLEX_CONSUME, _ 10, GLEX_EMPTY , 0, 0, GLEX_CONSUME Or GLEX_LINEFEED, _ 13 , GLEX_EMPTY , 0, 0, GLEX_CONSUME, _ 0, GLEX_EMPTY , 0, SQL_1_TOK_EOF, GLEX_CONSUME Or GLEX_RETURN, _ 44, GLEX_EMPTY , 0, SQL_1_TOK_COMMA, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , 0, SQL_1_TOK_ERROR, GLEX_ACCEPT Or GLEX_RETURN, _ 10, GLEX_EMPTY , 0, SQL_1_TOK_ERROR, GLEX_ACCEPT Or GLEX_LINEFEED, _ 13, GLEX_EMPTY , 0, SQL_1_TOK_ERROR, GLEX_ACCEPT Or GLEX_LINEFEED, _ 34, GLEX_EMPTY , 0, SQL_1_TOK_QSTRING, GLEX_CONSUME, _ 92, GLEX_EMPTY , ST_STRING_ESC, 0, GLEX_CONSUME, _ GLEX_ANY , GLEX_EMPTY , ST_STRING, 0, GLEX_ACCEPT, _ 97, 122, ST_IDENT, 0, GLEX_ACCEPT, _ 65, 90, ST_IDENT, 0, GLEX_ACCEPT, _ 95, GLEX_EMPTY , ST_IDENT, 0, GLEX_ACCEPT, _ 48, 57, ST_IDENT, 0, GLEX_ACCEPT, _ 128, 65533 , ST_IDENT, 0, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , 0, SQL_1_TOK_IDENT, GLEX_PUSHBACK Or GLEX_RETURN, _ 61, GLEX_EMPTY , 0, SQL_1_TOK_GE, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , 0, SQL_1_TOK_GT, GLEX_PUSHBACK Or GLEX_RETURN, _ 61, GLEX_EMPTY , 0, SQL_1_TOK_LE, GLEX_ACCEPT, _ 62, GLEX_EMPTY , 0, SQL_1_TOK_NE, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , 0, SQL_1_TOK_LT, GLEX_PUSHBACK Or GLEX_RETURN, _ 60, GLEX_EMPTY , 0, SQL_1_TOK_NE, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , 0, SQL_1_TOK_ERROR, GLEX_ACCEPT Or GLEX_RETURN, _ 48, 57, ST_NUMERIC, 0, GLEX_ACCEPT, _ 46, GLEX_EMPTY , ST_REAL, 0, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , 0, SQL_1_TOK_INT, GLEX_PUSHBACK Or GLEX_RETURN, _ 48, 57, ST_REAL, 0, GLEX_ACCEPT, _ 69, GLEX_EMPTY , ST_REAL, 0, GLEX_ACCEPT, _ 101, GLEX_EMPTY , ST_REAL, 0, GLEX_ACCEPT, _ 43, GLEX_EMPTY , ST_REAL, 0, GLEX_ACCEPT, _ 45, GLEX_EMPTY , ST_REAL, 0, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , 0, SQL_1_TOK_REAL, GLEX_PUSHBACK Or GLEX_RETURN, _ 10, GLEX_EMPTY , 0, SQL_1_TOK_ERROR, GLEX_ACCEPT Or GLEX_LINEFEED, _ 13, GLEX_EMPTY , 0, SQL_1_TOK_ERROR, GLEX_ACCEPT Or GLEX_LINEFEED, _ 39, GLEX_EMPTY , 0, SQL_1_TOK_QSTRING, GLEX_CONSUME, _ 92, GLEX_EMPTY , ST_STRING2_ESC, 0, GLEX_CONSUME, _ GLEX_ANY , GLEX_EMPTY , ST_STRING2, 0, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , ST_STRING, 0, GLEX_ACCEPT, _ GLEX_ANY , GLEX_EMPTY , ST_STRING2, 0, GLEX_ACCEPT _ ) const TREE_NODE_SELECT = 0 const TREE_NODE_WHERE = 1 const TREE_NODE_FROM = 2 const TREE_NODE_WITHIN = 3 const TREE_NODE_LIKE = 4 const TREE_NODE_LOWER = 5 const TREE_NODE_UPPER = 6 const TREE_NODE_ISA = 7 const TREE_NODE_OR = 8 const TREE_NODE_AND = 9 const TREE_NODE_NOT = 10 const TREE_NODE_UNARYMINUS = 11 const TREE_NODE_PLUS = 12 const TREE_NODE_MINUS = 13 const TREE_NODE_DIVIDE = 14 const TREE_NODE_MULTIPLY = 15 const TREE_NODE_LESSEQUAL = 16 const TREE_NODE_LESS = 17 const TREE_NODE_GREATEREQUAL = 18 const TREE_NODE_GREATER = 19 const TREE_NODE_EQUAL = 20 const TREE_NODE_NOTEQUAL = 21 const TREE_NODE_NULL = 22 const TREE_NODE_STRING = 23 const TREE_NODE_REAL = 24 const TREE_NODE_INTEGER = 25 const TREE_NODE_BOOLEAN = 26 const TREE_NODE_EMPTY = 27 const TREE_NODE_IDENTIFIER = 28 const TREE_NODE_UNDEFINED = 29 const TYPE_FACTOR = 100 Dim TREE_NODE_NULL_NULL Dim TREE_NODE_NULL_STRING Dim TREE_NODE_NULL_REAL Dim TREE_NODE_NULL_INTEGER Dim TREE_NODE_NULL_BOOLEAN Dim TREE_NODE_NULL_EMPTY Dim TREE_NODE_NULL_IDENTIFIER Dim TREE_NODE_NULL_UNDEFINED Dim TREE_NODE_STRING_NULL Dim TREE_NODE_STRING_STRING Dim TREE_NODE_STRING_REAL Dim TREE_NODE_STRING_INTEGER Dim TREE_NODE_STRING_BOOLEAN Dim TREE_NODE_STRING_EMPTY Dim TREE_NODE_STRING_IDENTIFIER Dim TREE_NODE_STRING_UNDEFINED Dim TREE_NODE_REAL_NULL Dim TREE_NODE_REAL_STRING Dim TREE_NODE_REAL_REAL Dim TREE_NODE_REAL_INTEGER Dim TREE_NODE_REAL_BOOLEAN Dim TREE_NODE_REAL_EMPTY Dim TREE_NODE_REAL_IDENTIFIER Dim TREE_NODE_REAL_UNDEFINED Dim TREE_NODE_INTEGER_NULL Dim TREE_NODE_INTEGER_STRING Dim TREE_NODE_INTEGER_REAL Dim TREE_NODE_INTEGER_INTEGER Dim TREE_NODE_INTEGER_BOOLEAN Dim TREE_NODE_INTEGER_EMPTY Dim TREE_NODE_INTEGER_IDENTIFIER Dim TREE_NODE_INTEGER_UNDEFINED Dim TREE_NODE_BOOLEAN_NULL Dim TREE_NODE_BOOLEAN_STRING Dim TREE_NODE_BOOLEAN_REAL Dim TREE_NODE_BOOLEAN_INTEGER Dim TREE_NODE_BOOLEAN_BOOLEAN Dim TREE_NODE_BOOLEAN_EMPTY Dim TREE_NODE_BOOLEAN_IDENTIFIER Dim TREE_NODE_BOOLEAN_UNDEFINED Dim TREE_NODE_EMPTY_NULL Dim TREE_NODE_EMPTY_STRING Dim TREE_NODE_EMPTY_REAL Dim TREE_NODE_EMPTY_INTEGER Dim TREE_NODE_EMPTY_BOOLEAN Dim TREE_NODE_EMPTY_EMPTY Dim TREE_NODE_EMPTY_IDENTIFIER Dim TREE_NODE_EMPTY_UNDEFINED Dim TREE_NODE_IDENTIFIER_NULL Dim TREE_NODE_IDENTIFIER_STRING Dim TREE_NODE_IDENTIFIER_REAL Dim TREE_NODE_IDENTIFIER_INTEGER Dim TREE_NODE_IDENTIFIER_BOOLEAN Dim TREE_NODE_IDENTIFIER_EMPTY Dim TREE_NODE_IDENTIFIER_IDENTIFIER Dim TREE_NODE_IDENTIFIER_UNDEFINED Dim TREE_NODE_UNDEFINED_NULL Dim TREE_NODE_UNDEFINED_STRING Dim TREE_NODE_UNDEFINED_REAL Dim TREE_NODE_UNDEFINED_INTEGER Dim TREE_NODE_UNDEFINED_BOOLEAN Dim TREE_NODE_UNDEFINED_EMPTY Dim TREE_NODE_UNDEFINED_IDENTIFIER Dim TREE_NODE_UNDEFINED_UNDEFINED ' Offsets into array, used as structure offset const STRUCT_NODE_TYPE = 0 const STRUCT_INTERNAL_NODE_VALUE = 1 const STRUCT_INTERNAL_EVAL_TYPE = 2 const STRUCT_LEFT_NODE_VALUE = 3 const STRUCT_RIGHT_NODE_VALUE = 4 Dim Binary_Function_Definition Binary_Function_Definition = Array ( _ TREE_NODE_OR, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_OR, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_OR, TREE_NODE_BOOLEAN, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_OR, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_AND, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_AND, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_AND, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_AND, TREE_NODE_BOOLEAN, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LIKE, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LIKE, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LIKE, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LIKE, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LOWER, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LOWER, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LOWER, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LOWER, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_UPPER, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_UPPER, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_UPPER, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_UPPER, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_ISA, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_ISA, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_ISA, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_ISA, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_UNDEFINED, TREE_NODE_NULL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_BOOLEAN, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_NULL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_NULL, TREE_NODE_NULL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_UNDEFINED, TREE_NODE_NULL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_BOOLEAN, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_NULL, TREE_NODE_UNDEFINED, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_NULL, TREE_NODE_NULL, TREE_NODE_BOOLEAN, _ TREE_NODE_PLUS, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_UNDEFINED, TREE_NODE_STRING, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_STRING, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_PLUS, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_PLUS, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_PLUS, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MINUS, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_MINUS, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_STRING, _ TREE_NODE_MINUS, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_MINUS, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_STRING, _ TREE_NODE_MINUS, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_MINUS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_MINUS, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MINUS, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_MINUS, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_DIVIDE, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_DIVIDE, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_STRING, _ TREE_NODE_DIVIDE, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_DIVIDE, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_STRING, _ TREE_NODE_DIVIDE, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_DIVIDE, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_DIVIDE, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_DIVIDE, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_DIVIDE, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MULTIPLY, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_MULTIPLY, TREE_NODE_UNDEFINED, TREE_NODE_REAL, TREE_NODE_STRING, _ TREE_NODE_MULTIPLY, TREE_NODE_REAL, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_MULTIPLY, TREE_NODE_UNDEFINED, TREE_NODE_INTEGER, TREE_NODE_STRING, _ TREE_NODE_MULTIPLY, TREE_NODE_INTEGER, TREE_NODE_UNDEFINED, TREE_NODE_STRING, _ TREE_NODE_MULTIPLY, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_MULTIPLY, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MULTIPLY, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_MULTIPLY, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_EMPTY, TREE_NODE_EMPTY, TREE_NODE_EMPTY, TREE_NODE_EMPTY _ ) Dim Unary_Function_Definition Unary_Function_Definition = Array ( _ TREE_NODE_NOT, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_NOT, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, _ TREE_NODE_UNARYMINUS, TREE_NODE_UNDEFINED, TREE_NODE_UNDEFINED, _ TREE_NODE_UNARYMINUS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_UNARYMINUS, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_EMPTY, TREE_NODE_EMPTY, TREE_NODE_EMPTY _ ) Dim Post_Binary_Function_Definition Post_Binary_Function_Definition = Array ( _ TREE_NODE_OR, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_AND, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_LIKE, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LOWER, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_UPPER, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_ISA, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESSEQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_LESS, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATEREQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_GREATER, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_EQUAL, TREE_NODE_NULL, TREE_NODE_NULL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_NOTEQUAL, TREE_NODE_NULL, TREE_NODE_NULL, TREE_NODE_BOOLEAN, _ TREE_NODE_PLUS, TREE_NODE_STRING, TREE_NODE_STRING, TREE_NODE_STRING, _ TREE_NODE_PLUS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_PLUS, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_PLUS, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_PLUS, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MINUS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_MINUS, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MINUS, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_MINUS, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_DIVIDE, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_DIVIDE, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_DIVIDE, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_DIVIDE, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MULTIPLY, TREE_NODE_INTEGER, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_MULTIPLY, TREE_NODE_REAL, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_MULTIPLY, TREE_NODE_REAL, TREE_NODE_INTEGER, TREE_NODE_REAL, _ TREE_NODE_MULTIPLY, TREE_NODE_INTEGER, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_EMPTY, TREE_NODE_EMPTY, TREE_NODE_EMPTY, TREE_NODE_EMPTY _ ) Dim Post_Unary_Function_Definition Post_Unary_Function_Definition = Array ( _ TREE_NODE_NOT, TREE_NODE_BOOLEAN, TREE_NODE_BOOLEAN, _ TREE_NODE_UNARYMINUS, TREE_NODE_INTEGER, TREE_NODE_INTEGER, _ TREE_NODE_UNARYMINUS, TREE_NODE_REAL, TREE_NODE_REAL, _ TREE_NODE_EMPTY, TREE_NODE_EMPTY, TREE_NODE_EMPTY _ ) Function Initialize_Globals () TREE_NODE_NULL_NULL = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_NULL_STRING = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_NULL_REAL = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_NULL_INTEGER = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_NULL_BOOLEAN = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_NULL_EMPTY = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_NULL_IDENTIFIER = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_NULL_UNDEFINED = ( TREE_NODE_NULL * TYPE_FACTOR ) + TREE_NODE_UNDEFINED TREE_NODE_STRING_NULL = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_STRING_STRING = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_STRING_REAL = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_STRING_INTEGER = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_STRING_BOOLEAN = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_STRING_EMPTY = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_STRING_IDENTIFIER = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_STRING_UNDEFINED = ( TREE_NODE_STRING * TYPE_FACTOR ) + TREE_NODE_UNDEFINED TREE_NODE_REAL_NULL = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_REAL_STRING = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_REAL_REAL = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_REAL_INTEGER = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_REAL_BOOLEAN = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_REAL_EMPTY = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_REAL_IDENTIFIER = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_REAL_UNDEFINED = ( TREE_NODE_REAL * TYPE_FACTOR ) + TREE_NODE_UNDEFINED TREE_NODE_INTEGER_NULL = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_INTEGER_STRING = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_INTEGER_REAL = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_INTEGER_INTEGER = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_INTEGER_BOOLEAN = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_INTEGER_EMPTY = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_INTEGER_IDENTIFIER = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_INTEGER_UNDEFINED = ( TREE_NODE_INTEGER * TYPE_FACTOR ) + TREE_NODE_UNDEFINED TREE_NODE_BOOLEAN_NULL = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_BOOLEAN_STRING = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_BOOLEAN_REAL = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_BOOLEAN_INTEGER = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_BOOLEAN_BOOLEAN = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_BOOLEAN_EMPTY = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_BOOLEAN_IDENTIFIER = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_BOOLEAN_UNDEFINED = ( TREE_NODE_BOOLEAN * TYPE_FACTOR ) + TREE_NODE_UNDEFINED TREE_NODE_EMPTY_NULL = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_EMPTY_STRING = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_EMPTY_REAL = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_EMPTY_INTEGER = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_EMPTY_BOOLEAN = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_EMPTY_EMPTY = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_EMPTY_IDENTIFIER = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_EMPTY_UNDEFINED = ( TREE_NODE_EMPTY * TYPE_FACTOR ) + TREE_NODE_UNDEFINED TREE_NODE_IDENTIFIER_NULL = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_IDENTIFIER_STRING = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_IDENTIFIER_REAL = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_IDENTIFIER_INTEGER = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_IDENTIFIER_BOOLEAN = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_IDENTIFIER_EMPTY = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_IDENTIFIER_IDENTIFIER = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_IDENTIFIER_UNDEFINED = ( TREE_NODE_IDENTIFIER * TYPE_FACTOR ) + TREE_NODE_UNDEFINED TREE_NODE_UNDEFINED_NULL = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_NULL TREE_NODE_UNDEFINED_STRING = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_STRING TREE_NODE_UNDEFINED_REAL = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_REAL TREE_NODE_UNDEFINED_INTEGER = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_INTEGER TREE_NODE_UNDEFINED_BOOLEAN = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_BOOLEAN TREE_NODE_UNDEFINED_EMPTY = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_EMPTY TREE_NODE_UNDEFINED_IDENTIFIER = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_IDENTIFIER TREE_NODE_UNDEFINED_UNDEFINED = ( TREE_NODE_UNDEFINED * TYPE_FACTOR ) + TREE_NODE_UNDEFINED Initialize_Globals = True End Function Function ParseCommandLine ( a_ArgumentArray , a_ArgumentArrayCount , ByRef a_Test , ByRef a_Create , ByRef a_Server , ByRef a_Namespace , ByRef a_Query , ByRef a_Script , ByRef a_FilterName , ByRef a_ConsumerName ) ParseCommandLine = Error_Success a_Test = False a_Create = False If a_ArgumentArrayCount <> 0 Then Dim t_ArgumentIndex t_ArgumentIndex = 0 While t_ArgumentIndex < a_ArgumentArrayCount Dim t_Argument t_Argument = a_ArgumentArray ( t_ArgumentIndex ) If t_Argument = "-T" Then a_Test = True t_ArgumentIndex = t_ArgumentIndex + 1 If t_ArgumentIndex = a_ArgumentArrayCount - 1 Then a_Query = a_ArgumentArray ( t_ArgumentIndex ) Else ParseCommandLine = Error_InsufficientArgs End If Exit Function Else If t_Argument = "-D" Then t_ArgumentIndex = t_ArgumentIndex + 1 a_Create = FALSE If t_Argument = "-S" Then t_ArgumentIndex = t_ArgumentIndex + 1 a_Server = a_ArgumentArray ( t_ArgumentIndex ) Else If t_Argument = "-N" Then t_ArgumentIndex = t_ArgumentIndex + 1 a_Namespace = a_ArgumentArray ( t_ArgumentIndex ) Else If t_ArgumentIndex = a_ArgumentArrayCount - 1 - 1 Then a_FilterName = a_ArgumentArray ( t_ArgumentIndex ) a_ConsumerName = a_ArgumentArray ( t_ArgumentIndex + 1 ) Else ParseCommandLine = Error_InsufficientArgs End If Exit Function End If End If t_ArgumentIndex = t_ArgumentIndex + 1 Else If t_Argument = "-C" Then t_ArgumentIndex = t_ArgumentIndex + 1 a_Create = TRUE If t_Argument = "-S" Then t_ArgumentIndex = t_ArgumentIndex + 1 a_Server = a_ArgumentArray ( t_ArgumentIndex ) Else If t_Argument = "-N" Then t_ArgumentIndex = t_ArgumentIndex + 1 a_Namespace = a_ArgumentArray ( t_ArgumentIndex ) Else If t_ArgumentIndex = a_ArgumentArrayCount - 1 - 3 Then a_Query = a_ArgumentArray ( t_ArgumentIndex ) a_Script = a_ArgumentArray ( t_ArgumentIndex + 1 ) a_FilterName = a_ArgumentArray ( t_ArgumentIndex + 2 ) a_ConsumerName = a_ArgumentArray ( t_ArgumentIndex + 3 ) Else ParseCommandLine = Error_InsufficientArgs End If Exit Function End If End If t_ArgumentIndex = t_ArgumentIndex + 1 Else ParseCommandLine = Error_InvalidArgs Exit Function End If End If End If Wend Else ParseCommandLine = Error_NoArgs End If End Function '--------------------------------------------------------- ' ' Function: ' ' CreateFilter ' ' Description: ' ' ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function CreateFilter ( a_Filter , a_Query , a_Name ) a_Filter.QueryLanguage = "WQL" a_Filter.Query = a_Query a_Filter.Name = a_Name a_Filter.Put_ CreateFilter = Err.Number End Function '--------------------------------------------------------- ' ' Function: ' ' CreateConsumer ' ' Description: ' ' ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function CreateConsumer ( a_Consumer , a_Script , a_Name ) a_Consumer.Name = a_Name If 0 Then a_Consumer.CommandLineTemplate = a_Script a_Consumer.DesktopName = "WinSta0\default" Else a_Consumer.ScriptFilename = a_Script a_Consumer.ScriptingEngine = "VBScript" End If a_Consumer.Put_ CreateConsumer = Err.Number End Function '--------------------------------------------------------- ' ' Function: ' ' CreateBinding ' ' Description: ' ' ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function CreateBinding ( a_Binding , a_Filter , a_Consumer ) a_Binding.Filter = a_Filter.Path_.RelPath a_Binding.Consumer = a_Consumer.Path_.RelPath a_Binding.Put_ CreateBinding = Err.Number End Function '--------------------------------------------------------- ' ' Function: ' ' DeleteFilter ' ' Description: ' ' ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function DeleteFilter ( a_Filter , a_Name ) On Error Resume Next a_Filter.Name = a_Name a_Filter.Delete_ DeleteFilter = Err.Number End Function '--------------------------------------------------------- ' ' Function: ' ' DeleteConsumer ' ' Description: ' ' ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function DeleteConsumer ( a_Consumer , a_Name ) On Error Resume Next a_Consumer.Name = a_Name a_Consumer.Delete_ DeleteConsumer = Err.Number End Function '--------------------------------------------------------- ' ' Function: ' ' DeleteBinding ' ' Description: ' ' ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function DeleteBinding ( a_Binding , a_Filter , a_Consumer ) On Error Resume Next a_Binding.Filter = a_Filter.Path_.RelPath a_Binding.Consumer = a_Consumer.Path_.RelPath a_Binding.Delete_ DeleteBinding = Err.Number End Function '--------------------------------------------------------- ' ' Function: ' ' CreateFilterBindingAndConsumer ' ' Description: ' ' Parse command line arguments, to extract server, namespace, query definition and consumer to execute ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function CreateFilterBindingAndConsumer ( a_Server , a_Namespace , a_Query , a_Script , a_FilterName , a_ConsumerName ) Dim t_Locator Dim t_Service Dim t_Filter Dim t_Binding Dim t_Consumer Set t_Locator = CreateObject("WbemScripting.SWbemLocator") if Err.Number <> 0 Then WScript.Echo "CreateObject" , Err.Description CreateFilterBindingAndConsumer = Err.Number Exit Function End If Set t_Server = t_Locator.ConnectServer ( a_server, a_Namespace ) if Err.Number <> 0 Then WScript.Echo "ConnectServer" , Err.Description CreateFilterBindingAndConsumer = Err.Number Exit Function End If Set t_Filter = t_Server.Get ( "__EventFilter" ).SpawnInstance_ If Err.Number <> 0 Then WScript.Echo "Get __EventFilter" , Err.Description CreateFilterBindingAndConsumer = Err.Number Exit Function End If Set t_Binding = t_Server.Get ( "__FilterToConsumerBinding" ).SpawnInstance_ If Err.Number <> 0 Then WScript.Echo "Get __FilterToConsumerBinding" , Err.Description CreateFilterBindingAndConsumer = Err.Number Exit Function End If If 0 Then Set t_Consumer = t_Server.Get ( "CommandLineEventConsumer" ).SpawnInstance_ Else Set t_Consumer = t_Server.Get ( "ActiveScriptEventConsumer" ).SpawnInstance_ End If If Err.Number <> 0 Then WScript.Echo "Get CommandLineConsumer" , Err.Description CreateFilterBindingAndConsumer = Err.Number Exit Function End If Dim t_Status t_Status = CreateFilter ( t_Filter , a_Query , a_FilterName ) If Err.Number <> 0 Then WScript.Echo "CreateFilter" , Err.Description CreateFilterBindingAndConsumer = Err.Number Exit Function End If t_Status = CreateConsumer ( t_Consumer , a_Script , a_ConsumerName ) If Err.Number <> 0 Then WScript.Echo "CreateConsumer" , Err.Description t_Status = t_Filter.Delete_ CreateFilterBindingAndConsumer = Err.Number Exit Function End If t_Status = CreateBinding ( t_Binding , t_Filter , t_Consumer ) If Err.Number <> 0 Then WScript.Echo "CreateBinding" , Err.Description t_Status = t_Filter.Delete_ t_Status = t_Consumer.Delete_ CreateFilterBindingAndConsumer = Err.Number Exit Function End If End Function '--------------------------------------------------------- ' ' Function: ' ' DeleteFilterBindingAndConsumer ' ' Description: ' ' Parse command line arguments, to extract server, namespace, query definition and consumer to execute ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function DeleteFilterBindingAndConsumer ( a_Server , a_Namespace , a_FilterName , a_ConsumerName ) Dim t_Locator Dim t_Service Dim t_Filter Dim t_Binding Dim t_Consumer Set t_Locator = CreateObject("WbemScripting.SWbemLocator") if Err.Number <> 0 Then WScript.Echo "CreateObject" , Err.Description DeleteFilterBindingAndConsumer = Err.Number Exit Function End If Set t_Server = t_Locator.ConnectServer ( a_server, a_Namespace ) if Err.Number <> 0 Then WScript.Echo "ConnectServer" , Err.Description DeleteFilterBindingAndConsumer = Err.Number Exit Function End If Set t_Filter = t_Server.Get ( "__EventFilter" ).SpawnInstance_ If Err.Number <> 0 Then WScript.Echo "Get __EventFilter" , Err.Description DeleteFilterBindingAndConsumer = Err.Number Exit Function End If Set t_Binding = t_Server.Get ( "__FilterToConsumerBinding" ).SpawnInstance_ If Err.Number <> 0 Then WScript.Echo "Get __FilterToConsumerBinding" , Err.Description DeleteFilterBindingAndConsumer = Err.Number Exit Function End If If 0 Then Set t_Consumer = t_Server.Get ( "CommandLineEventConsumer" ).SpawnInstance_ Else Set t_Consumer = t_Server.Get ( "ActiveScriptEventConsumer" ).SpawnInstance_ End If If Err.Number <> 0 Then WScript.Echo "Get CommandLineConsumer" , Err.Description DeleteFilterBindingAndConsumer = Err.Number Exit Function End If Dim t_Status On Error Resume Next t_Status = DeleteFilter ( t_Filter , a_FilterName ) If t_Status <> 0 Then WScript.Echo "DeleteFilter" , t_Status , Err.Description DeleteFilterBindingAndConsumer = t_Status End If t_Status = DeleteConsumer ( t_Consumer , a_ConsumerName ) If t_Status <> 0 Then WScript.Echo "DeleteConsumer" , t_Status , Err.Description DeleteFilterBindingAndConsumer = t_Status End If t_Status = DeleteBinding ( t_Binding , t_Filter , t_Consumer ) If t_Status <> 0 Then WScript.Echo "DeleteBinding" , t_Status , Err.Description DeleteFilterBindingAndConsumer = t_Status End If End Function '--------------------------------------------------------- ' ' Function: ' ' InsertLeft ' ' Description: ' ' ' ' Input Arguments: ' ' None ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function Get_Node_Type ( ByRef Node , ByRef Node_Type ) Node_Type = Node ( STRUCT_NODE_TYPE ) Get_Node_Type = TRUE End Function Function Get_Node_Eval_Type ( ByRef Node , ByRef Node_Type ) Node_Type = Node ( STRUCT_INTERNAL_EVAL_TYPE ) Get_Node_Eval_Type = TRUE End Function Function Get_Node_Eval_Value ( ByRef Node , ByRef Node_Value ) Node_Value = Node ( STRUCT_INTERNAL_NODE_VALUE ) Get_Node_Eval_Value = TRUE End Function Function Get_Left_Node ( ByRef Node , ByRef Left_Node ) Left_Node = Node ( STRUCT_LEFT_NODE_VALUE ) Get_Left_Node = TRUE End Function Function Get_Right_Node ( ByRef Node , ByRef Right_Node ) Right_Node = Node ( STRUCT_RIGHT_NODE_VALUE ) Get_Right_Node = TRUE End Function Function Set_Node_Type ( ByRef Node , a_VariantType ) Node ( STRUCT_NODE_TYPE ) = a_VariantType Set_Node_Type = TRUE End Function Function Set_Node_Eval_Type ( ByRef Node , a_VariantType ) Node ( STRUCT_INTERNAL_EVAL_TYPE ) = a_VariantType Set_Node_Eval_Type = TRUE End Function Function Set_Node_Eval_Value ( ByRef Node , a_Variant ) Node ( STRUCT_INTERNAL_NODE_VALUE ) = a_Variant Set_Node_Eval_Value = TRUE End Function Function Set_Left_Node ( ByRef Node , a_Variant ) Node ( STRUCT_LEFT_NODE_VALUE ) = a_Variant Set_Left_Node = TRUE End Function Function Set_Right_Node ( ByRef Node , a_Variant ) Node ( STRUCT_RIGHT_NODE_VALUE ) = a_Variant Set_Right_Node = TRUE End Function Function Output_Node ( ByRef Node ) Select Case Node ( STRUCT_NODE_TYPE ) Case TREE_NODE_LIKE WScript.Echo "Like" Case TREE_NODE_UPPER WScript.Echo "Upper" Case TREE_NODE_LOWER WScript.Echo "Lower" Case TREE_NODE_EQUAL WScript.Echo "=" Case TREE_NODE_NOTEQUAL WScript.Echo "<>" Case TREE_NODE_LESS WScript.Echo "<" Case TREE_NODE_LESSEQUAL WScript.Echo "<=" Case TREE_NODE_GREATER WScript.Echo ">" Case TREE_NODE_GREATEREQUAL WScript.Echo ">=" Case TREE_NODE_NOT WScript.Echo "Not" Case TREE_NODE_UNARYMINUS WScript.Echo "-" Case TREE_NODE_OR WScript.Echo "Or" Case TREE_NODE_AND WScript.Echo "And" Case TREE_NODE_ISA WScript.Echo "IsA" Case TREE_NODE_PLUS WScript.Echo "Plus" Case TREE_NODE_MINUS WScript.Echo "Minus" Case TREE_NODE_DIVIDE WScript.Echo "Divide" Case TREE_NODE_MULTIPLY WScript.Echo "Multiply" Case TREE_NODE_NULL WScript.Echo "Null" Case TREE_NODE_STRING WScript.Echo "String" Case TREE_NODE_REAL WScript.Echo "Real" Case TREE_NODE_INTEGER WScript.Echo "Integer" Case TREE_NODE_BOOLEAN WScript.Echo "Boolean" Case TREE_NODE_IDENTIFIER WScript.Echo "Identifier" Case TREE_NODE_EMPTY WScript.Echo "Empty" Case Else WScript.Echo "Unknown" End Select End Function Function Concatenate_Identifier ( ByRef Node , ByRef a_String ) Dim Identifier_Array Identifier_Array = Node ( STRUCT_INTERNAL_NODE_VALUE ) Dim Array_Size Array_Size = UBound ( Identifier_Array ) - LBound ( Identifier_Array ) + 1 Dim Index Index = 0 While Index < Array_Size a_String = a_String + CStr ( Identifier_Array ( Index ) ) If Index < Array_Size - 1 Then a_String = a_String + "." End If Index = Index + 1 WEnd Concatenate_Identifier = True End Function Function Resolve_Identifier ( ByRef Node , a_EventObject ) Dim Identifier_Array Identifier_Array = Node ( STRUCT_INTERNAL_NODE_VALUE ) Dim Array_Size Array_Size = UBound ( Identifier_Array ) - LBound ( Identifier_Array ) + 1 Dim t_Object Set t_Object = a_EventObject Dim Index Index = 0 While Index < Array_Size Dim t_Property Dim t_PropertyValue Set t_Property = t_Object.Properties_ ( CStr ( Identifier_Array ( Index ) ) ) If t_Property.CIMType = wbemCimtypeObject Then If Index = Array_Size - 1 Then Status = Set_Node_Eval_Value ( Node , t_Property.Value.GetObjectText_ ) Else Set t_Object = t_Property.Value End If Else If Index = Array_Size - 1 Then Dim Status Status = Set_Node_Eval_Value ( Node , t_Property.Value ) Select Case t_Property.CIMType Case wbemCimtypeSint8 Status = Set_Node_Eval_Type ( Node , TREE_NODE_INTEGER ) Case wbemCimtypeUint8 Status = Set_Node_Eval_Type ( Node , TREE_NODE_INTEGER ) Case wbemCimtypeChar16 Status = Set_Node_Eval_Type ( Node , TREE_NODE_INTEGER ) Case wbemCimtypeSint16 Status = Set_Node_Eval_Type ( Node , TREE_NODE_INTEGER ) Case wbemCimtypeUint16 Status = Set_Node_Eval_Type ( Node , TREE_NODE_INTEGER ) Case wbemCimtypeSint32 Status = Set_Node_Eval_Type ( Node , TREE_NODE_INTEGER ) Case wbemCimtypeUint32 Status = Set_Node_Eval_Type ( Node , TREE_NODE_INTEGER ) Case wbemCimtypeReal32 Status = Set_Node_Eval_Type ( Node , TREE_NODE_REAL ) Case wbemCimtypeReal64 Status = Set_Node_Eval_Type ( Node , TREE_NODE_REAL ) Case wbemCimtypeBoolean Status = Set_Node_Eval_Type ( Node , TREE_NODE_BOOLEAN ) Case wbemCimtypeSint64 Status = Set_Node_Eval_Type ( Node , TREE_NODE_STRING ) Case wbemCimtypeUint64 Status = Set_Node_Eval_Type ( Node , TREE_NODE_STRING ) Case wbemCimtypeString Status = Set_Node_Eval_Type ( Node , TREE_NODE_STRING ) Case wbemCimtypeDatetime Status = Set_Node_Eval_Type ( Node , TREE_NODE_STRING ) Case Else Resolve_Identifier = False End Select Else Resolve_Identifier = False Exit Function End If End If Index = Index + 1 WEnd Resolve_Identifier = True End Function Function Concatenate_Node ( ByRef Node , ByRef a_String ) Select Case Node ( STRUCT_NODE_TYPE ) Case TREE_NODE_LIKE a_String = a_String + " Like " Case TREE_NODE_OR a_String = a_String + " Or " Case TREE_NODE_AND a_String = a_String + " And " Case TREE_NODE_ISA a_String = a_String + " IsA " Case TREE_NODE_UPPER a_String = a_String + " Upper " Case TREE_NODE_LOWER a_String = a_String + " Lower " Case TREE_NODE_EQUAL a_String = a_String + " = " Case TREE_NODE_NOTEQUAL a_String = a_String + " <> " Case TREE_NODE_LESS a_String = a_String + " < " Case TREE_NODE_LESSEQUAL a_String = a_String + " <= " Case TREE_NODE_GREATER a_String = a_String + " > " Case TREE_NODE_GREATEREQUAL a_String = a_String + " >= " Case TREE_NODE_NOT a_String = a_String + " Not " Case TREE_NODE_UNARYMINUS a_String = a_String + " - " Case TREE_NODE_PLUS a_String = a_String + " + " Case TREE_NODE_MINUS a_String = a_String + " - " Case TREE_NODE_DIVIDE a_String = a_String + " / " Case TREE_NODE_MULTIPLY a_String = a_String + " * " Case TREE_NODE_NULL a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_STRING a_String = a_String + """" + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) + """" Case TREE_NODE_REAL a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_INTEGER a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_BOOLEAN a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_IDENTIFIER Dim Status Status = Concatenate_Identifier ( Node , a_String ) Case TREE_NODE_EMPTY a_String = a_String + "Empty" Case Else a_String = a_String + "Unknown" End Select Concatenate_Node = TRUE End Function Function Concatenate_Eval_Node ( ByRef Node , ByRef a_String ) Select Case Node ( STRUCT_NODE_TYPE ) Case TREE_NODE_LIKE a_String = a_String + " Like " Case TREE_NODE_OR a_String = a_String + " Or " Case TREE_NODE_AND a_String = a_String + " And " Case TREE_NODE_ISA a_String = a_String + " IsA " Case TREE_NODE_UPPER a_String = a_String + " Upper " Case TREE_NODE_LOWER a_String = a_String + " Lower " Case TREE_NODE_EQUAL a_String = a_String + " = " Case TREE_NODE_NOTEQUAL a_String = a_String + " <> " Case TREE_NODE_LESS a_String = a_String + " < " Case TREE_NODE_LESSEQUAL a_String = a_String + " <= " Case TREE_NODE_GREATER a_String = a_String + " > " Case TREE_NODE_GREATEREQUAL a_String = a_String + " >= " Case TREE_NODE_NOT a_String = a_String + " Not " Case TREE_NODE_UNARYMINUS a_String = a_String + " - " Case TREE_NODE_PLUS a_String = a_String + " + " Case TREE_NODE_MINUS a_String = a_String + " - " Case TREE_NODE_DIVIDE a_String = a_String + " / " Case TREE_NODE_MULTIPLY a_String = a_String + " * " Case TREE_NODE_NULL a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_STRING a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_REAL a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_INTEGER a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_BOOLEAN a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_IDENTIFIER a_String = a_String + CStr ( Node ( STRUCT_INTERNAL_NODE_VALUE ) ) Case TREE_NODE_EMPTY a_String = a_String + "Empty" Case Else a_String = a_String + "Unknown" End Select Concatenate_Eval_Node = TRUE End Function Function Output_NodeType ( ByRef NodeType ) Select Case NodeType Case TREE_NODE_LIKE WScript.Echo "Like" Case TREE_NODE_OR WScript.Echo "Or" Case TREE_NODE_AND WScript.Echo "And" Case TREE_NODE_ISA WScript.Echo "IsA" Case TREE_NODE_UPPER WScript.Echo "Upper" Case TREE_NODE_LOWER WScript.Echo "Lower" Case TREE_NODE_EQUAL WScript.Echo "=" Case TREE_NODE_NOTEQUAL WScript.Echo "<>" Case TREE_NODE_LESS WScript.Echo "<" Case TREE_NODE_LESSEQUAL WScript.Echo "<=" Case TREE_NODE_GREATER WScript.Echo ">" Case TREE_NODE_GREATEREQUAL WScript.Echo ">=" Case TREE_NODE_NOT WScript.Echo "Not" Case TREE_NODE_UNARYMINUS WScript.Echo "-" Case TREE_NODE_PLUS WScript.Echo "Plus" Case TREE_NODE_MINUS WScript.Echo "Minus" Case TREE_NODE_DIVIDE WScript.Echo "Divide" Case TREE_NODE_MULTIPLY WScript.Echo "Multiply" Case TREE_NODE_NULL WScript.Echo "Null" Case TREE_NODE_STRING WScript.Echo "String" Case TREE_NODE_REAL WScript.Echo "Real" Case TREE_NODE_INTEGER WScript.Echo "Integer" Case TREE_NODE_BOOLEAN WScript.Echo "Boolean" Case TREE_NODE_IDENTIFIER WScript.Echo "Identifier" Case TREE_NODE_EMPTY WScript.Echo "Empty" Case Else WScript.Echo "Unknown" End Select End Function Function Is_Simple_Type ( ByRef NodeType ) Select Case NodeType Case TREE_NODE_NULL Is_Simple_Type = true Case TREE_NODE_STRING Is_Simple_Type = true Case TREE_NODE_REAL Is_Simple_Type = true Case TREE_NODE_INTEGER Is_Simple_Type = true Case TREE_NODE_BOOLEAN Is_Simple_Type = true Case Else Is_Simple_Type = false End Select End Function Function Is_Unary_Node ( ByRef Node ) Select Case Node ( STRUCT_NODE_TYPE ) Case TREE_NODE_NOT Is_Unary_Node = true Case TREE_NODE_UNARYMINUS Is_Unary_Node = true Case TREE_NODE_UPPER Is_Unary_Node = true Case TREE_NODE_LOWER Is_Unary_Node = true Case Else Is_Unary_Node = false End Select End Function Function Is_Binary_Node ( ByRef Node ) Select Case Node ( STRUCT_NODE_TYPE ) Case TREE_NODE_LIKE Is_Binary_Node = true Case TREE_NODE_OR Is_Binary_Node = true Case TREE_NODE_AND Is_Binary_Node = true Case TREE_NODE_ISA Is_Binary_Node = true Case TREE_NODE_PLUS Is_Binary_Node = true Case TREE_NODE_MINUS Is_Binary_Node = true Case TREE_NODE_DIVIDE Is_Binary_Node = true Case TREE_NODE_MULTIPLY Is_Binary_Node = true Case TREE_NODE_EQUAL Is_Binary_Node = true Case TREE_NODE_NOTEQUAL Is_Binary_Node = true Case TREE_NODE_GREATER Is_Binary_Node = true Case TREE_NODE_GREATEREQUAL Is_Binary_Node = true Case TREE_NODE_LESS Is_Binary_Node = true Case TREE_NODE_LESSEQUAL Is_Binary_Node = true Case Else Is_Binary_Node = false End Select End Function Function Is_Relational ( ByRef Node ) Select Case Node ( STRUCT_NODE_TYPE ) Case TREE_NODE_LIKE Is_Relational = true Case TREE_NODE_ISA Is_Relational = true Case TREE_NODE_EQUAL Is_Relational = true Case TREE_NODE_NOTEQUAL Is_Relational = true Case TREE_NODE_GREATER Is_Relational = true Case TREE_NODE_GREATEREQUAL Is_Relational = true Case TREE_NODE_LESS Is_Relational = true Case TREE_NODE_LESSEQUAL Is_Relational = true Case Else Is_Relational = false End Select End Function Function Is_Non_Conformant_Node ( ByRef Node ) Select Case Node ( STRUCT_NODE_TYPE ) Case TREE_NODE_PLUS Is_Non_Conformant_Node = true Case TREE_NODE_MINUS Is_Non_Conformant_Node = true Case TREE_NODE_DIVIDE Is_Non_Conformant_Node = true Case TREE_NODE_MULTIPLY Is_Non_Conformant_Node = true Case TREE_NODE_UNARYMINUS Is_Non_Conformant_Node = true Case Else Is_Non_Conformant_Node = false End Select End Function Function Validate_Unary_Node ( Function_Node , Arg1_Node , ByRef ResultType ) Validate_Unary_Node = FALSE Dim Index Index = 0 While True Dim ElementIndex ElementIndex = Index * 3 Dim Function_Value Dim Arg1_Value Dim Arg2_Value Dim Result_Value Function_Value = Unary_Function_Definition ( ElementIndex ) Arg1_Value = Unary_Function_Definition ( ElementIndex + 1 ) Result_Value = Unary_Function_Definition ( ElementIndex + 2 ) If Function_Value = TREE_NODE_EMPTY Then Exit Function End If Dim Status Dim Function_Input Dim Arg1_Input Dim Arg2_Input Status = Get_Node_Type ( Function_Node , Function_Input ) Status = Get_Node_Eval_Type ( Arg1 , Arg1_Input ) Dim Equivalence Equivalence = ( Function_Value = Function_Input ) Equivalence = Equivalence And ( Arg1_Value = Arg1_Input ) If Equivalence Then ResultType = Result_Value Validate_Unary_Node = True Exit Function End If Index = Index + 1 WEnd End Function Function Validate_Binary_Node ( Function_Node , Arg1_Node , Arg2_Node , ByRef ResultType ) Validate_Binary_Node = FALSE Dim Index Index = 0 While True Dim ElementIndex ElementIndex = Index * 4 Dim Function_Value Dim Arg1_Value Dim Arg2_Value Dim Result_Value Function_Value = Binary_Function_Definition ( ElementIndex ) Arg1_Value = Binary_Function_Definition ( ElementIndex + 1 ) Arg2_Value = Binary_Function_Definition ( ElementIndex + 2 ) Result_Value = Binary_Function_Definition ( ElementIndex + 3 ) If Function_Value = TREE_NODE_EMPTY Then Exit Function End If Dim Status Dim Function_Input Dim Arg1_Input Dim Arg2_Input Status = Get_Node_Type ( Function_Node , Function_Input ) Status = Get_Node_Eval_Type ( Arg1_Node , Arg1_Input ) Status = Get_Node_Eval_Type ( Arg2_Node , Arg2_Input ) Dim Equivalence Equivalence = ( Function_Value = Function_Input ) Equivalence = Equivalence And ( Arg1_Value = Arg1_Input ) Equivalence = Equivalence And ( Arg2_Value = Arg2_Input ) If Equivalence Then ResultType = Result_Value Validate_Binary_Node = True Exit Function End If Index = Index + 1 WEnd End Function Function Create_Binary_Node_Template ( ByRef Node ) Dim Empty_Node Dim Undefined_Node Dim Status Status = Create_Empty ( Empty_Node ) Status = Create_Undefined ( Undefined_Node ) Node = Array ( TREE_NODE_UNDEFINED , Undefined_Node , TREE_NODE_UNDEFINED , Empty_Node , Empty_Node ) Create_Binary_Node_Template = TRUE End Function Function Create_Unary_Node_Template ( ByRef Node ) Dim Empty_Node Dim Undefined_Node Dim Status Status = Create_Empty ( Empty_Node ) Status = Create_Undefined ( Undefined_Node ) Node = Array ( TREE_NODE_UNDEFINED , Undefined_Node , TREE_NODE_UNDEFINED , Empty_Node ) Create_Unary_Node_Template = TRUE End Function Function Create_Like ( ByRef Like_Node ) Dim Status Status = Create_Binary_Node_Template ( Like_Node ) Status = Set_Node_Type ( Like_Node , TREE_NODE_LIKE ) Create_Like = TRUE End Function Function Create_Lower ( ByRef Lower_Node ) Dim Status Status = Create_Unary_Node_Template ( Lower_Node ) Status = Set_Node_Type ( Lower_Node , TREE_NODE_LOWER ) Create_Lower = TRUE End Function Function Create_Upper ( ByRef Upper_Node ) Dim Status Status = Create_Unary_Node_Template ( Upper_Node ) Status = Set_Node_Type ( Upper_Node , TREE_NODE_UPPER ) Create_Upper = TRUE End Function Function Create_And ( ByRef And_Node ) Dim Status Status = Create_Binary_Node_Template ( And_Node ) Status = Set_Node_Type ( And_Node , TREE_NODE_AND ) Create_And = TRUE End Function Function Create_Or ( ByRef Or_Node ) Dim Status Status = Create_Binary_Node_Template ( Or_Node ) Status = Set_Node_Type ( Or_Node , TREE_NODE_OR ) Create_OR = TRUE End Function Function Create_Less ( ByRef Less_Node ) Dim Status Status = Create_Binary_Node_Template ( Less_Node ) Status = Set_Node_Type ( Less_Node , TREE_NODE_LESS ) Create_Less = TRUE End Function Function Create_Greater ( ByRef Greater_Node ) Dim Status Status = Create_Binary_Node_Template ( Greater_Node ) Status = Set_Node_Type ( Greater_Node , TREE_NODE_GREATER ) Create_Greater = TRUE End Function Function Create_Equal ( ByRef Equal_Node ) Dim Status Status = Create_Binary_Node_Template ( Equal_Node ) Status = Set_Node_Type ( Equal_Node , TREE_NODE_EQUAL ) Create_Equal = TRUE End Function Function Create_NotEqual ( ByRef NotEqual_Node ) Dim Status Status = Create_Binary_Node_Template ( NotEqual_Node ) Status = Set_Node_Type ( NotEqual , TREE_NODE_NOTEQUAL ) Create_NotEqual = TRUE End Function Function Create_LessEqual ( ByRef LessEqual_Node ) Dim Status Status = Create_Binary_Node_Template ( LessEqual_Node ) Status = Set_Node_Type ( LessEqual_Node , TREE_NODE_LESSEQUAL ) Create_LessEqual = TRUE End Function Function Create_GreaterEqual ( ByRef GreaterEqual_Node ) Dim Status Status = Create_Binary_Node_Template ( GreaterEqual_Node ) Status = Set_Node_Type ( GreaterEqual_Node , TREE_NODE_GREATEREQUAL ) Create_GreaterEqual = TRUE End Function Function Create_IsA ( ByRef Isa_Node ) Dim Status Status = Create_Binary_Node_Template ( Isa_Node ) Status = Set_Node_Type ( Isa_Node , TREE_NODE_ISA ) Create_IsA = TRUE End Function Function Create_Plus ( ByRef Plus_Node ) Dim Status Status = Create_Binary_Node_Template ( Plus_Node ) Status = Set_Node_Type ( Plus_Node , TREE_NODE_PLUS ) Create_Plus = TRUE End Function Function Create_Minus ( ByRef Minus_Node ) Dim Status Status = Create_Binary_Node_Template ( Minus_Node ) Status = Set_Node_Type ( Minus_Node , TREE_NODE_MINUS ) Create_Minus = TRUE End Function Function Create_Multiply ( ByRef Multiply_Node ) Dim Status Status = Create_Binary_Node_Template ( Multiply_Node ) Status = Set_Node_Type ( Multiply_Node , TREE_NODE_MULTIPLY ) Create_Multiply = TRUE End Function Function Create_Divide ( ByRef Divide_Node ) Dim Status Status = Create_Binary_Node_Template ( Divide_Node ) Status = Set_Node_Type ( Divide_Node , TREE_NODE_DIVIDE ) Create_Divide = TRUE End Function Function Create_Not ( ByRef Not_Node ) Dim Status Status = Create_Unary_Node_Template ( Not_Node ) Status = Set_Node_Type ( Not_Node , TREE_NODE_NOT ) Create_Not = TRUE End Function Function Create_UnaryMinus ( ByRef UnaryMinus_Node ) Dim Status Status = Create_Unary_Node_Template ( UnaryMinus_Node ) Status = Set_Node_Type ( UnaryMinus_Node , TREE_NODE_UNARY_MINUS ) Create_UnaryMinus = TRUE End Function Function Create_Identifier ( ByRef Identifier_Node , a_Identifier ) Dim Identifier_Value Identifier_Value = Array ( a_Identifier ) Identifier_Node = Array ( TREE_NODE_IDENTIFIER , Identifier_Value , TREE_NODE_UNDEFINED ) Create_Identifier = TRUE End Function Function Insert_Identifier ( ByRef Identifier_Node , a_Identifier ) Dim Identifier_Array Identifier_Array = Identifier_Node ( STRUCT_INTERNAL_NODE_VALUE ) Dim Array_Size Array_Size = UBound ( Identifier_Array ) - LBound ( Identifier_Array ) + 1 Redim Preserve Identifier_Array ( Array_Size ) Identifier_Array ( Array_Size ) = a_Identifier Identifier_Node ( STRUCT_INTERNAL_NODE_VALUE ) = Identifier_Array Insert_Identifier = TRUE End Function Function Create_String ( ByRef String_Node , a_String ) String_Node = Array ( TREE_NODE_STRING , a_String , TREE_NODE_STRING ) Create_String = TRUE End Function Function Create_Integer ( ByRef Integer_Node , a_Integer ) Integer_Node = Array ( TREE_NODE_INTEGER , CInt ( a_Integer ) , TREE_NODE_INTEGER ) Create_Integer = TRUE End Function Function Create_Boolean ( ByRef Boolean_Node , a_Boolean ) Boolean_Node = Array ( TREE_NODE_BOOLEAN , CBool ( a_Boolean ) , TREE_NODE_BOOLEAN ) Create_Boolean = TRUE End Function Function Create_Real ( ByRef Real_Node , a_Real ) Real_Node = Array ( TREE_NODE_REAL , CDbl ( a_Real ) , TREE_NODE_REAL ) Create_Real = TRUE End Function Function Create_Null ( ByRef Null_Node ) Null_Node = Array ( TREE_NODE_NULL , "" , TREE_NODE_NULL ) Create_Null = TRUE End Function Function Create_Empty ( ByRef Empty_Node ) Empty_Node = Array ( TREE_NODE_EMPTY , "" , TREE_NODE_EMPTY ) Create_Empty = TRUE End Function Function Create_Undefined ( ByRef Undefined_Node ) Undefined_Node = Array ( TREE_NODE_UNDEFINED, "" , TREE_NODE_UNDEFINED ) Create_Undefined = TRUE End Function Function Evaluate_Expression_UnaryMinus ( ByRef a_Root , ByRef Node , ByRef a_EventObject ) Evaluate_Expression_UnaryMinus = True Dim Node_Value Dim Node_Type Status = Get_Node_Eval_Type ( Node , Node_Type ) Status = Get_Node_Eval_Value ( Node , Node_Value ) Dim Created_Node Select Case Node_Type Case TREE_NODE_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_INTEGER ) Status = Set_Node_Eval_Value ( a_Root , -1 * Node_Value ) Case TREE_NODE_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_REAL ) Status = Set_Node_Eval_Value ( a_Root , 1.0 * Node_Value ) Case Else Evaluate_Expression_UnaryMinus = False End Select End Function Function Evaluate_Expression_Not ( ByRef a_Root , ByRef Node , ByRef a_EventObject ) Evaluate_Expression_Not = True Dim Node_Value Dim Node_Type Status = Get_Node_Eval_Type ( Node , Node_Type ) Status = Get_Node_Eval_Value ( Node , Node_Value ) Dim Created_Node Select Case Node_Type Case TREE_NODE_BOOLEAN Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , Not ( Node_Value ) ) Case Else Evaluate_Expression_Not = False End Select End Function Function Evaluate_Expression_Upper ( ByRef a_Root , ByRef Node , ByRef a_EventObject ) Evaluate_Expression_Upper = True Dim Node_Value Dim Node_Type Status = Get_Node_Eval_Type ( Node , Node_Type ) Status = Get_Node_Eval_Value ( Node , Node_Value ) Dim Created_Node Select Case Node_Type Case TREE_NODE_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_STRING ) Dim UpperString UpperString = Node_Value.toUpperCase Status = Set_Node_Eval_Value ( a_Root , UpperString ) Case Else Evaluate_Expression_Upper = False End Select End Function Function Evaluate_Expression_Lower ( ByRef a_Root , ByRef Node , ByRef a_EventObject ) Evaluate_Expression_Lower = True Dim Node_Value Dim Node_Type Status = Get_Node_Eval_Type ( Node , Node_Type ) Status = Get_Node_Eval_Value ( Node , Node_Value ) Dim Created_Node Select Case Node_Type Case TREE_NODE_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_STRING ) Dim LowerString LowerString = Node_Value.toLowerCase Status = Set_Node_Eval_Value ( a_Root , LowerString ) Case Else Evaluate_Expression_Lower = False End Select End Function Function Evaluate_Expression_Or ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Or = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_BOOLEAN_BOOLEAN Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value Or RightNode_Value ) Case Else Evaluate_Expression_Or = False End Select End Function Function Evaluate_Expression_And ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_And = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_BOOLEAN_BOOLEAN Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value And RightNode_Value ) Case Else Evaluate_Expression_And = False End Select End Function Function Evaluate_Expression_Minus ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Minus = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_INTEGER ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value - RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_REAL ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value - RightNode_Value ) Case Else Evaluate_Expression_Minus = False End Select End Function Function Evaluate_Expression_Plus ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Plus = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_STRING_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_String ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value + RightNode_Value ) Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_INTEGER ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value + RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_REAL ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value + RightNode_Value ) Case Else Evaluate_Expression_Plus = False End Select End Function Function Evaluate_Expression_Multiply ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Multiply = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_INTEGER ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value * RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_REAL ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value * RightNode_Value ) Case Else Evaluate_Expression_Multiply = False End Select End Function Function Evaluate_Expression_Divide ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Divide = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_INTEGER_INTEGER If RightNode_Value <> 0.0 Then Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_INTEGER ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value / RightNode_Value ) Else Evaluate_Expression_Divide = False End If Case TREE_NODE_REAL_REAL If RightNode_Value <> 0.0 Then Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_REAL ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value / RightNode_Value ) Else Evaluate_Expression_Divide = False End If Case Else Evaluate_Expression_Divide = False End Select End Function Function Evaluate_Expression_Like ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Like = True End Function Function Evaluate_Expression_Isa ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Isa = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_UNDEFINED_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , True ) Case Else Evaluate_Expression_Isa = False End Select End Function Function Evaluate_Expression_Equal ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Equal = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_STRING_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value = RightNode_Value ) Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value = RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value = RightNode_Value ) Case TREE_NODE_NULL_NULL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value = RightNode_Value ) Case Else Evaluate_Expression_Equal = False End Select End Function Function Evaluate_Expression_NotEqual ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_NotEqual = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_STRING_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value <> RightNode_Value ) Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value <> RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value <> RightNode_Value ) Case TREE_NODE_NULL_NULL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value <> RightNode_Value ) Case Else Evaluate_Expression_NotEqual = False End Select End Function Function Evaluate_Expression_Less ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Less = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_STRING_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value < RightNode_Value ) Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value < RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value < RightNode_Value ) Case Else Evaluate_Expression_Less = False End Select End Function Function Evaluate_Expression_Greater ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_Greater = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_STRING_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value > RightNode_Value ) Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value > RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value > RightNode_Value ) Case Else Evaluate_Expression_Greater = False End Select End Function Function Evaluate_Expression_LessEqual ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_LessEqual = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_STRING_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value <= RightNode_Value ) Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value <= RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value <= RightNode_Value ) Case Else Evaluate_Expression_LessEqual = False End Select End Function Function Evaluate_Expression_GreaterEqual ( ByRef a_Root , ByRef LeftNode , ByRef RightNode , ByRef a_EventObject ) Evaluate_Expression_GreaterEqual = True Dim LeftNode_Value Dim LeftNode_Type Dim RightNode_Value Dim RightNode_Type Status = Get_Node_Eval_Type ( LeftNode , LeftNode_Type ) Status = Get_Node_Eval_Value ( LeftNode , LeftNode_Value ) Status = Get_Node_Eval_Type ( RightNode , RightNode_Type ) Status = Get_Node_Eval_Value ( RightNode , RightNode_Value ) Dim Node_Types Node_Types = ( LeftNode_Type * TYPE_FACTOR ) + RightNode_Type Dim Created_Node Select Case Node_Types Case TREE_NODE_STRING_STRING Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value >= RightNode_Value ) Case TREE_NODE_INTEGER_INTEGER Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value >= RightNode_Value ) Case TREE_NODE_REAL_REAL Status = Set_Node_Eval_Type ( a_Root , TREE_NODE_BOOLEAN ) Status = Set_Node_Eval_Value ( a_Root , LeftNode_Value >= RightNode_Value ) Case Else Evaluate_Expression_GreaterEqual = False End Select End Function Function Traverse_Tree ( ByRef a_Root , ByRef a_String ) Dim Status If Is_Unary_Node ( a_Root ) Then Status = Concatenate_Node ( a_Root , a_String ) Dim Node Status = Get_Left_Node ( a_Root , Node ) Status = Traverse_Tree ( Node , a_String ) Else If Is_Binary_Node ( a_Root ) Then Dim LeftNode Dim RightNode Status = Get_Left_Node ( a_Root , LeftNode ) Status = Get_Right_Node ( a_Root , RightNode ) a_String = a_String + "( " Status = Traverse_Tree ( LeftNode , a_String ) Status = Concatenate_Node ( a_Root , a_String ) Status = Traverse_Tree ( RightNode , a_String ) a_String = a_String + " )" Else Status = Concatenate_Node ( a_Root , a_String ) End If End If End Function Function Traverse_Eval_Tree ( ByRef a_Root , ByRef a_String ) Dim Status If Is_Unary_Node ( a_Root ) Then Status = Concatenate_Eval_Node ( a_Root , a_String ) Dim Node Status = Get_Left_Node ( a_Root , Node ) Status = Traverse_Eval_Tree ( Node , a_String ) Else If Is_Binary_Node ( a_Root ) Then Dim LeftNode Dim RightNode Status = Get_Left_Node ( a_Root , LeftNode ) Status = Get_Right_Node ( a_Root , RightNode ) a_String = a_String + "( " Status = Traverse_Eval_Tree ( LeftNode , a_String ) Status = Concatenate_Eval_Node ( a_Root , a_String ) Status = Traverse_Eval_Tree ( RightNode , a_String ) a_String = a_String + " )" Else Status = Concatenate_Eval_Node ( a_Root , a_String ) End If End If End Function Function Type_Internal_Evaluate_Tree ( ByRef a_Root , ByRef a_FailureRoot ) Type_Internal_Evaluate_Tree = True Dim Status If Is_Unary_Node ( a_Root ) Then Dim Node Status = Get_Left_Node ( a_Root , Node ) Status = Type_Internal_Evaluate_Tree ( Node , a_FailureRoot ) If Status = True Then Dim ResultType Status = Validate_Unary_Node ( a_Root , Node , ResultType ) If Status = True Then Status = Set_Node_Eval_Type ( a_Root , ResultType ) Else Type_Internal_Evaluate_Tree = False a_FailureRoot = a_Root Exit Function End If End If Else If Is_Binary_Node ( a_Root ) Then Dim LeftNode Dim RightNode Status = Get_Left_Node ( a_Root , LeftNode ) Status = Get_Right_Node ( a_Root , RightNode ) Status = Type_Internal_Evaluate_Tree ( LeftNode , a_FailureRoot ) If Status = True Then Status = Type_Internal_Evaluate_Tree ( RightNode , a_FailureRoot ) If Status = True Then Status = Validate_Binary_Node ( a_Root , LeftNode , RightNode , ResultType ) If Status = True Then Status = Set_Node_Eval_Type ( a_Root , ResultType ) Else a_FailureRoot = a_Root Type_Internal_Evaluate_Tree = False Exit Function End If Else Exit Function End If Else Exit Function End If Else End If End If End Function Function Type_Evaluate_Tree ( ByRef a_Root ) Dim t_FailureTree Type_Evaluate_Tree = Type_Internal_Evaluate_Tree ( a_Root , t_FailureTree ) If Type_Evaluate_Tree = False Then If Is_Unary_Node ( t_FailureTree ) Then Dim t_LeftNode Dim t_LeftNodeType Dim Status Status = Get_Left_Node ( t_Failure_Tree , t_LeftNode ) Status = Get_Node_Eval_Type ( t_LeftNode , t_LeftNodeType ) Output_Node ( t_FailureExpression ) Output_Node ( t_LeftNode ) Output_NodeType ( t_LeftNodeType ) Else If Is_Binary_Node ( t_FailureTree ) Then Dim t_RightNode Dim t_RightNodeType Status = Get_Left_Node ( t_FailureTree , t_LeftNode ) Status = Get_Right_Node ( t_FailureTree , t_RightNode ) Status = Get_Node_Eval_Type ( t_LeftNode , t_LeftNodeType ) Status = Get_Node_Eval_Type ( t_RightNode , t_RightNodeType ) Output_Node ( t_FailureTree ) Output_Node ( t_LeftNode ) Output_NodeType ( t_LeftNodeType ) Output_Node ( t_RightNode ) Output_NodeType ( t_RightNodeType ) Else End If End If Dim t_FailureExpression Status = Traverse_Tree ( t_FailureTree ,t_FailureExpression ) WScript.Echo t_FailureExpression End If End Function Function Generate_Conformant_Expression ( ByRef a_Parent , ByRef a_Root , ByRef a_Contains_Non_Conformant ) Generate_Conformant_Expression = True Dim Status Dim ParentType Status = Get_Node_Type ( a_Parent , ParentType ) Status = Is_Non_Conformant_Node ( a_Root ) If Status Then a_Contains_Non_Conformant = True Else Dim t_Is_Relational t_Is_Relational = Is_Relational ( a_Root ) If Is_Unary_Node ( a_Root ) Then Dim Node Status = Get_Left_Node ( a_Root , Node ) Generate_Conformant_Expression = Generate_Conformant_Expression ( a_Root , Node , a_Contains_Non_Conformant ) Status = Set_Left_Node ( a_Root , Node ) Else If Is_Binary_Node ( a_Root ) Then Dim LeftNode Dim RightNode Status = Get_Left_Node ( a_Root , LeftNode ) Generate_Conformant_Expression = Generate_Conformant_Expression ( a_Root , LeftNode , a_Contains_Non_Conformant ) Status = Set_Left_Node ( a_Root , LeftNode ) If a_Contains_Non_Conformant = True And t_Is_Relational = True Then Dim Boolean_Node If ParentType = TREE_NODE_AND Then Status = Create_Boolean ( Boolean_Node , True ) Else Status = Create_Boolean ( Boolean_Node , False ) End If a_Root = Boolean_Node a_Contains_Non_Conformant = False Else Status = Get_Right_Node ( a_Root , RightNode ) Generate_Conformant_Expression = Generate_Conformant_Expression ( a_Root , RightNode , a_Contains_Non_Conformant ) Status = Set_Right_Node ( a_Root , RightNode ) If a_Contains_Non_Conformant = True And t_Is_Relational = True Then If ParentType = TREE_NODE_AND Then Status = Create_Boolean ( Boolean_Node , True ) Else Status = Create_Boolean ( Boolean_Node , False ) End If a_Root = Boolean_Node End If a_Contains_Non_Conformant = False End If Else End If End If End If If Is_Unary_Node ( a_Root ) Then Dim Node_Type Status = Get_Node_Type ( a_Root , Node_Type ) If Node_Type = TREE_NODE_NOT Then Status = Get_Left_Node ( a_Root , Node ) Status = Get_Node_Type ( Node , Node_Type ) If Node_Type = TREE_NODE_BOOLEAN Then Dim Node_Value Status = Get_Node_Eval_Value ( Node , Node_Value ) If Node_Value = False Then Status = Create_Boolean ( Boolean_Node , True ) Else Status = Create_Boolean ( Boolean_Node , False ) End If a_Root = Boolean_Node End If Else End If Else If Is_Binary_Node ( a_Root ) Then Status = Get_Node_Type ( a_Root , Node_Type ) If Node_Type = TREE_NODE_AND Then Dim LeftNode_Type Dim RightNode_Type Status = Get_Left_Node ( a_Root , LeftNode ) Status = Get_Node_Type ( LeftNode , LeftNode_Type ) Status = Get_Right_Node ( a_Root , RightNode ) Status = Get_Node_Type ( RightNode , RightNode_Type ) If LeftNode_Type = TREE_NODE_BOOLEAN Then Status = Get_Node_Eval_Value ( LeftNode , Node_Value ) If Node_Value = False Then Status = Create_Boolean ( Boolean_Node , False ) a_Root = Boolean_Node Else a_Root = RightNode End If Else If RightNode_Type = TREE_NODE_BOOLEAN Then Status = Get_Node_Eval_Value ( RightNode , Node_Value ) If Node_Value = False Then Status = Create_Boolean ( Boolean_Node , False ) a_Root = Boolean_Node Else a_Root = LeftNode End If End If End If Else If Node_Type = TREE_NODE_OR Then Status = Get_Left_Node ( a_Root , LeftNode ) Status = Get_Node_Type ( LeftNode , LeftNode_Type ) Status = Get_Right_Node ( a_Root , RightNode ) Status = Get_Node_Type ( RightNode , RightNode_Type ) If LeftNode_Type = TREE_NODE_BOOLEAN Then Status = Get_Node_Eval_Value ( LeftNode , Node_Value ) If Node_Value = True Then Status = Create_Boolean ( Boolean_Node , True ) a_Root = Boolean_Node Else a_Root = RightNode End If Else If RightNode_Type = TREE_NODE_BOOLEAN Then Status = Get_Node_Eval_Value ( RightNode , Node_Value ) If Node_Value = True Then Status = Create_Boolean ( Boolean_Node , True ) a_Root = Boolean_Node Else a_Root = LeftNode End If End If End If End If End If End If End If End Function Function Bind_Identifier_Values ( ByRef a_Root , a_EventObject ) Bind_Identifier_Values = True Dim Status If Is_Unary_Node ( a_Root ) Then Dim Node Status = Get_Left_Node ( a_Root , Node ) Bind_Identifier_Values = Bind_Identifier_Values ( Node , a_EventObject ) Status = Set_Left_Node ( a_Root , Node ) Else If Is_Binary_Node ( a_Root ) Then Dim LeftNode Dim RightNode Status = Get_Left_Node ( a_Root , LeftNode ) Status = Get_Right_Node ( a_Root , RightNode ) Bind_Identifier_Values = Bind_Identifier_Values ( LeftNode , a_EventObject ) Status = Set_Left_Node ( a_Root , LeftNode ) If Bind_Identifier_Values = True Then Bind_Identifier_Values = Bind_Identifier_Values ( RightNode , a_EventObject ) Status = Set_Right_Node ( a_Root , RightNode ) End If Else Dim a_Root_Type Status = Get_Node_Type ( a_Root , a_Root_Type ) If a_Root_Type = TREE_NODE_IDENTIFIER Then Bind_Identifier_Values = Resolve_Identifier ( a_Root , a_EventObject ) End If End If End If End Function Function Evaluate_Expression ( ByRef a_Root , a_EventObject ) Evaluate_Expression = True Dim Status If Is_Unary_Node ( a_Root ) Then Dim Node Status = Get_Left_Node ( a_Root , Node ) Evaluate_Expression = Evaluate_Expression ( Node , a_EventObject ) Status = Set_Left_Node ( a_Root , Node ) Dim Node_Type Status = Get_Node_Type ( a_Root , Node_Type ) Select Case Node_Type Case TREE_NODE_UNARYMINUS Evaluate_Expression = Evaluate_Expression_UnaryMinus ( a_Root , Node , a_EventObject ) Case TREE_NODE_NOT Evaluate_Expression = Evaluate_Expression_Not ( a_Root , Node , a_EventObject ) Case Else End Select Else If Is_Binary_Node ( a_Root ) Then Dim LeftNode Dim RightNode Status = Get_Left_Node ( a_Root , LeftNode ) Status = Get_Right_Node ( a_Root , RightNode ) Evaluate_Expression = Evaluate_Expression ( LeftNode , a_EventObject ) Status = Set_Left_Node ( a_Root , LeftNode ) If Evaluate_Expression = True Then Evaluate_Expression = Evaluate_Expression ( RightNode , a_EventObject ) Status = Set_Right_Node ( a_Root , RightNode ) Status = Get_Node_Type ( a_Root , Node_Type ) Select Case Node_Type Case TREE_NODE_OR Evaluate_Expression = Evaluate_Expression_Or ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_AND Evaluate_Expression = Evaluate_Expression_And ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_MINUS Evaluate_Expression = Evaluate_Expression_Minus ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_PLUS Evaluate_Expression = Evaluate_Expression_Plus ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_MULTIPLY Evaluate_Expression = Evaluate_Expression_Multiply ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_DIVIDE Evaluate_Expression = Evaluate_Expression_Divide ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_LIKE Evaluate_Expression = Evaluate_Expression_Like ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_UPPER Evaluate_Expression = Evaluate_Expression_Upper ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_LOWER Evaluate_Expression = Evaluate_Expression_Lower ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_ISA Evaluate_Expression = Evaluate_Expression_Isa ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_EQUAL Evaluate_Expression = Evaluate_Expression_Equal ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_NOTEQUAL Evaluate_Expression = Evaluate_Expression_NotEqual ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_LESS Evaluate_Expression = Evaluate_Expression_Less ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_GREATER Evaluate_Expression = Evaluate_Expression_Greater ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_LESSEQUAL Evaluate_Expression = Evaluate_Expression_LessEqual ( a_Root , LeftNode , RightNode , a_EventObject ) Case TREE_NODE_GREATEREQUAL Evaluate_Expression = Evaluate_Expression_GreaterEqual ( a_Root , LeftNode , RightNode , a_EventObject ) Case Else End Select End If Else End If End If End Function '--------------------------------------------------------- ' ' Function: ' ' LexicalAnalyser_Next ' ' Description: ' ' Lexical analyse input stream ' ' Input Arguments: ' ' a_Dfa - finite machine ' a_Stream - string to parse ' a_Pos - position in stream ' ' Output Arguments: ' ' a_Token - tokenised string parsed ' a_NextPosition - position in stream to scan next ' a_TokenText - string parsed ' ' Return Value: ' ' Status '--------------------------------------------------------- Function LexicalAnalyser_NextToken ( a_Dfa , a_Stream , a_Position , ByRef a_Token , ByRef a_NextPosition , ByRef a_TokenText ) LexicalAnalyser_NextToken = Error_Success Dim State State = 0 Dim Read Read = TRUE Dim EndOfFile EndOfFile = FALSE Dim Current Dim CurrentLine CurrentLine = 0 a_Token = 0 a_TokenText = "" a_NextPosition = a_Position ' Generic DFA driver based on the table specified ' in the constructor. Dim DFA_Definition_Size DFA_Definition_Size = UBound ( DFA_Definition ) - LBound ( DFA_Definition ) + 1 While True Dim Dfa_ElementIndex Dfa_ElementIndex = State * 5 Dim First Dim Last Dim GotoState Dim ReturnToken Dim Instruction First = a_Dfa ( Dfa_ElementIndex ) Last = a_Dfa ( Dfa_ElementIndex + 1 ) GotoState = a_Dfa ( Dfa_ElementIndex + 2 ) ReturnToken = a_Dfa ( Dfa_ElementIndex + 3 ) Instruction = a_Dfa ( Dfa_ElementIndex + 4 ) If g_Debug And 8 Then WScript.Echo a_NextPosition , State , First , Last , GotoState , ReturnToken , Instruction End If If Read Then If EndOfFile Then LexicalAnalyser_NextToken = Error_UnexpectedEof Exit Function End If If a_NextPosition > Len ( a_Stream ) Then Current = 0 EndOfFile = TRUE Else Current = Asc ( Mid ( a_Stream , a_NextPosition , 1 ) ) End If End If Read = FALSE Dim Match Match = FALSE If First = GLEX_ANY Then Match = TRUE Else If Last = GLEX_EMPTY Then If Current = First Then Match = TRUE Else If ( Instruction And GLEX_NOT ) And ( Not ( Current = First ) ) Then Match = TRUE End If End If Else If ( Instruction And GLEX_NOT ) And ( Not ( ( Current >= First ) And ( Current <= Last ) ) ) Then Match = TRUE Else If ( Current >= First ) And ( Current <= Last ) Then Match = TRUE End If End If End If End If If Match Then If Instruction And GLEX_ACCEPT Then ' Expand the current buffer, if required. a_TokenText = a_TokenText + ChrW ( Current ) Read = TRUE End If If Instruction And GLEX_CONSUME Then Read = TRUE End If If Instruction And GLEX_PUSHBACK Then Read = TRUE a_NextPosition = a_NextPosition - 1 End If If Instruction And GLEX_LINEFEED Then CurrentLine = CurrentLine + 1 End If a_NextPosition = a_NextPosition + 1 If ReturnToken Or ( Instruction And GLEX_RETURN ) Then a_Token = ReturnToken Exit Function End If State = GotoState Else ' If here, there was no match. State = State + 1 End If Wend LexicalAnalyser_NextToken = Error_ImpossibleState End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_NextToken ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_NextToken ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText ) Dim Status Status = LexicalAnalyser_NextToken ( DFA_Definition , a_Stream , a_Position , a_CurrentToken , a_NextPosition , a_CurrentTokenText ) If Status <> Error_Success Then If g_Debug And 1 Then WScript.Echo "Lex Error" End If Parser_NextToken = Parser_Lexical_Error Exit Function End If If a_CurrentToken = SQL_1_TOK_ERROR Then If g_Debug And 1 Then WScript.Echo "Token Error" End If Parser_NextToken = Parser_Lexical_Error Exit Function End If If a_CurrentToken = SQL_1_TOK_EOF Then If g_Debug And 4 Then WScript.Echo "End Of File" End If a_CurrentTokenText = "" End If ' Keyword check. If a_CurrentToken = SQL_1_TOK_IDENT Then Select Case LCase ( a_CurrentTokenText ) Case "select" a_CurrentToken = SQL_1_TOK_SELECT Case "from" a_CurrentToken = SQL_1_TOK_FROM Case "where" a_CurrentToken = SQL_1_TOK_WHERE Case "within" a_CurrentToken = SQL_1_TOK_WITHIN Case "like" a_CurrentToken = SQL_1_TOK_LIKE Case "or" a_CurrentToken = SQL_1_TOK_OR Case "and" a_CurrentToken = SQL_1_TOK_AND Case "not" a_CurrentToken = SQL_1_TOK_NOT Case "isa" a_CurrentToken = SQL_1_TOK_ISA Case "null" a_CurrentToken = SQL_1_TOK_NULL Case "true" a_CurrentToken = SQL_1_TOK_TRUE a_CurrentTokenText = "65535" Case "false" a_CurrentToken = SQL_1_TOK_FALSE a_CurrentTokenText = "0" Case Else End Select End If If g_Debug And 1 Then WScript.Echo a_CurrentToken , a_CurrentTokenText End If Parser_NextToken = Parser_Success End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_NextToken ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Property_Name ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText ) Parser_Property_Name = Parser_Success If a_CurrentToken = SQL_1_TOK_ASTERISK Then Else End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_PropList2 ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_PropList2 ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText ) Parser_PropList2 = Parser_Syntax_Error Dim t_Position t_Position = a_Position If a_CurrentToken = SQL_1_TOK_COMMA Then Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Parser_PropList2 = Parser_PropList ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition Else If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_PropList2 = Status Exit Function End If Else Parser_PropList2 = Parser_Success Exit Function End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_PropList ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_PropList ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText ) Parser_PropList = Parser_Syntax_Error Dim t_Position t_Position = a_Position If ( a_CurrentToken <> SQL_1_TOK_ASTERISK ) And ( a_CurrentToken <> SQL_1_TOK_IDENT ) Then Parser_PropList = Parser_Syntax_Error Exit Function End If Dim Status Status = Parser_Property_Name ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status <> Parser_Success Then Parser_PropList = Status Exit Function End If Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Parser_PropList = Parser_PropList2 ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition Else If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_PropList = Status Exit Function End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Class_Name ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Class_Name ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText ) Parser_Class_Name = Parser_Syntax_Error Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If If a_CurrentToken = SQL_1_TOK_IDENT Then Parser_Class_Name = Parser_Success Else If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_Class_Name = Parser_Syntax_Error Exit Function End If Else If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_Class_Name = Parser_Syntax_Error Exit Function End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Within ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Within ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText ) Parser_Within = Parser_Syntax_Error Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If If a_CurrentToken <> SQL_1_TOK_WITHIN Then If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_Within = Parser_Syntax_Error Exit Function End If End If Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If If ( a_CurrentToken = SQL_1_TOK_INT ) Or ( a_CurrentToken = SQL_1_TOK_REAL ) Then Parser_Within = Parser_Success Else If g_Debug And 1 Then WScript.Echo "Within Type Parse Error" , Status End If Parser_Within = Parser_Syntax_Error Exit Function End If Else If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_Within = Parser_Syntax_Error Exit Function End If End Function Function Parser_IdentifierList ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree , ByRef a_Identifier ) Parser_IdentifierList = Parser_Success If g_Debug And 2 Then WScript.Echo "Parser_IdentifierList" End If Dim t_PushPosition t_PushPosition = a_Position Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken = SQL_1_TOK_ISA Then Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_QSTRING Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_IdentifierList = Parser_Syntax_Error Exit Function Else Dim Isa_Node Status = Create_Isa ( Isa_Node ) Dim RightString_Node Status = Create_String ( RightString_Node , a_CurrentTokenText ) Status = Set_Left_Node ( Isa_Node , a_Identifier ) Status = Set_Right_Node ( Isa_Node , RightString_Node ) a_ParseTree = Isa_Node End If Else If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_IdentifierList = Status Exit Function End If Else If a_CurrentToken = SQL_1_TOK_DOT Then Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then Status = Insert_Identifier ( a_Identifier , a_CurrentTokenText ) Status = Parser_IdentifierList ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree , a_Identifier ) t_Position = a_NextPosition Else If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_IdentifierList = Status Exit Function End If Else a_ParseTree = a_Identifier a_NextPosition = t_PushPosition End If End If End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Factor ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Factor ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Factor" End If Parser_Factor = Parser_Success Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Select Case a_CurrentToken Case SQL_1_TOK_IDENT Select Case LCase ( a_CurrentTokenText ) Case "like" Dim Like_Node Status = Create_Like ( Like_Node ) Status = Set_Left_Node ( Like_Node , a_ParseTree ) a_ParseTree = Like_Node Dim t_RightNode Status = Parser_Expression ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_CLOSE_PAREN Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function End If End If End If Case "lower" Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_OPEN_PAREN Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function Else Dim Lower_Node Status = Create_Lower ( Lower_Node ) Status = Set_Left_Node ( Lower_Node , a_ParseTree ) a_ParseTree = Lower_Node Status = Parser_Expression ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_CLOSE_PAREN Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function End If End If End If End If Else If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function End If Case "upper" Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_OPEN_PAREN Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function Else Dim Upper_Node Status = Create_Upper ( Upper_Node ) Status = Set_Left_Node ( Upper_Node , a_ParseTree ) a_ParseTree = Upper_Node Status = Parser_Expression ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_CLOSE_PAREN Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function End If End If End If End If Else If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function End If Case Else Dim t_Identifier Status = Create_Identifier ( t_Identifier , a_CurrentTokenText ) Status = Parser_IdentifierList ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree , t_Identifier ) t_Position = a_NextPosition If Status = Parser_Success Then Else If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function End If End Select Parser_Factor = Parser_Success Case SQL_1_TOK_QSTRING Status = Create_String ( a_ParseTree , a_CurrentTokenText ) Parser_Factor = Parser_Success Case SQL_1_TOK_INT Status = Create_Integer ( a_ParseTree , a_CurrentTokenText ) Parser_Factor = Parser_Success Case SQL_1_TOK_REAL Status = Create_Real ( a_ParseTree , a_CurrentTokenText ) Parser_Factor = Parser_Success Case SQL_1_TOK_CHAR Parser_Factor = Parser_Success Case SQL_1_TOK_BOOL Status = Create_Boolean ( a_ParseTree , a_CurrentTokenText ) Parser_Factor = Parser_Success Case SQL_1_TOK_OPEN_PAREN Status = Parser_Expression ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Status Exit Function Else Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_CLOSE_PAREN Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Parser_Syntax_Error Exit Function End If End If End If Case SQL_1_TOK_NOT Dim Not_Node Status = Create_Not ( Not_Node ) a_ParseTree = Not_Node Dim t_Node Status = Parser_Expression ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_Node ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Status Exit Function Else Status = Set_Left_Node ( Not_Node , t_Node ) End If Case SQL_1_TOK_MINUS Dim UnaryMinus_Node Status = Create_UnaryMinus ( UnaryMinus_Node ) a_ParseTree = UnaryMinus_Node Status = Parser_Expression ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_Node ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Factor = Status Exit Function Else Status = Set_Left_Node ( UnaryMinus_Node , t_Node ) End If Case Else End Select End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Term_ ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Term_ ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 4 Then WScript.Echo "Parser_Term_" end If Parser_Term_ = Parser_Syntax_Error Dim t_PushPosition t_PushPosition = a_Position Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Select Case a_CurrentToken Case SQL_1_TOK_ASTERISK Dim Multiply_Node Status = Create_Multiply ( Multiply_Node ) Status = Set_Left_Node ( Multiply_Node , a_ParseTree ) a_ParseTree = Multiply_Node Dim t_RightNode Status = Parser_Factor ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Term Parse Error" , Status End If Parser_Term_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Term_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Term_ Parse Error" , Status End If Parser_Term_ = Status Exit Function Else Parser_Term_ = Parser_Success End If End If Case SQL_1_TOK_DIVIDE Dim Divide_Node Status = Create_Divide ( Divide_Node ) Status = Set_Left_Node ( Divide_Node , a_ParseTree ) a_ParseTree = Divide_Node Status = Parser_Factor ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Term Parse Error" , Status End If Parser_Term_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Term_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Term_ Parse Error" , Status End If Parser_Term_ = Status Exit Function Else Parser_Term_ = Parser_Success End If End If Case Else a_NextPosition = t_PushPosition Parser_Term_ = Parser_Success End Select End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Term ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Term ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Term" End If Dim t_Position t_Position = a_Position Dim Status Status = Parser_Factor ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Term Parse Error" , Status End If Parser_Term = Status Exit Function Else Status = Parser_Term_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Term Parse Error" , Status End If Parser_Term = Status Exit Function End If End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Relation_ ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Relation_ ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Relation_" End If Parser_Relation_ = Parser_Syntax_Error Dim t_PushPosition t_PushPosition = a_Position Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Select Case a_CurrentToken Case SQL_1_TOK_PLUS Dim Plus_Node Status = Create_Plus ( Plus_Node ) Status = Set_Left_Node ( Plus_Node , a_ParseTree ) a_ParseTree = Plus_Node Dim t_RightNode Status = Parser_Term ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Relation Parse Error" , Status End If Parser_Relation_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Relation_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Relation_ Parse Error" , Status End If Parser_Relation_ = Status Exit Function Else Parser_Relation_ = Parser_Success End If End If Case SQL_1_TOK_MINUS Dim Minus_Node Status = Create_Minus ( Minus_Node ) Status = Set_Left_Node ( Minus_Node , a_ParseTree ) a_ParseTree = Minus_Node Status = Parser_Term ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Relation Parse Error" , Status End If Parser_Relation_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Relation_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Relation_ Parse Error" , Status End If Parser_Relation_ = Status Exit Function Else Parser_Relation_ = Parser_Success End If End If Case Else a_NextPosition = t_PushPosition Parser_Relation_ = Parser_Success End Select End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Relation ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Relation ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Relation" End If Dim t_Position t_Position = a_Position Dim Status Status = Parser_Term ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Relation Parse Error" , Status End If Parser_Relation = Status Exit Function Else Status = Parser_Relation_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Relation Parse Error" , Status End If Parser_Relation = Status Exit Function End If End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Logical_ ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Logical_ ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Logical_" End If Parser_Logical_ = Parser_Syntax_Error Dim t_PushPosition t_PushPosition = a_Position Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Select Case a_CurrentToken Case SQL_1_TOK_LE Dim LessEqual_Node Status = Create_LessEqual ( LessEqual_Node ) Status = Set_Left_Node ( LessEqual_Node , a_ParseTree ) a_ParseTree = LessEqual_Node Dim t_RightNode Status = Parser_Relation ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Logical_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical_ Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Parser_Logical_ = Parser_Success End If End If Case SQL_1_TOK_LT Dim Less_Node Status = Create_Less ( Less_Node ) Status = Set_Left_Node ( Less_Node , a_ParseTree ) a_ParseTree = Less_Node Status = Parser_Relation ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Logical_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical_ Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Parser_Logical_ = Parser_Success End If End If Case SQL_1_TOK_GE Dim GreaterEqual_Node Status = Create_GreaterEqual ( GreaterEqual_Node ) Status = Set_Left_Node ( GreaterEqual_Node , a_ParseTree ) a_ParseTree = GreaterEqual_Node Status = Parser_Relation ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Logical_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical_ Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Parser_Logical_ = Parser_Success End If End If Case SQL_1_TOK_GT Dim Greater_Node Status = Create_Greater ( Greater_Node ) Status = Set_Left_Node ( Greater_Node , a_ParseTree ) a_ParseTree = Greater_Node Status = Parser_Relation ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Logical_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical_ Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Parser_Logical_ = Parser_Success End If End If Case SQL_1_TOK_EQ Dim Equal_Node Status = Create_Equal ( Equal_Node ) Status = Set_Left_Node ( Equal_Node , a_ParseTree ) a_ParseTree = Equal_Node Status = Parser_Relation ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Logical_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical_ Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Parser_Logical_ = Parser_Success End If End If Case SQL_1_TOK_NE Dim NotEqual_Node Status = Create_NotEqual ( NotEqual_Node ) Status = Set_Left_Node ( NotEqual_Node , a_ParseTree ) a_ParseTree = NotEqual_Node Status = Parser_Relation ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Logical_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical_ Parse Error" , Status End If Parser_Logical_ = Status Exit Function Else Parser_Logical_ = Parser_Success End If End If Case Else a_NextPosition = t_PushPosition Parser_Logical_ = Parser_Success End Select End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Logical ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Logical ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Logical" End If Dim t_Position t_Position = a_Position Dim Status Status = Parser_Relation ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical = Status Exit Function Else Status = Parser_Logical_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Logical Parse Error" , Status End If Parser_Logical = Status Exit Function End If End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_And_ ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_And_ ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_And_" End If Parser_And_ = Parser_Syntax_Error Dim t_PushPosition t_PushPosition = a_Position Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Select Case a_CurrentToken Case SQL_1_TOK_AND Dim And_Node Status = Create_And ( And_Node ) Status = Set_Left_Node ( And_Node , a_ParseTree ) a_ParseTree = And_Node Dim t_RightNode Status = Parser_Logical ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_And_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_And_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_And_ = Status Exit Function Else Parser_And_ = Parser_Success End If End If Case Else a_NextPosition = t_PushPosition Parser_And_ = Parser_Success End Select End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_And ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_And ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_And" End If Dim t_Position t_Position = a_Position Dim Status Status = Parser_Logical ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_And Parse Error" , Status End If Parser_And = Status Exit Function Else Status = Parser_And_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_And Parse Error" , Status End If Parser_And = Status Exit Function End If End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Expression_ ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Expression_ ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Expression_" End If Parser_Expression_ = Parser_Syntax_Error Dim t_PushPosition t_PushPosition = a_Position Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If Select Case a_CurrentToken Case SQL_1_TOK_OR Dim Or_Node Status = Create_Or ( Or_Node ) Status = Set_Left_Node ( Or_Node , a_ParseTree ) a_ParseTree = Or_Node Dim t_RightNode Status = Parser_And ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , t_RightNode ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Expression_ = Status Exit Function Else Status = Set_Right_Node ( a_ParseTree , t_RightNode ) Status = Parser_Expression_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Factor Parse Error" , Status End If Parser_Expression_ = Status Exit Function Else Parser_Expression_ = Parser_Success End If End If Case Else a_NextPosition = t_PushPosition Parser_Expression_ = Parser_Success End Select End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Expression ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Expression ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) If g_Debug And 2 Then WScript.Echo "Parser_Expression" End If Dim t_Position t_Position = a_Position Dim Status Status = Parser_And ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Expression Parse Error" , Status End If Parser_Expression = Status Exit Function Else Status = Parser_Expression_ ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parser_Expression Parse Error" , Status End If Parser_Expression = Status Exit Function End If End If End Function '--------------------------------------------------------- ' ' Function: ' ' Parser_Where ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Dfa ' a_Stream ' a_Position ' ' Output Arguments: ' ' ByRef a_NextPosition ' ByRef a_CurrentToken ' ByRef a_CurrentTokenText ' ' Return Value: ' ' Status '--------------------------------------------------------- Function Parser_Where ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_CurrentToken , ByRef a_CurrentTokenText , ByRef a_ParseTree ) Parser_Where = Parser_Syntax_Error Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , a_CurrentToken , a_CurrentTokenText End If If a_CurrentToken = SQL_1_TOK_EOF Then Parser_Where = Parser_Syntax_Success Else If a_CurrentToken = SQL_1_TOK_WHERE Then Status = Parser_Expression ( a_Dfa , a_Stream , t_Position , a_NextPosition , a_CurrentToken , a_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status = Parser_Success Then If a_CurrentToken <> SQL_1_TOK_EOF Then Parser_Where = Parser_Syntax_Error Exit Function End If Else If g_Debug And 1 Then WScript.Echo "Parser_Expression Parse Error" , Status End If Parser_Where = Status Exit Function End If Else If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_Where = Parser_Syntax_Error Exit Function End If End If End If Parser_Where = Parser_Success End Function '--------------------------------------------------------- ' ' Function: ' ' ParseQuery ' ' Description: ' ' Parse query language extensions ' ' Input Arguments: ' ' a_Query - Query string to parse ' ' Output Arguments: ' ' None ' ' Return Value: ' ' None '--------------------------------------------------------- Function Parser_Select ( a_Dfa , a_Stream , a_Position , ByRef a_NextPosition , ByRef a_ParseTree , ByRef a_WhereExpressionPosition ) Parser_Select = Parser_Syntax_Error Dim t_CurrentToken Dim t_CurrentTokenText Dim t_Position t_Position = a_Position Dim Status Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , t_CurrentToken , t_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo Status , a_NextPosition , t_CurrentToken , t_CurrentTokenText End If If t_CurrentToken <> SQL_1_TOK_SELECT Then Parser_Select = Parser_Syntax_Error Exit Function End If Else If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_Select = Parser_Syntax_Error Exit Function End If Status = Parser_NextToken ( a_Dfa , a_Stream , t_Position , a_NextPosition , t_CurrentToken , t_CurrentTokenText ) t_Position = a_NextPosition If Status = Parser_Success Then If g_Debug And 4 Then WScript.Echo "proplist" , Status , a_NextPosition , t_CurrentToken , t_CurrentTokenText End If Status = Parser_PropList ( a_Dfa , a_Stream , t_Position , a_NextPosition , t_CurrentToken , t_CurrentTokenText ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "PropList Parse Error" , Status End If Parser_Select = Status Exit Function End If Else Parser_Select = Status If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Exit Function End If If t_CurrentToken <> SQL_1_TOK_FROM Then Parser_Select = Parser_Syntax_Error Exit Function End If Status = Parser_Class_Name ( a_Dfa , a_Stream , t_Position , a_NextPosition , t_CurrentToken , t_CurrentTokenText ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Parse Error" , Status End If Parser_Select = Status Exit Function End If Status = Parser_Within ( a_Dfa , a_Stream , t_Position , a_NextPosition , t_CurrentToken , t_CurrentTokenText ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Within Parse Error" , Status End If Parser_Select = Status Exit Function End If a_WhereExpressionPosition = t_Position Status = Parser_Where ( a_Dfa , a_Stream , t_Position , a_NextPosition , t_CurrentToken , t_CurrentTokenText , a_ParseTree ) t_Position = a_NextPosition If Status <> Parser_Success Then If g_Debug And 1 Then WScript.Echo "Where Parse Error" , Status End If Parser_Select = Status Exit Function End If Parser_Select = Parser_Success End Function