home *** CD-ROM | disk | FTP | other *** search
- /*H* RSYNTAX.KEX 02-08-93 09:48 */
- /* test seperately
- signal on error
- signal on halt
- signal on syntax
- */
- Parse source sys .
- if sys='OS/2' then sys='OS2'
- else if sys='PCDOS' then sys='DOS'
- if (sys='DOS') + (sys='OS2')>0 then pc?=1
- me='rSYNTAX'
- If arg(1)='?' Then Exit tell(me)
- Arg num auto .
- /*check syntax of a REXX exec or macro.*/
- Call initial
- t?=0
- Do k=1 To num
- parse?=0
- do?=0
- '+1 EXTRACT /LINE/CURLINE'
- string=strip(curline.3,'b')
- If t? Then Call dump
- Upper string
- If string='' Then Iterate
- If k=1&left(strip(string,'l'),2)<>'/*' Then Call msg "020"
- If wordpos(line.1,listunpaired)>0 Then Call msg '030'
- Call drop_comments
- Call join_lines
- Call split_lines
- Call process_stack
- End
- Call process_stack
- If level<>0 Then Call msg '230' level 'since line:' lastset
- Address Command 'FINIS' syntax
- 'XEDIT' syntdata
- 'QQUIT'
- 'COMMAND SET MSGMODE' msgmode.1
- 'COMMAND EMSG Processing complete'
- Exit
- DUMP:
- test=k string
- Address Command 'EXECIO 1 DISKW A.A (VAR TEST'
- Return
- DROP_COMMENTS:
- temp=''
- Do Forever
- Parse Value pos(sq,string) pos(dq,string) pos("/*",string,),
- With h i j
- If h=0 Then h=500
- If i=0 Then i=500
- If j=0 Then j=500
- i=min(h,i,j)
- If i=500 Then Leave
- delimiter=substr(string,i,1)
- If delimiter='/' Then Parse Value '*/' 2 With delimiter width
- Else width=1
- temp=temp substr(string,1,i+1-width)
- string=substr(string,i+1)
- Do k=k
- j=pos(delimiter,string)
- If j>0 Then Leave
- If k>ssize Then Leave
- '+1 EXTRACT /CURLINE'
- string=curline.3
- End
- If j>0&delimiter='*/' Then string=substr(string,j+width)
- Else Do
- temp=temp substr(string,1,j+width-1)
- string=substr(string,j+width)
- End
- End
- string=temp string
- temp=''
- Return
- JOIN_LINES:
- Do k=k To ssize
- If right(string,1)<>',' Then Leave
- '+1 EXTRACT /CURLINE'
- string=substr(string,1,length(string)-1) curline.3
- End
- Return
- SPLIT_LINES:
- Trace 'o' /*T*/
- temp=''
- Do n=words(string)to 2 By -1
- word=word(string,n)
- If lastpos(' 'word' ',commands)=0 Then Iterate
- i=lastpos(' 'word,string)
- temp=strip(substr(string,i+1))
- If left(temp,1)=':' Then temp=substr(temp,2)
- If temp<>'' & temp<>';' Then Push temp
- string=substr(string,1,i-1)
- End
- If string<>'' Then Push string
- Drop temp word i
- Return
- PROCESS_STACK:
- Do queued()
- Pull string
- string=strip(string,'b')
- /* l.x contains values without quotes */
- noquotes=translate(string,' ',"'"'"')
- Parse Var noquotes l.1 l.2 l.3 .
- /* process function calls */
- Call process_function
- Call drop_quoted_strings
- Parse Var string wd.1 wd.2 wd.3 rest
- /* check For assignment statement */
- string=translate(string,' ',"'"'"')
- /* process rexx commands and keywords */
- i=wordpos(wd.1,commands)
- If i>4 Then Interpret Call 'k'wd.1
- Else If i>2 Then conditional?=1
- If conditional? Then Call conditional
- Call chklabels wd.2 wd.3 rest
- End
- Return
- PROCESS_FUNCTION:
- Do Forever
- x=length(string)
- If x=0 Then Leave
- x=lastpos('( ',string,x)
- If x<2 Then Leave
- y=max(lastpos(' ',string,x),lastpos('=',string,x),,
- lastpos('(',string,x-1))
- function=substr(string,y+1)
- w=pos(')',function,)
- If w=0 Then Do
- Call msg '240'
- Leave; End
- function=substr(function,1,w-1)
- x=pos('(',function,)
- name=substr(function,1,x-1)
- If name='' Then Leave
- If x+1=w Then parms=''
- Else parms=substr(function,x+1,length(function)-x-1)
- If right(string,1)='('
- Then string=left(string,y-1)'RESULT' substr(string,w+y+2)
- Else string=left(string,y-1) 'RESULT' substr(string,w+y+2)
- words=space(translate(parms,' ',"'"'"'))
- Parse Var words w1','w2','w3','w4','w5','w6','w7','w8','w9','w10
- Parse Var parms p1','p2','p3','p4','p5','p6','p7','p8','p9','p10
- If wordpos(name'(',list)>0 Then Do
- Interpret 'call F'name
- Call chklabels p1 p2 p3 p4 p5 p6 p7 p8 p9 p10; End
- Else Call msg '040' name
- End
- Drop name parms function
- Return
- CHKLABELS:
- Arg parms
- codes='+-/\*:,%><='
- if pc? then nop
- else codes=codes'4f'x'5f'x /* bar and negate */
- parms=translate(parms,' ',codes)
- Do Until parms=''
- Parse Var parms parm parms
- If parm='.' Then Iterate
- If datatype(parm,'w')then Nop;else Do
- i=wordpos(parm,labels)
- If i>0&word(labels,i+1)='undef' Then Call msg '050' parm
- End
- End
-
- Return; CONDITIONAL:
- Parse Var string . wd.2 wd.3 rest
- conditional?=0
- j=translate(string,' ','ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"?.@#!_()'"'")
- i=any(listop,j)
- If words(i)>1 Then Call msg '061'
- Else If i=0 & words(j)=1 Then Call msg '060' strip(j) 'may be:' listop
- If (wd.1='UNTIL')+(wd.1='WHILE')>0 Then Return
- Return
-
- /* Will Return a 1 If any of the words in the first */
- /* argument are also in the second argument Else */
- /* Return a 0 */
- ANY:
- Arg dblist , dbarg
- Do dbi=1 To words(dblist)
- dbj=wordpos(word(dblist,dbi),dbarg)
- If dbj > 0 Then Return 1
- End
- Return 0
-
- /* Drop quoted strings */
- DROP_QUOTED_STRINGS:
- Do Forever
- Parse Value pos(sq,str) pos(dq,str) pos('/*',str),
- With h i j
- If h=0 Then h=500
- If i=0 Then i=500
- i=min(h,i)
- If i=500 Then Leave
- delimiter=substr(string,i,1)
- temp=substr(string,1,i-1)
- string=substr(string,i+1)
- j=pos(delimiter,string)
- If j>0 Then string=temp 'LITERAL' substr(string,j+1)
- Else Do
- string=temp 'LITERAL'
- Leave; End
- End
- temp=''
-
- Return; MSG:
- Parse Arg key msg
- 'COMMAND EXTRACT /line'
- msg='***' right(line.1,3) rsynmsg(key) msg
- ':1 REPLACE' msg
- If pc? Then 'COMMAND PUT 1' syntax
- Else Address Command 'EXECIO 1 DISKW' syntax '(NOTYPE VAR MSG'
- 'COMMAND SOS TABCMDF'
- 'QQUIT'
- 'XEDIT' syntax
- 'COMMAND BOTTOM'
- '-5'
- 'COMMAND SOS TABCMDB'
- ':'line.1
- 'COMMAND REFRESH'
- Drop msg
-
- Return;fABBREV:fCENTRE:fCENTER:fCOMPARE:fINDEX:fJUSTIFY:
- If (p1='')+(p2='')>0 Then Call msg 070 1 or 2
- If p4<>'' Then Call msg 080 w4
-
- Return;fABS:fC2X:fERRORTEXT:fLENGTH:fOPTIONS:fREVERSE:fSIGN:
- fSYMBOL:fVALUE:fX2C:fX2D:fWORDS:
- If p1='LITERAL' Then Call msg 090 '1:' p1
- If p1='' Then Call msg 070
- If p2<>'' Then Call msg 080 w2
-
- Return;fADDRESS:fEXTERNAL:fLINESIZE:fQUEUED:fUSERID:
- If p1<>'' Then Call msg 080 w1
-
- Return;fARG:
- If p3<>'' Then Call msg 080 w3
- If p2='' Then Nop
- Else If w2<>'E' & w2<>'O' Then Call msg 100 w2
-
- Return;fSTORAGE:
- If p1='' & p2='' & p3='' Then Return
- fBITAND:fBITOR:fBITXOR:fFIND:fSPACE:
- If p1='' Then Call msg 070
- If p4<>'' Then Call msg 080 w4
-
- Return;fCMSFLAG:
- If wordpos(w1,listflag)=0 Then Call msg '120' w1 'may be: 'listflag
- If p2<>'' Then Call msg 080 w2
-
- Return;fDATATYPE:
- If p2<>'' Then Do
- If wordpos(w1,listdatatype,substr(w2,2,1))=0 Then
- Call msg 100 w2 'may be:' listdatatype; End
- p2=''
- fCOPIES:fWORD:fWORDINDEX:fWORDLENGTH:fXRANGE:
- If p1='' Then Call msg 110
- If p3<>'' Then Call msg 080 w3
-
- Return;fc2X:fD2C:fX2D:fD2X:fTRUNC:
- If p3<>'' Then Call msg 080 w2
- If (p1='')+(p2='')>0 Then Call msg 110
- If p3<>'' Then Call msg 080 w3
-
- Return;fDATE:
- If p1='' Then Return
- If p2<>'' Then Call msg 080
- If wordpos(w1,listdate)=0 Then Call msg 100 w1 'may be:' listdate
-
- Return;fDIAG:fDIAGRC:
-
- Return;fFORMAT:
- If p1='' Then Call msg 070
- If p2='' Then Return
- If p2<>'BEFORE' Then Call msg 260
- If p3<>'AFTER' Then Call msg 270
- p2=''
- p3=''
-
- Return;fDELSTR:fDELWORD:fLASTPOS:fLEFT:fPOS:fRIGHT:fSUBWORD:
- If p4<>'' Then Call msg 080 w4
- If p2='LITERAL' Then Call msg 090 '2:' w2
- If (p1='')+(p2='')>0 Then Call msg 110
-
- Return;fINSERT:fOVERLAY:
- If (p1='')+(p2='')>0 Then Call msg 110
-
- Return;fMAX:fMIN:
- If p1='' Then Call msg 070
-
- Return;fSTRIP:
- If w2<>''&wordpos(w2,liststrip)=0 Then Call msg 100 w2 'may be:' liststrip
- p2=p1
- fRANDOM:
- If p1<>'' Then Signal fbitand
-
- Return;fSOURCELINE:
- If p1='' Then Return
- If p2<>'' Then Call msg 080 w2
-
- Return;fSUBSTR:
- If p5<>'' Then Call msg 080 w5
- If (p1='')+(p2='')>0 Then Call msg 110
-
- Return;fTIME:
- If p1='' Then Return
- If wordpos(w1,listtime)=0 Then Call msg '100' w1 'may be:' listtime
- If p2<>'' Then Call msg 080 w2
-
- Return;fTRANSLATE:
- If p1='' Then Call msg 070 1
- If p6<>'' Then Call msg 080 w6
-
- Return;fVERIFY:
- If (p1='')+(p2='')>0 Then Call msg 110
- If p5<>'' Then Call msg 080 w5
- If left(w3,2)<>' M' & p3<>'' Then Call msg 130
- w3=''
-
- Return;kADDRESS:
- If wd.2<>'' Then Do
- If (wd.2='RESULT')+(wordpos(wd.2,listaddress)>0)>0 Then wd.2=''
- Else Call msg 100 wd.2 'may be:' listaddress
- End
-
- Return;kARG:kPULL:
- Parse Value '' With wd.2 wd.3 rest
-
- Return;kDIGITS:
-
- Return;kBY:kCALL:kDROP:kEXIT:kFOR:kOPTIONS:kPUSH:kQUEUE:kRETURN:kSAY:
- kTO:kUPPER:
-
- Return;kSELECT:
- selectlevel=level
- select?=1
- kDO:
- If level=0 Then lastset=line.1
- level=level+1
- do?=1
- If wd.2='' Then Return
- doloop?=1
-
- Return; kELSE:
- If then?.level=0 Then Call msg 190
- If else?.level Then Call msg 200
- else?.level=1
- then?.level=0
-
- Return; kEND:
- If level>-1 Then
- Parse Value 0 0 0 0 With if?.level then?.level else?.level when?.level
- level=level-1
- If level=0 Then Do
- doloop?=0
- lastset=line.1
- If selectlevel=level Then select?=0
- End
-
- Return;kEXTERNAL:kSOURCE:kVAR:kVERSION:
- If parse?=0 Then Call msg 140
- If wd.1<>'VAR' Then wd.2=''
- Parse Value '' With wd.3 rest
-
- Return;kIF:
- If if?.level Then Call msg 190
- Parse Value 1 0 0 1 With if?.level then?.level else?.level conditional?
-
- Return;kINTERPRET:
- If pos('=',string)>0 Then Call msg 150
- Parse Var noquotes wd.1 wd.2 wd.3 rest
-
- Return;kUNTIL:kWHILE:
- If do? Then do?=1
- conditional?=1
- kITERATE:kLEAVE:
- If doloop?=0 Then Call msg 160
-
- Return;kNUMERIC:
- If wordpos(wd.2,listnumeric)=0 Then
- Call msg 100 wd.2 'may be:' listnumeric
- If (wd.3='SCIENTIFIC')+(wd.3='ENGINEERING')>0 Then wd.3=
- wd.2=''
-
- Return;kOTHERWISE:
- If select?=0 Then Call msg 210
-
- Return;kPARSE:
- parse?=1
-
- Return;kPROCEDURE:
- If wd.2='EXPOSE' & wd.3='' Then Call msg 170
- wd.2=''
-
- Return;kSIGNAL:
- If (wd.2='ON')+(wd.2='OFF')>0 Then Do
- wd.2=''
- If wordpos(wd.3,listsignal)=0 Then
- Call msg 100 wd.3 'may be:' listsignal; End
- If wd.2='VALUE' Then wd.2=''
-
- Return;kTHEN:
- If if?.level=0&when?.level=0 Then Call msg 200
- If (then?.level)+(else?.level)>0 Then Call msg 200
- Parse Value 0 0 1 With if?.level when?.level then?.level
- If wd.3='=' Then wd.3=''
-
- Return;kTRACE:
- If left(wd.2,6)='VALUE(' Then Return
- If wd.2='RESULT' Then Return
- w1=left(l.2,1)
- w2=substr(l.2,2,1)
- If w2='' Then w2=w1
- If wordpos(w1,listtrace)>0&wordpos(w2,listtrace)>0 Then Nop
- Else Call msg 100 l.2 'may be:' listtrace
-
- Return;kVALUE: /* ? check out */
- If parse? Then Do
- w2=''
- i=wordpos('WITH',string)
- If i=0 Then Call msg 180
- Else Do
- Do x=2 To i
- w2=w2 wd.x; End
- wd.2=w2
- End
- End
-
- Return;kWHEN:
- If select?=0 Then Call msg 210
- If when?.level Then Call msg 190
- Parse Value 1 0 0 1 With when?.level then?.level else?.level conditional?
-
- Return; initial:
- ':0 EXTRACT /FN/FT/LINE/SIZE/MSGMODE'
- 'COMMAND SET MSGMODE OFF'
- If pc? Then Do
- trace o?r /*T*/
- listop='= \> <> > < >< <> >= \< <= == \== >> <<'
- target=fname.1'.'ftype.1
- syntax=fname.1'.syn'
- commfile='rsyncomm.dat'
- funcfile='rsynfunc.dat'
- xrefmap=fname.1'.map'
- syntdata='rsyndata.kex'
- End
- Else Do
- listop='=' '5f'x'> <> > < >< <> >=' '5f'x'< <=' '5f'x'> ==' '5f'x,
- '== >> <<' /* 5f is negate */
- target=fname.1 ftype.1 'A'
- syntax=fname.1 'SYNTAX A'
- commfile='RSYNCOMM DATA A'
- funcfile='RSYNFUNC DATA A'
- xrefmap=fname.1 'XREFMAP A'
- syntdata='RSYNDATA XEDIT A3'
- End
- If line.1=0 Then line.1=1
- sline=1
- ssize=size.1
- If (num='*')+(num='')>0 Then num=size.1-line.1+1
- If datatype('0'num,'w')=0 Then Call msg '010'
- labels='RESULT DEF LITERAL DEF SIGL DEF RC DEF'
- listaddress='COMMAND CMS COMMAND ISPEXEC DOS XEDIT KEDIT'
- listdatatype='A B L M N S U W X'
- listdate='C D E J M O S U W'
- listflag='ABBREV AUTOREAD CMSTYPE DOS EXTERNAL IMPCP IMPEX PROTECT',
- 'RELPAGE SUBSET'
- listnumeric='DIGITS FORM FUZZ'
- listsignal='SYNTAX ERROR HALT NOVALUE'
- liststrip='L T B'
- listtime='E H L M R S'
- listtrace='? ! A C E F I L N O R S'
- Parse Value '' With commands list listunpaired
- Parse Value "'" "|" 0 With sq DQ inserts
- Parse Value 0 1 0 0 0 0 0 0 With level lastset doloop? conditional?,
- if?. then?. else?. when?.
- 'MACRO rMATCH'
- listunpaired=''
- Do n=1
- '.'n
- If rc<>0 Then Leave
- 'COMMAND EXTRACT /line'
- listunpaired=listunpaired line.1
- End
- Do n=1 To 2
- 'XEDIT' commfile
- 'COMMAND EXTRACT /SIZE'
- Do size.1
- '+1 EXTRACT /CURLINE'
- If n=1 Then COMMANDS=Commands curline.3
- Else list=list curline.3
- End
- 'COMMAND QUIT'
- commfile=funcfile
- End
- 'ERASE' syntdata
- 'ERASE' syntax
- ':1 PUT' ssize syntdata
- 'XEDIT' syntdata
- 'COMMAND SET SCR 2'
- if pc?
- then 'MACRO RSYNCHG' sline num
- else 'RSYNCHG' sline num
- Drop commfile funcfile
- Return
-