| 1 | OCXOCMPB ;SLC/RJS,CLA - ORDER CHECK CODE COMPILER (Parse a Rule Relation Expression) ;10/29/98  12:37
 | 
|---|
| 2 |  ;;3.0;ORDER ENTRY/RESULTS REPORTING;**32**;Dec 17,1997
 | 
|---|
| 3 |  ;;  ;;ORDER CHECK EXPERT version 1.01 released OCT 29,1998
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 |  Q
 | 
|---|
| 6 |  ;
 | 
|---|
| 7 | PARSE(OCXD0,OCXD1,OCXEXP,OCXCD) ;
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  Q:$G(OCXWARN) 1
 | 
|---|
| 10 |  N OCXRES,OCXSTAK,OCXPTR,OCXTKN,OCXERR,OCXTEXP,OCXDASH
 | 
|---|
| 11 |  N OCXBOOL,OCXPTKN,OCXX,OCXD2,OCXD3,OCXTPTR2
 | 
|---|
| 12 |  K ^TMP("OCXCMP",$J,"CODE")
 | 
|---|
| 13 |  M ^TMP("OCXCMP",$J,"CODE")=OCXCD
 | 
|---|
| 14 |  ;
 | 
|---|
| 15 |  S:($P(OCXEXP," ",1)="IF") OCXEXP=$P(OCXEXP," ",2,999)
 | 
|---|
| 16 |  S OCXEXP=$$PARCNT^OCXOCMPF(OCXEXP) Q:'$L(OCXEXP) OCXWARN Q:OCXWARN OCXWARN
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  F OCXTPTR=1:1:($L(OCXEXP," ")+1) S OCXTXT=$P(OCXEXP," ",OCXTPTR) I $L(OCXTXT) D  Q:OCXWARN
 | 
|---|
| 19 |  .N OCXSTOP
 | 
|---|
| 20 |  .;
 | 
|---|
| 21 |  .; TOKENIZE TERM
 | 
|---|
| 22 |  .;
 | 
|---|
| 23 |  .S OCXPTKN=+$$TOP
 | 
|---|
| 24 |  .S OCXTKN=$S($L($G(^TMP("OCXCMP",$J,"CODE","B",OCXTXT))):1,(OCXTXT="AND"):3,(OCXTXT="OR"):4,(OCXTXT="("):5,(OCXTXT=")"):6,1:0)
 | 
|---|
| 25 |  .I 'OCXTKN F OCXTPTR2=OCXTPTR:1:($L(OCXEXP," ")+1) I $L($G(^TMP("OCXCMP",$J,"CODE","B",$P(OCXEXP," ",OCXTPTR,OCXTPTR2)))) S OCXTKN=1,OCXTXT=$P(OCXEXP," ",OCXTPTR,OCXTPTR2),OCXTPTR=OCXTPTR2 Q
 | 
|---|
| 26 |  .I (OCXTKN=1) S:(OCXPTKN=3) OCXTKN=2 S:(OCXPTKN=4) OCXTKN=2 S OCXTXT=$G(^TMP("OCXCMP",$J,"CODE","B",OCXTXT))
 | 
|---|
| 27 |  .I +OCXTXT,+$G(OCXCD(+OCXTXT)) S ^TMP("OCXCMP",$J,"RULE",OCXD0,OCXD1,+OCXCD(+OCXTXT))=+OCXTXT
 | 
|---|
| 28 |  .;
 | 
|---|
| 29 |  .; CHECK FOR SYNTAX ERROR
 | 
|---|
| 30 |  .;
 | 
|---|
| 31 |  .I 'OCXTKN D SYNTXER^OCXOCMPF(OCXEXP,OCXTPTR,OCXTXT,OCXTKN) S OCXWARN=1 Q
 | 
|---|
| 32 |  .I ("50"[+OCXPTKN),'("15"[(+OCXTKN)) D SYNTXER^OCXOCMPF(OCXEXP,OCXTPTR,OCXPTKN,OCXTKN) S OCXWARN=1 Q
 | 
|---|
| 33 |  .I ("126"[+OCXPTKN),'("346"[(+OCXTKN)) D SYNTXER^OCXOCMPF(OCXEXP,OCXTPTR,OCXPTKN,OCXTKN) S OCXWARN=1 Q
 | 
|---|
| 34 |  .I ("34"[+OCXPTKN),'("25"[(+OCXTKN)) D SYNTXER^OCXOCMPF(OCXEXP,OCXTPTR,OCXPTKN,OCXTKN) S OCXWARN=1 Q
 | 
|---|
| 35 |  .;
 | 
|---|
| 36 |  .Q:OCXWARN
 | 
|---|
| 37 |  .;
 | 
|---|
| 38 |  .; PUT TERM ON THE STACK
 | 
|---|
| 39 |  .;
 | 
|---|
| 40 |  .I (OCXTKN<3) D
 | 
|---|
| 41 |  ..N OCXTMP M OCXTMP=^TMP("OCXCMP",$J,"CODE",+OCXTXT) D PUSH(OCXTKN_U_OCXTXT,.OCXTMP)
 | 
|---|
| 42 |  .I (OCXTKN>2) D PUSH(OCXTKN_U_OCXTXT)
 | 
|---|
| 43 |  .;
 | 
|---|
| 44 |  .; PROCESS THE STACK
 | 
|---|
| 45 |  .;
 | 
|---|
| 46 |  .F  D  Q:OCXSTOP
 | 
|---|
| 47 |  ..N OCXTOP S OCXSTOP=1,OCXTOP=+$$TOP
 | 
|---|
| 48 |  ..;
 | 
|---|
| 49 |  ..I (OCXTOP=1),(+$$TOP(1)=3) S OCXTOP=2
 | 
|---|
| 50 |  ..I (OCXTOP=1),(+$$TOP(1)=4) S OCXTOP=2
 | 
|---|
| 51 |  ..;
 | 
|---|
| 52 |  ..I (OCXTOP=2) D  S OCXSTOP=0 Q  ;  SECOND DATA FIELD
 | 
|---|
| 53 |  ...N FLD1,OPER,FLD2,FLD3,NXTFLD
 | 
|---|
| 54 |  ...D POP(.FLD2),POP(.OPER),POP(.FLD1)
 | 
|---|
| 55 |  ...S NXTFLD=$O(^TMP("OCXCMP",$J,"CODE","B"),-1)+1,^TMP("OCXCMP",$J,"CODE",NXTFLD)="",FLD3="1^"_NXTFLD
 | 
|---|
| 56 |  ...;
 | 
|---|
| 57 |  ...I (+OPER=3) D  ; AND OPERATOR
 | 
|---|
| 58 |  ....N SUB1,SUB2,DOTS
 | 
|---|
| 59 |  ....S SUB1=0 F  S SUB1=$O(FLD1("CODE",SUB1)) Q:'SUB1  D
 | 
|---|
| 60 |  .....N VAL1,VAL2
 | 
|---|
| 61 |  .....S (VAL1,VAL2)=FLD1("CODE",SUB1) S:(VAL1[" @@@@") VAL2=$P(VAL1," @@@@",1)_" "_$P(VAL1," @@@@",2)
 | 
|---|
| 62 |  .....S FLD3("CODE",$O(FLD3("CODE","B"),-1)+1)=VAL2
 | 
|---|
| 63 |  .....Q:'(VAL1["@@@@")
 | 
|---|
| 64 |  .....F DOTS=1:1:$L(VAL1) Q:'($E(VAL1,DOTS)=".")
 | 
|---|
| 65 |  .....S SUB2=0 F  S SUB2=$O(FLD2("CODE",SUB2)) Q:'SUB2  D
 | 
|---|
| 66 |  ......S FLD3("CODE",$O(FLD3("CODE","B"),-1)+1)=$E("..................",1,DOTS)_FLD2("CODE",SUB2)
 | 
|---|
| 67 |  ...;
 | 
|---|
| 68 |  ...I (+OPER=4) D  ;  OR OPERATOR
 | 
|---|
| 69 |  ....N SUB
 | 
|---|
| 70 |  ....S SUB=0 F  S SUB=$O(FLD1("CODE",SUB)) Q:'SUB  S FLD3("CODE",$O(FLD3("CODE","B"),-1)+1)=FLD1("CODE",SUB)
 | 
|---|
| 71 |  ....S SUB=0 F  S SUB=$O(FLD2("CODE",SUB)) Q:'SUB  S FLD3("CODE",$O(FLD3("CODE","B"),-1)+1)=FLD2("CODE",SUB)
 | 
|---|
| 72 |  ...;
 | 
|---|
| 73 |  ...S FLD3("LABEL")="("_FLD1("LABEL")_" "_$S((+OPER=3):"AND",1:"OR")_" "_FLD2("LABEL")_")"
 | 
|---|
| 74 |  ...M ^TMP("OCXCMP",$J,"CODE",NXTFLD)=FLD3
 | 
|---|
| 75 |  ...D PUSH(FLD3,.FLD3)
 | 
|---|
| 76 |  ..;
 | 
|---|
| 77 |  ..I (+$$TOP(0)=6),(+$$TOP(1)=1),(+$$TOP(2)=5) S OCXSTOP=0 D   ; RIGHT PARENTHESIS
 | 
|---|
| 78 |  ...N FLD,TEMP D POP(.TEMP),POP(.FLD),POP(TEMP),PUSH(FLD,.FLD)
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 |  K OCXTKN D POP(.OCXTKN)
 | 
|---|
| 81 |  M ^TMP("OCXCMP",$J,"RULE",OCXD0,OCXD1)=OCXTKN
 | 
|---|
| 82 |  I $D(OCXSTAK) D WARN^OCXOCMPV(" ERROR: Incomplete expression..",2,OCXD0,$P($T(+1)," ",1)) Q OCXWARN
 | 
|---|
| 83 |  K ^TMP("OCXCMP",$J,"CODE")
 | 
|---|
| 84 |  Q OCXWARN
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 | PUSH(V,C) ;
 | 
|---|
| 87 |  N T
 | 
|---|
| 88 |  S T=$O(OCXSTAK(99999),-1)+1
 | 
|---|
| 89 |  S OCXSTAK(T)=V
 | 
|---|
| 90 |  I $D(C) M OCXSTAK(T,"CODE")=C("CODE"),OCXSTAK(T,"LABEL")=C("LABEL")
 | 
|---|
| 91 |  Q
 | 
|---|
| 92 |  ;
 | 
|---|
| 93 | POP(V) ;
 | 
|---|
| 94 |  N L K V S V="",L=$O(OCXSTAK(99999),-1) Q:'L  M V=OCXSTAK(L) K OCXSTAK(L) Q
 | 
|---|
| 95 |  ;
 | 
|---|
| 96 | TOP(C) ;
 | 
|---|
| 97 |  Q:'$D(OCXSTAK) "" Q:'$D(C) OCXSTAK($O(OCXSTAK(999999),-1))
 | 
|---|
| 98 |  N L,X S L=$O(OCXSTAK(99999),-1) Q:'L "" F X=1:1:C S L=$O(OCXSTAK(L),-1) Q:'L
 | 
|---|
| 99 |  Q:'L "" Q OCXSTAK(L)
 | 
|---|
| 100 |  K C
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 | TKTXT(T) Q $S(T=1:"Data Field 1",T=2:"Data Field 2",T=3:"AND Operator",T=4:"OR Operator",T=5:"Left Parenthesis",T=6:"Right Parenthesis",1:"Token not found")
 | 
|---|
| 103 |  ;
 | 
|---|