mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-08-09 16:25:01 +00:00
Add assembly helper for lexical scanner ID/Keyword match
This commit is contained in:
@@ -26,29 +26,24 @@
|
|||||||
// fin
|
// fin
|
||||||
// return FALSE
|
// return FALSE
|
||||||
//end
|
//end
|
||||||
def keymatch
|
//def keymatch
|
||||||
byte i, keypos
|
// byte i, keypos
|
||||||
word chrptr
|
// word chrptr
|
||||||
|
//
|
||||||
keypos = 0
|
// keypos = 0
|
||||||
while keywrds[keypos] < tknlen
|
// while keywrds[keypos] < tknlen
|
||||||
keypos = keypos + keywrds[keypos] + 2
|
// keypos = keypos + keywrds[keypos] + 2
|
||||||
loop
|
// loop
|
||||||
chrptr = tknptr - 1
|
// chrptr = tknptr - 1
|
||||||
while keywrds[keypos] == tknlen
|
// while keywrds[keypos] == tknlen
|
||||||
i = 1; while i <= tknlen and ^(chrptr + i) == keywrds[keypos + i]; i++; loop
|
// i = 1; while i <= tknlen and ^(chrptr + i) == keywrds[keypos + i]; i++; loop
|
||||||
//for i = 1 to tknlen
|
// if i > tknlen
|
||||||
// if ^(chrptr + i) <> keywrds[keypos + i]
|
// return keywrds[keypos + keywrds[keypos] + 1]
|
||||||
// break
|
// fin
|
||||||
// fin
|
// keypos = keypos + keywrds[keypos] + 2
|
||||||
//next
|
// loop
|
||||||
if i > tknlen
|
// return ID_TKN
|
||||||
return keywrds[keypos + keywrds[keypos] + 1]
|
//end
|
||||||
fin
|
|
||||||
keypos = keypos + keywrds[keypos] + 2
|
|
||||||
loop
|
|
||||||
return ID_TKN
|
|
||||||
end
|
|
||||||
def scannum
|
def scannum
|
||||||
word num
|
word num
|
||||||
num = 0
|
num = 0
|
||||||
@@ -85,23 +80,20 @@ def scan
|
|||||||
scanptr++
|
scanptr++
|
||||||
loop
|
loop
|
||||||
tknptr = scanptr
|
tknptr = scanptr
|
||||||
scanchr = toupper(^scanptr)
|
scanchr, scanptr, token = scanid(scanptr, @keywrds) //scanchr = toupper(^scanptr)
|
||||||
//
|
//
|
||||||
// Scan for token based on first character
|
// Scan for token based on first character
|
||||||
//
|
//
|
||||||
//if isalpha(scanchr)
|
if token //if isalpha(scanchr)
|
||||||
if (scanchr >= 'A' and scanchr <= 'Z') or (scanchr == '_')
|
|
||||||
//
|
//
|
||||||
// ID, either variable name or reserved word
|
// ID, either variable name or reserved word
|
||||||
//
|
//
|
||||||
repeat
|
//repeat
|
||||||
^scanptr = scanchr
|
// ^scanptr = scanchr
|
||||||
scanptr++
|
// scanptr++
|
||||||
scanchr = toupper(^scanptr)
|
// scanchr = toupper(^scanptr)
|
||||||
//until not isalphanum(scanchr)
|
//until not isalphanum(scanchr)
|
||||||
until not ((scanchr >= 'A' and scanchr <= 'Z') or (scanchr >= '0' and scanchr <= '9' ) or (scanchr == '_'))
|
|
||||||
tknlen = scanptr - tknptr
|
tknlen = scanptr - tknptr
|
||||||
token = keymatch
|
|
||||||
elsif scanchr >= '0' and scanchr <= '9' // isnum()
|
elsif scanchr >= '0' and scanchr <= '9' // isnum()
|
||||||
//
|
//
|
||||||
// Decimal constant
|
// Decimal constant
|
||||||
|
@@ -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
|
// Handy functions
|
||||||
//
|
//
|
||||||
|
Reference in New Issue
Block a user