BMXPRS	; IHS/OIT/HMW - BMX WINDOWS UTILS ;
	;;2.2;BMX;;Sep 07, 2010
	;
	;
PARSE(X)	;EP-Parse SQL Statement into array
	;Input SQL statement as X
	;Returns BMXTK() array
	;Errors returned in BMXERR
	;
	D PRE
	Q:$D(BMXERR)
	D POST
	Q
	;
POST2	;EP - Remove commas from BMXTK
	N J,K
	S J=0 F  S J=$O(BMXTK(J)) Q:'+J  D
	. S K=$O(BMXTK(J))
	. I +K,","=$G(BMXTK(K)) D
	. . K BMXTK(K)
	. . D PACK(J)
	. . Q
	. Q
	Q
	;
POST	;
	;Combine multi-character operators
	N J
	S J=0 F  S J=$O(BMXTK(J)) Q:'+J  D
	. I ">"=BMXTK(J) D  Q
	. . I "="[$G(BMXTK(J+1)) D  Q
	. . . S BMXTK(J)=BMXTK(J)_"="
	. . . K BMXTK(J+1)
	. . . D PACK(J)
	. . I "<"[$G(BMXTK(J+1)) D  Q
	. . . S BMXTK(J)="<"_BMXTK(J)
	. . . K BMXTK(J+1)
	. . . D PACK(J)
	. I "<"=BMXTK(J) D  Q
	. . I "=>"[$G(BMXTK(J+1)) D
	. . . S BMXTK(J)=BMXTK(J)_BMXTK(J+1)
	. . . K BMXTK(J+1)
	. . . D PACK(J)
	. I "="=BMXTK(J) D  Q
	. . I "<>"[$G(BMXTK(J+1)) D
	. . . S BMXTK(J)=BMXTK(J+1)_BMXTK(J)
	. . . K BMXTK(J+1)
	. . . D PACK(J)
	Q
	;
PACK(J)	;
	F  S J=$O(BMXTK(J)) Q:'+J  D
	. S BMXTK(J-1)=BMXTK(J)
	. K BMXTK(J)
	Q
	;
PRE	N P,T,Q,Q1,A,B S (P,T,Q)=0,BMXTK="",A=0
START	S A=A+1
	S B=$E(X,A)
	I B="" G B5
	I 'Q G QUOTE
	I B=$C(39) G QUOTE
	S BMXTK=BMXTK_B G START
QUOTE	I B'=$C(39) G SPACE
	I Q G QUOTE2
	;S Q=1,BMXTK=B G START
	S Q=1,BMXTK=BMXTK_B G START
QUOTE2	S Q1=B,A=A+1,B=$E(X,A)
	I B']"" G QUOTE3
	I B'=$C(39) G QUOTE3
	S BMXTK=BMXTK_Q1_B G START
QUOTE3	S A=A-1,B=Q1,BMXTK=BMXTK_B,Q=0 G START
SPACE	I B'=" " G OP
	I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK=""
	G START
OP	I "=><"'[B G OPAREN
	I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK=""
	S T=T+1,BMXTK(T)=B,BMXTK=""
	G START
OPAREN	I B'="(" G CPAREN
	S P=P+1
	I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK=""
	S T=T+1,BMXTK(T)=B G START
CPAREN	I B'=")" G B2
	I P G B1
	G B0
	;
B0	S BMXERR="SQL SYNTAX ERROR" D ERROR G B5
B1	S P=P-1
	I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK,BMXTK=""
	S T=T+1,BMXTK(T)=B G START
B2	I B'="," G B3
	S T=T+1,BMXTK(T)=BMXTK,T=T+1,BMXTK(T)=",",BMXTK="" G START
B3	S BMXTK=BMXTK_B
B4	G START
B5	I BMXTK]"" S T=T+1,BMXTK(T)=BMXTK
	I $D(BMXERR) G B6
	I P S BMXERR="SQL SYNTAX ERROR: MATCHING PARENTHESIS NOT FOUND" D ERROR
	E  I Q S BMXERR="SQL SYNTAX ERROR: MATCHING QUOTE NOT FOUND" D ERROR
	I P>0 G START
B6	Q
	;
ERROR	;W !,"ERROR=",BMXERR,! Q  
	Q
