LEX 'HALEX' * (c) 1988, PPC Paris et l'Auteur =id EQU #5D FNRTN1 EQU #0F216 HDFLT EQU #1B31B POP1S EQU #0BD38 BSERR EQU #0939A DRANGE EQU #1B076 CON(2) =id CON(2) 7 CON(2) 9 CON(5) 0 NIBHEX F REL(4) 1+TxTbSt REL(4) MSGTBL REL(5) POLHND CON(3) (TxEn01)-(TxTbSt) REL(5) Typecar CON(1) #F CON(3) (TxEn02)-(TxTbSt) REL(5) Number CON(1) #F CON(3) (TxEn03)-(TxTbSt) REL(5) Pos CON(1) #F TxTbSt TxEn01 CON(1) 11 NIBASC 'CHRTYP' CON(2) 7 TxEn02 CON(1) 9 NIBASC 'ISNUM' CON(2) 8 TxEn03 CON(1) 7 NIBASC 'MNOP' CON(2) 9 NIBHEX 1FF MSGTBL CON(2) 1 plus petit CON(2) 2 plus grand * DL:V1 message bidon, Mais obligatoire. CON(2) 16 CON(2) 2 Message # 2 CON(1) 4 NIBASC 'SL:V1' CON(1) 12 * Parenthesis omited ePROM EQU #00001 CON(2) 43 CON(2) ePROM Message # 1 CON(1) 10 NIBASC 'Parenthe' NIBASC 'sis' CON(1) 6 NIBASC ' omited' CON(1) 12 NIBHEX FF POLHND ?B=0 B Interception du Poll VER$ GOYES Trt GONC Rsxm Trt C=R3 D1=C A=R2 D1=D1- 14 CD1EX ?CA S priorite plus grande ? GOYES NX caractere suivant ?ST#0 3 premier caractere ? GOYES stock oui, pas de probleme B=C S B=B-1 S B=B-1 S GOC sgn c'est un signe plus B=B-1 S GOC sgn c'est un signe moins stock A=C S A(15) := priorite C=D A R0=C position du car. dans R0 NX D1=D1- 2 caractere suivant ST=0 3 D=D-1 A un caractere de moins GONC Bcl s'il en reste, on continue ?B=0 A reste-t-il des parentheses ? GOYES F0 P= 0 P=0 en entree, et on charge LC(4) (=id)*256+ePROM avec l'erreur 1 GOVLNG BSERR F0 C=R0 position dans C A=R2 longueur de la chaine dans A A=A-C A GOTO Sortie sgn P= 3 D1=D1+ 2 2 caracteres precedents A=DAT1 WP dans A(0-3) D1=D1- 2 P= 0 LCASC 'E' ?A#C B etait-ce un E ? GOYES stock ASRC ASRC GOSUB =CARTYP ?P= 10 GOYES NX precede d'un chiffre ? GONC stock ************************************************** * * ISNUM * * But: Implemente la fonction ISNUM * * Entree: * - D1 = stack pointer * - D0 = PC * - P = 0 * * Sortie: * - D1 mis a jour * - sort par FNRTN1 * - 0: la chaine n'est pas numerique pure * - 1: la chaine est un numerique pur * * Appel: POP1S, DRANGE, Nxt, lpnum * * Abime: A(A), C, D(A), P, R1 * * Niveaux: 1 * * Historique: * 87/12/00 : A.O. & L.I. Conception et codage * 88/01/09 : A.O. & L.I. Documentation * 88/01/22 : L.I. traite, plusieurs signes * ************************************************** NIBHEX 411 Number GOSUB store ?A#0 A chaine vide ? GOYES anal non GOTO Fn0 anal D1=D1- 2 pointe le premier caractere D=C A nombre de caracteres dans D P= 0 D=D-1 A 1 en moins pour la boucle LCASC '(' B=0 A A=DAT1 B bparL ?A#C B GOYES trnum B=B+1 A D=D-1 A GOSUB Nxt GOC Fn0 GONC bparL trnum GOSUB sgn? GOC Fn0 chaine termine par operateur LCASC '.' ?A#C B est-ce un point ? GOYES num1 si non meme caractere GOSUB Nxt caractere suivant GOC Fn0 non num num1 GOSBVL DRANGE compris entre 0 et 9 ? GOC Fn0 non num GOSUB lpnum on a un num, * on cherche jusqu'ou GONC Fn1 si bout de ligne -> numerique LCASC '.' ?A#C B est-ce un point ? GOYES spt si non meme caractere GOSUB Nxt caractere suivant GOC Fn1 spt GOSBVL DRANGE GOC exp? GOSUB lpnum GONC Fn1 exp? LCASC 'E' ?A#C B GOYES Fn0 GOSUB Nxt GOC Fn0 A=DAT1 B GOSUB sgn? GOC Fn0 un operateur termine la chaine GOSBVL DRANGE GOC Fn0 GOSUB lpnum GONC Fn1 Fn0 P= 0 GOTO Fin Fn1 C=B A D=C A P= 0 LCASC ')' D=D-1 A GOC SR1 A=DAT1 B bparR ?A#C B GOYES Fn0 GOSUB Nxt GOC SR1 GONC bparR SR1 P= 1 renvoie 1 GOTO Fin ************************************************** * * sgn? * * But: passer une suite de signe + et - * * Entree: * - A(B) = premier caractere a traiter * - D1 = pointe ce caractere * - D(A) = nombre de caracteres jusqu'au bout * de la chaine moins 1 * * Sortie: * - D1 = pointe derriere le dernier operateur * - Cy = 1: un operateur termine la chaine * - Cy = 0: il y a un caractere derriere le * dernier operateur * il n'y a pas d'operateur * dans ces deux cas, sortie valide * * Appel: Nxt * * Abime: C(1-0), Cy * * Niveau : 1 * * Historique: * 88/01/22 : L.I. Conception et codage * 88/01/22 : L.I. Documentation * ************************************************** sgn? LCASC '-' ?A#C B est-ce un signe moins ? GOYES pl1 non, est-ce un "+" GOSUB Nxt oui, caractere suivant RTNC GONC sgn? des fois qu'il y en * ait plusieurs pl1 LCASC '+' ?A=C B est-ce un signe plus ? GOYES nx RTNCC nx GOSUB Nxt si oui on passe au suivant RTNC GONC sgn? 100 fois sur le metier... ************************************************** * * lpnum * * But: lit une chaine de caracteres jusqu'a * epuisement des chiffres * * Entree: * - A(B) 1er caractere de la chaine * - D1 pointe ce caractere * - D(A) = nombre de caracteres jusqu'au bout * de la chaine moins 1 * * Sortie: * - Cy=0 tous les caractere sont numeriques * - Cy=1 un caractere non numerique * - D1 pointe ce caractere non numerique * * Appel: DRANGE, Nxt * * Abime: D(A), A(B), D1, Cy, C(A) * * Niveau: 1 * * Historique: * 87/12/19 : A.O. & L.I. Conception et codage * 88/01/09 : A.O. & L.I. Documentation * ************************************************** lpnum GOSBVL DRANGE dans l'intervalle 0-9 ? RTNC Cy set si non GOSUB Nxt Caractere suivant GONC lpnum tant qu'il en reste... RTNCC si on arrive au dernier * on baisse Cy ************************************************** * * Nxt * * But: Passe au caractere suivant en verifiant * qu'il en reste * * Entree: * - D1: pointe un des caracteres de la chaine * - D(A): nombre de caracteres moins 1 * * Sortie: * - Cy=1 il ne reste plus de caractere * - Cy=0 il reste encore des caracteres * * Appel: Rien * * Abime: D(A), A(B), D1, Cy * * Niveau: 0 * * Historique: * 87/12/00 : A.O. & L.I. Conception et codage * 88/01/09 : A.O. & L.I. Documentation * ************************************************** Nxt D1=D1- 2 caractere suivant A=DAT1 B D=D-1 A mise a jour de D RTNC en fin de ligne on leve Cy RTNCC sinon baisse ************************************************** * * CARTYP * * But: Trouver le type d'un caractere. * * Entree: * - A(B) = Code du caractere * * Sortie: * - P contient le code du caractere * definit comme suit * P = 0 : ( ou ) * P = 1 : + * P = 2 : - * P = 3 : * * P = 4 : / * P = 5 : ^ * P = 10 : Un nombre de 0 a 9 * P = 12 : Une lettre de A a Z * P = 15 : Tout autre caractere * * Appel: CATCHR * * Abime: C, P, S1, S2 * * Niveaux: 3 * * Historique: * 87/12/16 : A.O. & L.I. Conception et codage * 87/12/19 : L.I. Documentation * 87/12/19 : A.O. & L.I. Utilisation de CATCHR * ************************************************** CATCHR EQU #03F70 =CARTYP P= 0 LCASC ')^/*-+(' operateurs et parentheses bcl ?A=C B operateur traite GOYES fin si egal, fin P=P+1 mise a jour de P CSR W CSR W decalage operateur suivant ?P# 7 tous testes ? GOYES bcl si non on continue GOSBVL CATCHR GONC P15 ni alpha ni num si Cy=1 P= 10 ?ST=1 1 si numerique GOYES fin P= 12 GONC fin B.E.T. P15 P= 15 sinon P vaut 15 fin ?P# 6 si P vaut 6 ")" RTNYES P= 0 alors P a 0 RTN