| 1 | DIM2 ;SFISC/XAK,GFT,TOAD-FileMan: M Syntax Checker, Exprs ;06:48 PM  1 Jul 1998
 | 
|---|
| 2 |  ;;22.0;VA FileMan;;Mar 30, 1999
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;12277;4186487;4104;
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 | SUB ; "(": open paren situations (GG^DIM1)
 | 
|---|
| 7 |  F %J=%I-1:-1 S %C1=$E(%,%J) Q:%C1'?1(1UN,1"%")
 | 
|---|
| 8 |  S %C1=$E(%,%J+1,%I-1)
 | 
|---|
| 9 |  I %C1]"",%C1'?1(1U,1"%").UN G ERR
 | 
|---|
| 10 |  I %C1]"",%[("."_%C1) G ERR
 | 
|---|
| 11 |  S %(%N,0)=$S(%C1]""!($E(%,%J)="^"):"V^",$E(%,%J)="@":"@^",1:"0^")
 | 
|---|
| 12 |  S %(%N,1)=0,%(%N,2)=0,%(%N,3)=0,%N=%N+1 G 1
 | 
|---|
| 13 |  ;
 | 
|---|
| 14 | UP ; ")": close paren situations (GG^DIM1)
 | 
|---|
| 15 |  I %N=0 G ERR
 | 
|---|
| 16 |  I "(,"[$E(%,%I-1),$P($G(%(%N-1,0)),"^")'["P" G ERR
 | 
|---|
| 17 |  I $E(%,%I+1)]"","<>_[]:/\?'+-=!&#*),"""'[$E(%,%I+1) G ERR
 | 
|---|
| 18 |  S %N=%N-1,%(%N,1)=%(%N,1)+1,%F=$P(%(%N,0),"^") I %F D  G ERR:%ERR
 | 
|---|
| 19 |  . S %F=$P(%(%N,0),"^",2),%F1=%(%N,1)
 | 
|---|
| 20 |  . I %F1<+%F S %ERR=1 Q  ; not enough commas for this function
 | 
|---|
| 21 |  . I %F1>$P(%F,";",2) S %ERR=1 Q  ; too many commas for this function
 | 
|---|
| 22 |  . I %(%N,2),'%(%N,3) S %ERR=1 ; we're in $S and haven't yet hit a :
 | 
|---|
| 23 |  K %(%N+1)
 | 
|---|
| 24 |  I '%F,%F'["V",%F'["@",%F'["P",%(%N,1)>1 G ERR
 | 
|---|
| 25 |  G 1
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 | AR ; ",": comma situations -- "P" below means "parameters" (GG^DIM1)
 | 
|---|
| 28 |  I %N<1 G ERR
 | 
|---|
| 29 |  I "(,"[$E(%,%I-1),$P($G(%(%N-1,0)),"^")'["P" G ERR
 | 
|---|
| 30 |  I '%(%N-1,3),%(%N-1,2) G ERR
 | 
|---|
| 31 |  I "@("[$E(%,1,2) G ERR
 | 
|---|
| 32 |  S %(%N-1,1)=%(%N-1,1)+1,%(%N-1,3)=0 G 1
 | 
|---|
| 33 |  ;
 | 
|---|
| 34 | SEL ; ":": $SELECT delimiter (GG^DIM1)
 | 
|---|
| 35 |  S %(%N-1,3)=%(%N-1,3)+1 G ERR:'%(%N-1,2)!(%(%N-1,3)>1),1
 | 
|---|
| 36 |  ;
 | 
|---|
| 37 | GLO ; "^": global reference (GG^DIM1)
 | 
|---|
| 38 |  D %INC G ERR:$E(%,%I,999)'?1U.UN.P.E&("%("'[%C)
 | 
|---|
| 39 |  G ERR:"=+-\/<>(,#!&*':@[]_"'[$E(%,%I-2)
 | 
|---|
| 40 |  S %I=%I-1 G 1
 | 
|---|
| 41 |  ;
 | 
|---|
| 42 | PAT ; "?": pattern match (GG^DIM1)
 | 
|---|
| 43 |  G ERR:%I=1,1:$E(%,%I+1)="@" D %INC,PATTERN G ERR:%ERR S %I=%I-1 G 1
 | 
|---|
| 44 |  ;
 | 
|---|
| 45 | PATTERN F  D PATATOM Q:%C'?1N&(%C'=".")!%ERR
 | 
|---|
| 46 |  Q
 | 
|---|
| 47 | PATATOM D REPCOUNT Q:%ERR
 | 
|---|
| 48 |  I %C="""" D STRLIT,%INC:'%ERR Q
 | 
|---|
| 49 |  I %C="(" D ALTRN8 Q
 | 
|---|
| 50 |  D PATCODE
 | 
|---|
| 51 |  Q
 | 
|---|
| 52 | REPCOUNT ;
 | 
|---|
| 53 |  I %C'?1N,%C'="." S %ERR=1 Q
 | 
|---|
| 54 |  N FROM S FROM=+$E(%,%I,999) I %C?1N D INTLIT Q:%ERR
 | 
|---|
| 55 |  I %C="." D %INC
 | 
|---|
| 56 |  Q:%C'?1N  I +$E(%,%I,999)<FROM S %ERR=1 Q
 | 
|---|
| 57 |  D INTLIT Q
 | 
|---|
| 58 | INTLIT I %C'?1N S %ERR=1 Q
 | 
|---|
| 59 |  F  D %INC Q:%C'?1N
 | 
|---|
| 60 |  Q
 | 
|---|
| 61 | STRLIT F  D %INC Q:%C=""  I %C="""" Q:$E(%,%I+1)'=""""  S %I=%I+1
 | 
|---|
| 62 |  I %C="" S %ERR=1
 | 
|---|
| 63 |  Q
 | 
|---|
| 64 | PATCODE I "ACELNPU"'[%C!(%C="") S %ERR=1 Q
 | 
|---|
| 65 |  F  D %INC Q:%C=""  Q:"ACELNPU"'[%C
 | 
|---|
| 66 |  Q
 | 
|---|
| 67 | ALTRN8 I %C'="(" S %ERR=1 Q
 | 
|---|
| 68 |  D %INC,PATATOM Q:%ERR
 | 
|---|
| 69 |  F  Q:","'[%C  D %INC,PATATOM Q:%ERR
 | 
|---|
| 70 |  I %C'=")" S %ERR=1 Q
 | 
|---|
| 71 |  D %INC
 | 
|---|
| 72 |  Q
 | 
|---|
| 73 |  ;
 | 
|---|
| 74 | BINOP ; binary operator (GG^DIM1)
 | 
|---|
| 75 |  S %Z1=""")%'",%Z2="""($+-^%@'." G OPCHK
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 | MTHOP ; math or relational operator (GG^DIM1)
 | 
|---|
| 78 |  S %Z1=""")%",%Z2="""($+-^%@'." G OPCHK
 | 
|---|
| 79 |  ;
 | 
|---|
| 80 | UNOP ; unary operator (GG^DIM1)
 | 
|---|
| 81 |  S %Z1=""":<>+-'\/()%@#&!*=_][,"
 | 
|---|
| 82 |  S %Z2="""($+-=&!^%.@'" I %C="'" S %Z2=%Z2_"<>?[]"
 | 
|---|
| 83 |  G OPCHK
 | 
|---|
| 84 |  ;
 | 
|---|
| 85 | IND ; "@": indirection (GG^DIM1)
 | 
|---|
| 86 |  I $E(%COM)="F" G ERR
 | 
|---|
| 87 |  S %Z1="^?@(%+-=\/#*!&'_<>[]:,.",%Z2="""(+^-'$@%" G OPCHK
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 | OPCHK ; ensure that the characters before and after the operator are OK
 | 
|---|
| 90 |  S %L1=$E(%,%I-1),%L2=$E(%,%I+1) I %L1="'","[]&!<>="[%C S %L1=$E(%,%I-2)
 | 
|---|
| 91 |  I %L1="","+-'@"'[%C G ERR ;              binary: require before
 | 
|---|
| 92 |  I %L1'?1UN,%Z1'[%L1 G ERR ;              all: screen before
 | 
|---|
| 93 |  F %F="*","]" I %C=%F,%L2=%F S %I=%I+1,%L2=$E(%,%I+1) Q
 | 
|---|
| 94 |  I %L2="" G ERR ;                         all: require after
 | 
|---|
| 95 |  I %L2'?1UN,%Z2'[%L2 G ERR ;              all: screen after
 | 
|---|
| 96 |  I %C="'","!&[]?=<>"'[%L2,%L1?1UN G ERR ; unary ': not binary
 | 
|---|
| 97 |  G 1
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 | 1 ; common exit point for all of ^DIM2
 | 
|---|
| 100 |  G GG^DIM1
 | 
|---|
| 101 |  ;
 | 
|---|
| 102 | DATA ; glvn arguments of $D,$G,$NA,$O, & $Q functions (FUNC^DIM1)
 | 
|---|
| 103 |  D %INC G ERR:%C="",ERR:%C=")",DATA:"^@"[%C D VAR
 | 
|---|
| 104 |  G ERR:"@(,)"'[%C!%ERR,GG1^DIM1
 | 
|---|
| 105 |  ;
 | 
|---|
| 106 | VAR ; variables encountered while parsing exprs (DATA, GG^DIM1)
 | 
|---|
| 107 |  N %START S %START=%I-1 I $E(%,%START)="^" S %START=%START-1
 | 
|---|
| 108 |  I %C="%" D %INC
 | 
|---|
| 109 |  N OUT S OUT=0 F %J=%I:1 S %C=$E(%,%J) D  Q:OUT
 | 
|---|
| 110 |  . I ",<>?/\[]+-=_()*&#!':"[%C S OUT=1 Q
 | 
|---|
| 111 |  . I %C="@",$E(%,%J+1)="(",$E(%,%START)="@" S OUT=1 Q
 | 
|---|
| 112 |  . I %C'?1UN S %ERR=1
 | 
|---|
| 113 |  . I %C="^",$D(%(%N-1,"F")),%(%N-1,"F")["TEXT" S %ERR=0,OUT=1
 | 
|---|
| 114 |  Q:%ERR
 | 
|---|
| 115 |  I %C="@" S %I=%J Q
 | 
|---|
| 116 |  S %F=$E(%,%I,%J-1)
 | 
|---|
| 117 |  I %F="^",$E(%,%J)'="(" S %ERR=1
 | 
|---|
| 118 |  I %F]"",%F'?1U.UN,$E(%,%I-1,%J-1)'?1"%".UN S %ERR=1
 | 
|---|
| 119 |  S %I=%J Q
 | 
|---|
| 120 |  ;
 | 
|---|
| 121 | %INC S %I=%I+1,%C=$E(%,%I)
 | 
|---|
| 122 |  Q
 | 
|---|
| 123 |  ;
 | 
|---|
| 124 | ERR S %ERR=1,%N=0
 | 
|---|
| 125 | FINISH G ERR:%N'=0 K %C,%,%F,%F1,%I,%J,%L1,%L2,%N,%T,%Z1,%Z2,%FN,%FZ
 | 
|---|
| 126 | Q Q
 | 
|---|