1 | ARJTDIM ;SFISC/JFW,GFT,TOAD-FileMan: M Syntax Checker, Main ;5/27/2004 00:26
|
---|
2 | ;;3.0T1;OPENVISTA;;Jun 20, 2004
|
---|
3 | ;
|
---|
4 | ; Change History:
|
---|
5 | ; 2004 05 27 WV/TOAD: added "^[]" to FIND in Input
|
---|
6 | ;
|
---|
7 | CHECK(CODE,FIND,FOUND) ; ** Parse & Evaluate a Line of Code **
|
---|
8 | ;
|
---|
9 | ; Input:
|
---|
10 | ; FIND = Optional. Code for special search to include.
|
---|
11 | ; Defaults to normal parsing with no special search.
|
---|
12 | ; "DSM" looks for potentially DSM-specific language elements.
|
---|
13 | ; "DSM2" is a tighter version, e.g., flag USE only if params.
|
---|
14 | ; "?(" looks for alternation in pattern match.
|
---|
15 | ; "?@" looks for pattern indirection.
|
---|
16 | ; "D" looks for DO commands (for testing).
|
---|
17 | ; "^[]" looks for extended global references.
|
---|
18 | ; each new special search must be hand-coded.
|
---|
19 | ; In/Output:
|
---|
20 | ; .FOUND = results of special search. 1 = successful.
|
---|
21 | ; .FOUND(language element) = # times that element was found.
|
---|
22 | ; for example, FOUND("D") means found DO command.
|
---|
23 | ; "DSM" search also returns FOUND("DSM",element).
|
---|
24 | ; Both of these in/outputs are cumulative. That is, if passed in
|
---|
25 | ; with values, they are additive; if not, they initialize.
|
---|
26 | ;
|
---|
27 | S FIND=$G(FIND)
|
---|
28 | S FOUND=+$G(FOUND) ; nothing special found
|
---|
29 | S %X=CODE ; parse buffer
|
---|
30 | S %END=""
|
---|
31 | S %ERR=0 ; no error so far
|
---|
32 | S %LAST=""
|
---|
33 | I CODE'?.ANP D I %X'?.ANP G ER ; no control characters allowed
|
---|
34 | . D DSM(,"CONTROL CHARACTER",FIND,.FOUND)
|
---|
35 | . S %X=$TR(%X,$C(9)," ")
|
---|
36 | ;
|
---|
37 | GC ; get next command on line (*)
|
---|
38 | ;
|
---|
39 | ; Errors
|
---|
40 | G ER:%ERR ; bail out if we've found an error
|
---|
41 | G LAST:";"[$E(%X) ; we're done if the next item is a comment
|
---|
42 | ; otherwise it must be a command
|
---|
43 | I "BCDEFGHIKLMNOQRSUWXZ"'[$E(%X) D:$E(%X)="V" G ER
|
---|
44 | . D DSM("V","VIEW",FIND,.FOUND)
|
---|
45 | ;
|
---|
46 | ; Command words
|
---|
47 | S %LAST=%X D SEP G ER:%ERR ; extract command word with optional timeout
|
---|
48 | S %COM=$P(%ARG,":") ; separate command word from timeout
|
---|
49 | S %COMMAND=%COM ; unabbreviated command word
|
---|
50 | I $L(%COM)>1 D G ER:%ERR ; deal with spelled out command words
|
---|
51 | . I $T(COMMAND)'[(";"_%COM_";"),%COM'?1"Z"1.U S %ERR=1
|
---|
52 | . E S %COM=$E(%COM) ; re-abbreviate for later select
|
---|
53 | ;
|
---|
54 | ; Post-Conditions
|
---|
55 | S %=$P(%ARG,":",2,99) ; extract post-condition
|
---|
56 | S %COM(1)=% ; save it off
|
---|
57 | I %ARG[":",%="" G ER ; empty postcond is an error
|
---|
58 | I %]"" D ^ARJTDIM1 G ER:%ERR ; otherwise it better be an expr
|
---|
59 | ;
|
---|
60 | ; Argument List
|
---|
61 | D SEP G ER:%ERR ; extract argument list into %ARG
|
---|
62 | I %ARG="","CGMORSUWXZ"[%COM G ER ; some commands can be argumentless
|
---|
63 | S %END=%ARG
|
---|
64 | I $G(MAH) W !?10,%COM,!
|
---|
65 | G @%COM ; Handle each command as a separate case
|
---|
66 | ;
|
---|
67 | B D DSM("B","BREAK",FIND,.FOUND)
|
---|
68 | G GC:%ARG=""&(%COM(1)="")
|
---|
69 | G BK^ARJTDIM4
|
---|
70 | C D DSM("C","CLOSE",FIND,.FOUND)
|
---|
71 | G CL^ARJTDIM4
|
---|
72 | D D ADD("D",.FOUND) S FOUND=FIND="D"!FOUND G DG^ARJTDIM3
|
---|
73 | E D ADD("E",.FOUND) G GC:%ARG=""&(%COM(1)=""),ER
|
---|
74 | F D ADD("F",.FOUND) G ER:%COM(1)]"",GC:%ARG="",FR^ARJTDIM3
|
---|
75 | G D ADD("G",.FOUND) G DG^ARJTDIM3
|
---|
76 | H D ADD("H",.FOUND) G GC:%ARG=""&(%COM(1)="")&(%X]""),HN^ARJTDIM3:%ARG]"",ER Q
|
---|
77 | I D ADD("I",.FOUND) G ER:%COM(1)]"",IX^ARJTDIM4
|
---|
78 | K D:'$D(ZZDNEW) ADD("K",.FOUND) K ZZDNEW
|
---|
79 | G GC:%ARG=""&(%COM(1)="")&(%X]"")
|
---|
80 | G KL^ARJTDIM3:%ARG]""
|
---|
81 | G ER
|
---|
82 | L D ADD("L",.FOUND) G LK^ARJTDIM3
|
---|
83 | M D ADD("M",.FOUND) G S
|
---|
84 | N D ADD("N",.FOUND) G ER:%ARG=""&(%X="") S ZZDNEW=1 G K
|
---|
85 | O D DSM("O","OPEN",FIND,.FOUND)
|
---|
86 | G OP^ARJTDIM3
|
---|
87 | Q D ADD("Q",.FOUND) G ER:%ARG]"",GC:%ARG=""&(%COM(1)=""),BK^ARJTDIM4
|
---|
88 | R D ADD("R",.FOUND) G RD^ARJTDIM4
|
---|
89 | S D ADD("S",.FOUND) G ST^ARJTDIM4
|
---|
90 | U D ADD("U",.FOUND) G OP^ARJTDIM3
|
---|
91 | W D ADD("W",.FOUND) G WR^ARJTDIM4
|
---|
92 | X D ADD("X",.FOUND) G IX^ARJTDIM4
|
---|
93 | Z D DSM(%COM,%COMMAND,FIND,.FOUND) G GC ; don't parse args of Z commands
|
---|
94 | ;
|
---|
95 | SEP ; remove first " "-piece of %X into %ARG: parse commands (GC)
|
---|
96 | F %I=1:1 S %C=$E(%X,%I) D:%C="""" Q:" "[%C
|
---|
97 | . N %OUT S %OUT=0 F D Q:%OUT!%ERR
|
---|
98 | . . S %I=%I+1,%C=$E(%X,%I) I %C="" S %ERR=1 Q
|
---|
99 | . . Q:%C'="""" S %I=%I+1,%C=$E(%X,%I) Q:%C="""" S %OUT=1
|
---|
100 | S %ARG=$E(%X,1,%I-1),%I=%I+1,%X=$E(%X,%I,999)
|
---|
101 | Q
|
---|
102 | ;
|
---|
103 | COMMAND ;;BREAK;CLOSE;DO;ELSE;FOR;GOTO;HALT;HANG;IF;KILL;LOCK;MERGE;NEW;OPEN;QUIT;READ;SET;USE;WRITE;XECUTE;
|
---|
104 | ;
|
---|
105 | LAST ; check to ensure no trailing "," or " " at end of command (GC)
|
---|
106 | S %L=$L(%LAST),$E(%LAST,%L+1-$L(%X),%L)=""
|
---|
107 | I $E(%END,$L(%END))="," G ER
|
---|
108 | I $E(%X)="",$E(%LAST,%L)=" " G ER
|
---|
109 | G END
|
---|
110 | ;
|
---|
111 | ADD(ELEMENT,FOUND) ; record element found
|
---|
112 | ; Input: ELEMENT = code for element found, e.g., "F".
|
---|
113 | ; Output: .FOUND(ELEMENT) = increment # times found
|
---|
114 | S FOUND(ELEMENT)=$G(FOUND(ELEMENT))+1
|
---|
115 | Q ; end of DSM
|
---|
116 | ;
|
---|
117 | DSM(ABBREV,ELEMENT,FIND,FOUND) ; record DSM-specific element found
|
---|
118 | ; Input:
|
---|
119 | ; ABBREV = code for element found, e.g., "V"
|
---|
120 | ; ELEMENT = name of element found, e.g., "VIEW".
|
---|
121 | ; Output:
|
---|
122 | ; .FOUND(ABBREV) = increment # times found
|
---|
123 | ; .FOUND("DSM",ELEMENT) = ditto
|
---|
124 | I $G(ABBREV)'="" D ADD(ABBREV,.FOUND)
|
---|
125 | I FIND["DSM" D
|
---|
126 | . S FOUND=1
|
---|
127 | . S FOUND("DSM",ELEMENT)=$G(FOUND("DSM",ELEMENT))+1
|
---|
128 | Q ; end of DSM
|
---|
129 | ;
|
---|
130 | ER D ADD("ERROR",.FOUND) ;
|
---|
131 | END K %,%A,%A1,%A2,%ARG,%C1,%C,%COM,%END,%ERR,%H,%I,%L,%LAST,%P,%X,%Z Q
|
---|