Listing of file='LEX.MAC;01' on disk='vmedia/tiny_c_v3.0-sector.ccvf'
; @@@@ SCAN TOOLS @@@@ LF EQU 10 CURSER EQU 2 ASCRET EQU 13 EXTRN CMNT,NEWLINE EXTRN LB,LPAR EXTRN XELS,XIF,XWHI EXTRN CURSOR,FNAME,LNAME,PROGEND EXTRN DENEG,ESET ENTRY LITX LITX: LHLD CURSOR ;RSS04 JMP LIT4 ;RSS04 ENTRY LIT LIT: CALL BLANKS ;RSS01 LIT4: LDAX D ORA A JZ MATCH CMP M INX D INX H JZ LIT4 XRA A ORA A RET MATCH: SHLD CURSOR CMA ORA A RET ; ADVANCES CURSOR OVER BLANKS. PUTS CURSOR IN HL ENTRY BLANKS BLANKS: LHLD CURSOR LOOP: MOV A,M ;RSS01 INX H ;RSS01 CPI ' ' ;RSS01 JZ LOOP ;RSS01 CPI ' ' ;RSS01 JZ LOOP ;RSS01 DCX H ;RSS01 SHLD CURSOR RET ; SKIPS OVER BALANCED L-R DELIMITERS, (ASSUMING THE FIRST ; 1 DELIMITER IS ALREADY MATCHED.) ENTRY SKIP SKIP: MVI D,1 SK2: MOV A,M CMP B JZ SKL CMP C JNZ SKNEXT DCR D JNZ SKNEXT INX H SHLD CURSOR STC CMC RET SKL: INR D SKNEXT: INX H XCHG PUSH H LHLD PROGEND DAD D POP H XCHG JNC SK2 CALL ESET DB CURSER STC RET ; TESTS FOR LEGAL IDENTIFIER CHARACTER ENTRY ALEGAL ALEGAL: CPI '_' ;RSS04 RZ ;RSS04 CPI '0' RM CPI '9'+1 JM YESA ; TEST IF (A) IS ALPHA. PLUS ON YES ENTRY ALPHA ALPHA: CPI 'A' RM CPI 'Z'+1 JM YESA CPI 'a' RM CPI 'z'+1 JM YESA CMA ORA A RET YESA: XRA A RET ; MATCHES A VARIABLE OR FUNCTION NAME. SETS FNAME. ENTRY SYMNAME SYMNAME:CALL BLANKS SHLD FNAME MOV A,M CALL ALPHA JM SY3 SY2: INX H MOV A,M CALL ALEGAL ;RSS04 JP SY2 SHLD CURSOR DCX H SHLD LNAME RET SY3: XRA A RET ; MATCHES 3 KINDS OF CONSTANTS, SETTING FNAME ENTRY CONST CONST: CALL BLANKS MOV A,M CPI '+' JZ CN2 CPI '-' JZ CN2 CPI '0' JM CN3 CPI '9'+1 JP CN3 CN2: SHLD FNAME CN4: INX H MOV A,M CPI '0' JM CN5 CPI '9'+1 JM CN4 CN5: SHLD CURSOR DCX H SHLD LNAME MVI A,1 RET CN3: CPI '"' JNZ CN6 INX H SHLD FNAME CN7: MOV A,M ORA A JZ CN8 SBI '"' JZ CN8 INX H XCHG LHLD PROGEND DAD D XCHG JNC CN7 JMP CNERR CN8: MOV M,A DCX H SHLD LNAME MVI A,2 ORA A INX H INX H SHLD CURSOR RET CN6: CPI 27H JNZ CN9 INX H SHLD FNAME CN12: MOV A,M CPI 27H JZ CN11 INX H XCHG LHLD PROGEND DAD D XCHG JNC CN12 JMP CNERR CN11: MVI A,3 ORA A INX H SHLD CURSOR RET CN9: XRA A RET CNERR: CALL ESET DB CURSER RET ; SKIPS OVER REMARKS AND/OR END-OF-LINES IN ANY ORDER ENTRY REM REM: LXI D,NEWLINE CALL LIT JZ RE2 RE3: MOV A,M CPI LF JNZ REM INX H SHLD CURSOR JMP REM RE2: LXI D,CMNT CALL LITX ;RSS04 RZ MVI B,1 MVI C,ASCRET CALL SKIP RC JMP RE3 ; HL POINT TO START OF DIGIT STRING ENTRY ATON ATON: XCHG LXI H,0 AN2: LDAX D SUI 48 JC AN3 CPI 10 JNC AN3 MOV B,H MOV C,L DAD H DAD H DAD B DAD H MOV C,A MVI B,0 DAD B INX D JMP AN2 AN3: XCHG RET ; HL POINTS TO BEGINNING OF ASCII INTEGER ENTRY ATOI ATOI: XRA A STA AISGN AI6: MOV A,M CPI ' ' JNZ AI2 INX H JMP AI6 AI2: CPI '-' JNZ AI3 STA AISGN INX H AI3: CPI '+' JNZ AI4 INX H AI4: CALL ATON LDA AISGN ORA A RZ JMP DENEG AISGN: DB 0 ; SKIPST SKIPS OVER A (POSSIBLY COMPOUND) STATEMENT ENTRY SKIPST SKIPST: CALL REM LXI D,LB CALL LIT JZ SS2 MVI B,'[' MVI C,']' CALL SKIP JMP REM SS2: LXI D,XIF CALL LITX ;RSS04 JNZ SS6 LXI D,XWHI CALL LITX ;RSS04 SS7: JZ SS3 SS6: LXI D,LPAR CALL LIT MVI B,'(' MVI C,')' CALL SKIP CALL SKIPST LXI D,XELS CALL LIT CNZ SKIPST JMP REM SS3: LHLD CURSOR SS4: MOV A,M CPI ASCRET JZ SS8 CPI ']' JZ SS8 CPI ';' JZ SS5 INX H XCHG LHLD PROGEND DAD D XCHG JNC SS4 JMP REM SS5: INX H SS8: SHLD CURSOR JMP REM END