From f5a94313f275261d72b73734982c0f59eb1a7b93 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Mon, 12 Mar 2018 15:13:35 -0700 Subject: [PATCH] Add assembly helper for lexical scanner ID/Keyword match --- src/toolsrc/lex.pla | 56 ++++++++++------------- src/toolsrc/plasm.pla | 100 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 32 deletions(-) diff --git a/src/toolsrc/lex.pla b/src/toolsrc/lex.pla index b20e863..6d8f062 100644 --- a/src/toolsrc/lex.pla +++ b/src/toolsrc/lex.pla @@ -26,29 +26,24 @@ // fin // return FALSE //end -def keymatch - byte i, keypos - word chrptr - - keypos = 0 - while keywrds[keypos] < tknlen - keypos = keypos + keywrds[keypos] + 2 - loop - chrptr = tknptr - 1 - while keywrds[keypos] == tknlen - i = 1; while i <= tknlen and ^(chrptr + i) == keywrds[keypos + i]; i++; loop - //for i = 1 to tknlen - // if ^(chrptr + i) <> keywrds[keypos + i] - // break - // fin - //next - if i > tknlen - return keywrds[keypos + keywrds[keypos] + 1] - fin - keypos = keypos + keywrds[keypos] + 2 - loop - return ID_TKN -end +//def keymatch +// byte i, keypos +// word chrptr +// +// keypos = 0 +// while keywrds[keypos] < tknlen +// keypos = keypos + keywrds[keypos] + 2 +// loop +// chrptr = tknptr - 1 +// while keywrds[keypos] == tknlen +// i = 1; while i <= tknlen and ^(chrptr + i) == keywrds[keypos + i]; i++; loop +// if i > tknlen +// return keywrds[keypos + keywrds[keypos] + 1] +// fin +// keypos = keypos + keywrds[keypos] + 2 +// loop +// return ID_TKN +//end def scannum word num num = 0 @@ -85,23 +80,20 @@ def scan scanptr++ loop tknptr = scanptr - scanchr = toupper(^scanptr) + scanchr, scanptr, token = scanid(scanptr, @keywrds) //scanchr = toupper(^scanptr) // // Scan for token based on first character // - //if isalpha(scanchr) - if (scanchr >= 'A' and scanchr <= 'Z') or (scanchr == '_') + if token //if isalpha(scanchr) // // ID, either variable name or reserved word // - repeat - ^scanptr = scanchr - scanptr++ - scanchr = toupper(^scanptr) + //repeat + // ^scanptr = scanchr + // scanptr++ + // scanchr = toupper(^scanptr) //until not isalphanum(scanchr) - until not ((scanchr >= 'A' and scanchr <= 'Z') or (scanchr >= '0' and scanchr <= '9' ) or (scanchr == '_')) tknlen = scanptr - tknptr - token = keymatch elsif scanchr >= '0' and scanchr <= '9' // isnum() // // Decimal constant diff --git a/src/toolsrc/plasm.pla b/src/toolsrc/plasm.pla index 7b44939..f63106d 100644 --- a/src/toolsrc/plasm.pla +++ b/src/toolsrc/plasm.pla @@ -338,6 +338,106 @@ const ERR_SYNTAX = $8000 // //===================================== +// +// Lexical scanner helper for keyword/IDs +// +asm scanid(scanptr, keywrds)#3 + !SOURCE "vmsrc/plvmzp.inc" + LDA ESTKL,X + STA DSTL + LDA ESTKH,X + STA DSTH + LDA ESTKL+1,X + STA ESTKL,X ; COPY OUTPUT SCANPTR + STA SRCL + LDA ESTKH+1,X + STA ESTKH,X + STA SRCH + DEX + LDA #$00 + STA ESTKL,X ; CLEAR OUTPUT TOKEN + STA ESTKH,X + STA ESTKH+2,X ; CLEAR MSB OF SCANCHR + TAY + LDA (SRC),Y + AND #$7F + CMP #'a' + BCC + + CMP #'z'+1 + BCS + + SBC #$1F + STA (SRC),Y ++ STA ESTKL+2,X ; SET SCANCHR + CMP #'_' + BEQ + + CMP #'A' + BCC SCANEX + CMP #'Z'+1 + BCS SCANEX ++ LDA #$D6 ; ID_TKN + STA ESTKL,X ; SET OUTPUT TOKEN = ID_TKN +SCANID INY + LDA (SRC),Y + AND #$7F + BEQ ++ + CMP #'a' + BCC + + CMP #'z'+1 + BCS ++ + SBC #$1F + STA (SRC),Y ; COPY UPPERCASE CHAR BACK TO ^SCANPTR + BNE SCANID ++ CMP #'_' + BEQ SCANID + CMP #'0' + BCC ++ + CMP #'9'+1 + BCC SCANID + CMP #'A' + BCC ++ + CMP #'Z'+1 + BCC SCANID +++ STY TMPL + TYA + LDY #$00 + CLC + ADC SRCL + STA ESTKL+1,X ; UPDATE SCANPTR + BCC MATCHLEN + INC ESTKH+1,X +MATCHLEN LDA (DST),Y + CMP TMPL + BCS + + ADC #$02 + ADC DSTL + STA DSTL + BCC MATCHLEN + INC DSTH + BNE MATCHLEN ++ BNE SCANEX ; NO KEY MATCH + TAY + DEY + INC DSTL + BNE MATCHKEY + INC DSTH +MATCHKEY LDA (SRC),Y + CMP (DST),Y + BNE NEXTKEY + DEY + BPL MATCHKEY + LDY TMPL + LDA (DST),Y + STA ESTKL,X ; SET OUTPUT TOKEN +SCANEX RTS +NEXTKEY LDY #$00 + LDA TMPL + SEC + ADC DSTL + STA DSTL + BCC MATCHLEN + INC DSTH + BNE MATCHLEN +end // // Handy functions //