1 | RGUTSTX ;CAIRO/DKM - M syntax analyzer;22-Oct-1998 10:39;DKM
|
---|
2 | ;;2.1;RUN TIME LIBRARY;;Mar 22, 1999
|
---|
3 | ;=================================================================
|
---|
4 | ; Perform syntactic analysis of a line of M code.
|
---|
5 | ; Inputs:
|
---|
6 | ; RGM = M statement(s)
|
---|
7 | ; RGO = Options:
|
---|
8 | ; L = Line label allowed
|
---|
9 | ; . = Dotted syntax allowed
|
---|
10 | ; N = Do not init parsing tables
|
---|
11 | ; D = Do not delete parsing tables
|
---|
12 | ; Z = Process all Z-extensions as valid
|
---|
13 | ; Outputs:
|
---|
14 | ; Returns 0 if successfully parsed. Otherwise returns E^P^M
|
---|
15 | ; where E is an error code (see ERRORS label), P is the
|
---|
16 | ; character position where the error occurred, and M is the
|
---|
17 | ; error message.
|
---|
18 | ;=================================================================
|
---|
19 | ENTRY(RGM,RGO) ;
|
---|
20 | N RGPSN,RGLEN,RGERR,RGRN,RGQT,RGF,RGPID,RGCMD
|
---|
21 | S RGM=$$UP^XLFSTR(RGM),RGO=$$UP^XLFSTR($G(RGO)),RGPSN=1,RGLEN=$L(RGM),RGERR=0,RGQT="""",RGF=0,RGPID="RGUTSTX"_$J,U="^"
|
---|
22 | D LOAD:RGO'["N",PARSE:RGLEN
|
---|
23 | K:RGO'["D" ^TMP(RGPID)
|
---|
24 | Q $S(RGERR:RGERR_U_$S(RGPSN>RGLEN:RGLEN,1:RGPSN)_U_$S(RGERR<0:$$EC^%ZOSV,1:$P($T(ERRORS+RGERR),";;",2)),1:0)
|
---|
25 | PARSE N RGZ,RGZ1
|
---|
26 | S @$$TRAP^RGZOSF("ERROR^RGUTSTX")
|
---|
27 | I RGO["L" D Q:RGERR
|
---|
28 | .S:$E(RGM)'=" " RGPSN=$$LABEL^RGUTSTX0
|
---|
29 | .I $$NEXT^RGUTSTX0("("),'$$NEXT^RGUTSTX0(")") D
|
---|
30 | ..F RGPSN=RGPSN:1 D Q:$E(RGM,RGPSN)'=","!RGERR
|
---|
31 | ...S RGPSN=$$NAME^RGUTSTX0(RGPSN,"L%")
|
---|
32 | ..Q:RGERR
|
---|
33 | ..S:'$$NEXT^RGUTSTX0(")") RGERR=3
|
---|
34 | .S:" "'[$E(RGM,RGPSN) RGERR=2
|
---|
35 | I RGO["." F RGPSN=RGPSN:1:RGLEN+1 Q:". "'[$E(RGM,RGPSN)
|
---|
36 | F Q:RGERR D SKPSPC Q:";"[$E(RGM,RGPSN) D
|
---|
37 | .S RGCMD=""
|
---|
38 | .F RGPSN=RGPSN:1 S RGZ=$E(RGM,RGPSN) Q:RGZ'?1A S RGCMD=RGCMD_RGZ
|
---|
39 | .I RGCMD="" S RGERR=4 Q
|
---|
40 | .I $D(^TMP(RGPID,"CMD",RGCMD)) S RGCMD=^(RGCMD)
|
---|
41 | .E I RGO["Z" S RGCMD="PC;OPT;ARGS("":M"")"
|
---|
42 | .E S RGERR=4 Q
|
---|
43 | .F RGRN=1:1:$L(RGCMD,";") D CMD^RGUTSTX0($P(RGCMD,";",RGRN)) Q:RGERR!'RGRN
|
---|
44 | .I 'RGERR," "'[$E(RGM,RGPSN) S RGERR=2
|
---|
45 | .E S RGPSN=RGPSN+1
|
---|
46 | Q
|
---|
47 | ; Skip over blanks
|
---|
48 | SKPSPC F Q:'$$NEXT^RGUTSTX0(" ")
|
---|
49 | Q
|
---|
50 | ; Load tables
|
---|
51 | LOAD N RGZ,RGZ1,RGZ2,RGL
|
---|
52 | K ^TMP(RGPID)
|
---|
53 | F RGL="CMD","FCN","SYS" D
|
---|
54 | .F RGZ=1:1 S RGZ1=$P($T(@RGL+RGZ),";;",2,999) Q:RGZ1="" D
|
---|
55 | ..S RGZ2=$P(RGZ1,";"),RGZ1=$P(RGZ1,";",2,999)
|
---|
56 | ..F Q:RGZ2="" D
|
---|
57 | ...S ^TMP(RGPID,RGL,$P(RGZ2,","))=RGZ1,RGZ2=$P(RGZ2,",",2,999)
|
---|
58 | Q
|
---|
59 | ERROR S RGERR=-1
|
---|
60 | Q
|
---|
61 | CMD ;;*Commands*
|
---|
62 | ;;B,BREAK;PC;OPT;ARGS()
|
---|
63 | ;;C,CLOSE;PC;ARGS(":M")
|
---|
64 | ;;D,DO;PC;OPT;LBL(2)
|
---|
65 | ;;E,ELSE;NPC;OPT;ARGS()
|
---|
66 | ;;F,FOR;NPC;OPT;FOR
|
---|
67 | ;;G,GOTO;PC;LBL(1)
|
---|
68 | ;;H,HALT,HANG;PC;OPT;EXP()
|
---|
69 | ;;I,IF;NPC;OPT;ARGS()
|
---|
70 | ;;J,JOB;PC;LBL(2)
|
---|
71 | ;;K,KILL;PC;OPT;KILL
|
---|
72 | ;;L,LOCK;PC;OPT;LOCK
|
---|
73 | ;;M,MERGE;PC;MERGE
|
---|
74 | ;;N,NEW;PC;OPT;NEW
|
---|
75 | ;;O,OPEN;PC;ARGS(":M")
|
---|
76 | ;;Q,QUIT;PC;OPT;EXP()
|
---|
77 | ;;R,READ;PC;READ
|
---|
78 | ;;S,SET;PC;SET
|
---|
79 | ;;U,USE;PC;ARGS(":M")
|
---|
80 | ;;V,VIEW;PC;ARGS(":M")
|
---|
81 | ;;W,WRITE;PC;WRITE
|
---|
82 | ;;X,XECUTE;PC;ARGS(":")
|
---|
83 | ;;ZT,ZTRAP;PC;OPT;EXP()
|
---|
84 | ;;ZS,ZSAVE;PC;OPT;EXP()
|
---|
85 | ;;ZR,ZREMOVE;PC;OPT;LBL(1)
|
---|
86 | ;;ZP,ZPRINT
|
---|
87 | ;;
|
---|
88 | FCN ;;*Intrinsic functions*
|
---|
89 | ;;A,ASCII;;1-2
|
---|
90 | ;;C,CHAR;;1-999
|
---|
91 | ;;D,DATA;;1-1;V
|
---|
92 | ;;E,EXTRACT;S;1-3
|
---|
93 | ;;F,FIND;;2-3
|
---|
94 | ;;FN,FNUMBER;;2-3
|
---|
95 | ;;G,GET;;1-2;V
|
---|
96 | ;;J,JUSTIFY;;1-3
|
---|
97 | ;;L,LENGTH;;1-2
|
---|
98 | ;;N,NEXT;;1-2
|
---|
99 | ;;NA,NAME;;1-2;V
|
---|
100 | ;;O,ORDER;;1-2;V
|
---|
101 | ;;P,PIECE;S;2-4
|
---|
102 | ;;Q,QUERY;;1-2;V
|
---|
103 | ;;R,RANDOM;;1-1
|
---|
104 | ;;S,SELECT;:;1-999
|
---|
105 | ;;T,TEXT;;1-1;L
|
---|
106 | ;;TR,TRANSLATE;;2-3
|
---|
107 | ;;V,VIEW;;1-999
|
---|
108 | ;;
|
---|
109 | SYS ;;*System variables*
|
---|
110 | ;;D,DEVICE
|
---|
111 | ;;ET,ETRAP;SN
|
---|
112 | ;;H,HOROLOG
|
---|
113 | ;;I,IO
|
---|
114 | ;;J,JOB
|
---|
115 | ;;K,KEY
|
---|
116 | ;;P,PRINCIPAL
|
---|
117 | ;;S,STORAGE
|
---|
118 | ;;SY,SYSTEM
|
---|
119 | ;;T,TEST
|
---|
120 | ;;TL,TLEVEL
|
---|
121 | ;;TR,TRESTART
|
---|
122 | ;;X;S
|
---|
123 | ;;Y;S
|
---|
124 | ;;ZT,ZTRAP;S
|
---|
125 | ;;ZE,ZERROR;S
|
---|
126 | ;;
|
---|
127 | ERRORS ;;*Error messages*
|
---|
128 | ;;Bad variable name
|
---|
129 | ;;Syntax error
|
---|
130 | ;;Unbalanced parentheses
|
---|
131 | ;;Unrecognized command
|
---|
132 | ;;Postconditional not allowed
|
---|
133 | ;;Missing operand
|
---|
134 | ;;Unrecognized intrinsic function/variable
|
---|
135 | ;;Incorrect number of arguments
|
---|
136 | ;;Missing closing quote
|
---|
137 | ;;Illegal pattern
|
---|
138 | ;;Bad label name
|
---|
139 | ;;12
|
---|