LEX 'SCANLEX' * (c) Copyright PPC Paris 1986 TITLE Utilitaires \ 01/05/86 \ J-J Moreau ID #E1 MSG 0 POLL 0 ENTRY Entry CHAR #F ENTRY ScanF CHAR #F ENTRY Type CHAR #F KEY 'ENTRY$' TOKEN 72 * * ENTRY$("KEYWORD"[,n]): * Renvoie l'adr È laquelle commence la routine * dÅfinissant la n-iÉme * occurence du mot-clÅ KEYWORD. * KEY 'TOKEN' TOKEN 73 * * TOKEN("KEYWORD"[,n]): * Renvoie le TOKEN de la n-iÅme occurrence de * KEYWORD sous la forme dÅcimale: * 1000*ID + TK * KEY 'TYPE' TOKEN 74 * * TYPE("KEYWORD"[,n]): * Renvoie le type de la n-iÉme occurrence du * mot-clÉ KEYWORD. * Le type d'un mot clef est dÅfinit + bas. * =REVPOP EQU #0BD31 =REV$ EQU #1B38E =RESPTR EQU #03172 =EXPR EQU #0F23C =HEXASC EQU #17148 =STRHDR EQU #0F09A =NTOKEN EQU #0493B =RESCAN EQU #04A4C =A-MULT EQU #1B349 =HDFLT EQU #1B31B =D1C=R3 EQU #03047 =FNRTN2 EQU #0F219 =CSLW5 EQU #0ED3D =RNDAHX EQU #136CB =ARGERR EQU #0BF19 tXFN EQU #000B3 tXWORD EQU #000EF ENDTXT Find P=C 15 Nb d'arguments de la * fonction dans P A=0 A Mets a zero le paramÁtre n * (l'occurrence d'un mot-clÅ) ?P= 1 N'y a-t-il qu'un paramÁtre? GOYES Find1 GOSBVL =RNDAHX Non; second paramÁtre -> * A(A); GONC Argerr 2nd parm <0 IF Argerr D1=D1+ 16 D1 @ en-tÁte de la chaÑne * È tokenizer A=A-1 A A(A) -> n (l'occurrence) GOC Argerr 2nd parm 0= IF Argerr Find1 R1=A Sauvegarde n, qui servira * de compteur, ds R1 P= 0 GOSBVL =REVPOP Mets la chaÑne È tokenizÅ * ds le bon sens CD1EX D1=C D1@ 1er char. C=C+A A D=C A D(A)=(FORSTK) GOSBVL =CSLW5 Sauvegarde D0&D1 ds R3 CD0EX D0=C R3=C ST=1 0 On arme ST0 car on dÅsire * connaÑtre la type du mot-clÅ GOSBVL =NTOKEN Mets A(?-0)=TOKEN, * B(A)=adr d'ÅxÅcution (si elle existe) Findx ?ST=1 11 Voulait-on tokenizer 1 * variable? GOYES Argerr ?A#0 A Ou bien GO? GOYES Find2 Ni l'un ni l'autre Argerr GOVLNG =ARGERR (Remarquez que =IVAERR * s'Åcrit: GOVLNG =ARGERR) Find2 AR1EX n (notre compteur) -> A(A); A=A-1 A n-1 -> A AR1EX Sauvegarde le nv compteur RTNC Retourne si l'on a fait * n-boucles GOSBVL =RESPTR Sinon restaure divers * pointeurs pr que l'on puisse de nv ST=1 0 Utiliser =NTOKEN A=C A Information nÅcessaire È * =NTOKEN -> C(A); GOSBVL =RESCAN A peu prÉs Åquivalent È * GOSBVL =NTOKEN GOTO Findx Boucle NIBHEX 8412 ScanF GOSUB Find Tokenize ST=0 4 * * * Tokens: Avant et aprÉs transformation * FN : Tk , 0Tk00 (Function) * STMT : Tk , 0Tk00 (Statement) * XFN : TkIdB3 , 0TkId (XFunction) * FFN : TkIdB4 , 0TkId (Funny Function) * XSTMT : TkIdEF , 0TkId (XStatement) * WORD : TkIdEF , 0TkId (Word) * * LC(2) =tXWORD ?A=C B GOYES Schi++ Go if XWORD/XSTMT LC(2) =tXFN ?A=C B GOYES Schi++ Go if XFN C=C+1 B ?A=C B GOYES Schif+ Go if FFN ASL A Ici si FN ou STMT A=0 M Effectue la transformation * dÅcrite + haut ASL A GONC Schift (B.E.T.) Schif+ ST=1 4 Indique que l'on tokenize * une FFN Schi++ ASR W Effectue la transformation * dÅcrite + haut ASR A Schift R0=A Sauvegarde le TOKEN A=0 M A=0 XS A(A)=Id C=0 A LC(3) 1000 GOSBVL =A-MULT A(A)=Id*1000 C=R0 C(A)=0TkId CSR A C=0 M CSR A C(A)=Tk A=A+C A A(A)=Id*1000 + Tk Fnrtn GOSBVL =HDFLT A(A)=Resultat en dÅcimal B=A W Sauvegardons-le ds B(W) GOSBVL =D1C=R3 Mets: D1=Stack pointer, * C(A)=PC A=B W Resultat -> C(W); ACEX W PC -> A(A); ?ST=0 4 A-t-on tokenizÅ une FFN? GOYES Pos Non P= 9 Oui; indiquons-le en * renvoyant 1 nb nÅgatif CPEX 15 Pos GOVLNG =FNRTN2 NIBHEX 8412 Entry GOSUB Find Calcule l'adr d'ÅxÅcution * de KEYWORD GOSBVL =D1C=R3 Stack pointer -> D1; D0=C PC -> D0; A=B A Mets l'adr en question ds * A(A) * * * Ci-suit 1 routine HP; elle convertit 1 nb en * hexa ds A(A) en 1 chaÑne * alphanumÅrique qu'elle place sur la pile. * * C=0 W P= 4 CPEX 15 Indicate 4+1 nibs to * convert in ASCII D=C W Save counter in D(W) GOSBVL =HEXASC D=D+1 S D=D+D S DSLC C=D A Compute output string * length GOSBVL =STRHDR Prepare header for string * in B(W) P=C 0 P=P-1 String length-1 to P A=B W DAT1=A WP Write string D1=D1- 16 Move to header P= 0 GOSBVL =REV$ Reverse string GOVLNG =EXPR NIBHEX 8412 Type GOSUB Find DÅtermine le type de * KEYWORD * * * Type: * FN/FFN/XFN/WORD : 0 (En fait F pr * 1 fonction) * STMT/XSTMT : n (0 A(A); ST=0 4 Indique qu'on veut 1 * rÅsultat positif GOTO Fnrtn END