home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 18 REXX
/
18-REXX.zip
/
rdebug21.zip
/
RSYNTAX.KEX
< prev
next >
Wrap
Text File
|
1993-03-25
|
13KB
|
506 lines
/*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