WindowsXP/admin/wmi/wbem/consumers/scripts/itg/extendedcommoncode.vbs
2025-04-27 07:49:33 -04:00

6853 lines
156 KiB
Plaintext

'---------------------------------------------------------
'
' 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 , "<null>" , TREE_NODE_NULL )
Create_Null = TRUE
End Function
Function Create_Empty ( ByRef Empty_Node )
Empty_Node = Array ( TREE_NODE_EMPTY , "<empty>" , TREE_NODE_EMPTY )
Create_Empty = TRUE
End Function
Function Create_Undefined ( ByRef Undefined_Node )
Undefined_Node = Array ( TREE_NODE_UNDEFINED, "<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 of file>"
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