mirror of
https://github.com/paleotronic/diskm8.git
synced 2025-01-02 23:31:54 +00:00
fix(disk/atokens.go): handle partial keywords, improve detokenization/tokenization
This commit is contained in:
parent
2a5efddea2
commit
8f395e8360
128
disk/atokens.go
128
disk/atokens.go
@ -120,6 +120,14 @@ var ApplesoftTokens = map[int]string{
|
|||||||
0xEA: "MID$",
|
0xEA: "MID$",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ASPartials = map[string]bool{
|
||||||
|
"COLOR": true,
|
||||||
|
"HCOLOR": true,
|
||||||
|
"SPEED": true,
|
||||||
|
"SCALE": true,
|
||||||
|
"-": true,
|
||||||
|
}
|
||||||
|
|
||||||
var ApplesoftReverse map[string]int
|
var ApplesoftReverse map[string]int
|
||||||
var IntegerReverse map[string]int
|
var IntegerReverse map[string]int
|
||||||
|
|
||||||
@ -128,6 +136,9 @@ func init() {
|
|||||||
IntegerReverse = make(map[string]int)
|
IntegerReverse = make(map[string]int)
|
||||||
for k, v := range ApplesoftTokens {
|
for k, v := range ApplesoftTokens {
|
||||||
ApplesoftReverse[v] = k
|
ApplesoftReverse[v] = k
|
||||||
|
if v == "PRINT" {
|
||||||
|
ApplesoftReverse["?"] = k
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for k, v := range IntegerTokens {
|
for k, v := range IntegerTokens {
|
||||||
IntegerReverse[v] = k
|
IntegerReverse[v] = k
|
||||||
@ -334,6 +345,8 @@ func ApplesoftDetoks(data []byte) []byte {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// var lineStart = len(out)
|
||||||
|
|
||||||
nextAddr = Read16(&srcptr, &length, data)
|
nextAddr = Read16(&srcptr, &length, data)
|
||||||
|
|
||||||
if nextAddr == 0 {
|
if nextAddr == 0 {
|
||||||
@ -349,7 +362,7 @@ func ApplesoftDetoks(data []byte) []byte {
|
|||||||
lineNum = Read16(&srcptr, &length, data)
|
lineNum = Read16(&srcptr, &length, data)
|
||||||
ln := fmt.Sprintf("%d", lineNum)
|
ln := fmt.Sprintf("%d", lineNum)
|
||||||
|
|
||||||
out = append(out, []byte(" "+ln+" ")...)
|
out = append(out, []byte(ln+" ")...)
|
||||||
|
|
||||||
if length == 0 {
|
if length == 0 {
|
||||||
break
|
break
|
||||||
@ -393,7 +406,9 @@ func ApplesoftDetoks(data []byte) []byte {
|
|||||||
t = Read8(&srcptr, &length, data)
|
t = Read8(&srcptr, &length, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
out = append(out, []byte("\r\n")...)
|
out = append(out, []byte("\n")...)
|
||||||
|
|
||||||
|
// log.Printf("Line bytes: %+v", out[lineStart:])
|
||||||
|
|
||||||
inQuote, inRem = false, false
|
inQuote, inRem = false, false
|
||||||
|
|
||||||
@ -428,6 +443,8 @@ func IntegerDetoks(data []byte) []byte {
|
|||||||
var trailingSpace bool
|
var trailingSpace bool
|
||||||
var newTrailingSpace bool = false
|
var newTrailingSpace bool = false
|
||||||
|
|
||||||
|
// var lineStart = len(out)
|
||||||
|
|
||||||
// read the line length
|
// read the line length
|
||||||
lineLen = Read8(&srcptr, &length, data)
|
lineLen = Read8(&srcptr, &length, data)
|
||||||
|
|
||||||
@ -548,7 +565,7 @@ func ApplesoftTokenize(lines []string) []byte {
|
|||||||
|
|
||||||
for _, l := range lines {
|
for _, l := range lines {
|
||||||
|
|
||||||
l = strings.Trim(l, "\r")
|
l = strings.Trim(l, " \r\n\t")
|
||||||
if l == "" {
|
if l == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -556,8 +573,16 @@ func ApplesoftTokenize(lines []string) []byte {
|
|||||||
chunk := ""
|
chunk := ""
|
||||||
inqq := false
|
inqq := false
|
||||||
tmp := strings.SplitN(l, " ", 2)
|
tmp := strings.SplitN(l, " ", 2)
|
||||||
ln, _ := strconv.Atoi(tmp[0])
|
var rest string
|
||||||
rest := strings.Trim(tmp[1], " ")
|
var ln int
|
||||||
|
if len(tmp) == 1 {
|
||||||
|
ln = 0
|
||||||
|
rest = ""
|
||||||
|
} else {
|
||||||
|
ln, _ = strconv.Atoi(tmp[0])
|
||||||
|
rest = strings.Trim(tmp[1], " ")
|
||||||
|
}
|
||||||
|
// lastIsTok := false
|
||||||
|
|
||||||
linebuffer := make([]byte, 4)
|
linebuffer := make([]byte, 4)
|
||||||
|
|
||||||
@ -567,31 +592,101 @@ func ApplesoftTokenize(lines []string) []byte {
|
|||||||
|
|
||||||
// PROCESS LINE
|
// PROCESS LINE
|
||||||
var lastKeyword string
|
var lastKeyword string
|
||||||
|
var inREM bool
|
||||||
|
|
||||||
for _, ch := range rest {
|
for _, ch := range rest {
|
||||||
|
|
||||||
|
// case for a single character token, not in string
|
||||||
|
if codech, ok := ApplesoftReverse[strings.ToUpper(string(ch))]; ok && !inREM && !inqq {
|
||||||
|
|
||||||
|
// log.Printf("'%s' (%.2x) is a token... (lastKW=%s, chunk=%s)", string(ch), ch, lastKeyword, chunk)
|
||||||
|
|
||||||
|
// 1st - is chunk + string a token?
|
||||||
|
if chunk != "" {
|
||||||
|
code, ok := ApplesoftReverse[strings.ToUpper(chunk+string(ch))]
|
||||||
|
if ok {
|
||||||
|
if strings.ToUpper(chunk+string(ch)) == "REM" || strings.ToUpper(chunk+string(ch)) == "DATA" {
|
||||||
|
inREM = true
|
||||||
|
}
|
||||||
|
linebuffer = append(linebuffer, byte(code))
|
||||||
|
lastKeyword = chunk + string(ch)
|
||||||
|
chunk = ""
|
||||||
|
// lastIsTok = true
|
||||||
|
continue // we absorbed it ... eg. COLOR=
|
||||||
|
} else {
|
||||||
|
// chunk wasn't so treat as a string
|
||||||
|
// log.Printf("output (%s) by itself...", chunk)
|
||||||
|
linebuffer = append(linebuffer, []byte(chunk)...)
|
||||||
|
// lastIsTok = false
|
||||||
|
// lastKeyword = chunk
|
||||||
|
chunk = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// just the symbol
|
||||||
|
linebuffer = append(linebuffer, byte(codech))
|
||||||
|
lastKeyword = string(ch)
|
||||||
|
chunk = ""
|
||||||
|
// lastIsTok = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
|
case ch < 32 || ch > 127:
|
||||||
|
continue
|
||||||
|
case inREM && ch != ':':
|
||||||
|
chunk += string(ch)
|
||||||
|
continue
|
||||||
|
case inREM && ch == ':':
|
||||||
|
if chunk != "" {
|
||||||
|
linebuffer = append(linebuffer, []byte(chunk)...)
|
||||||
|
}
|
||||||
|
chunk = ""
|
||||||
|
linebuffer = append(linebuffer, byte(ch))
|
||||||
|
inREM = false
|
||||||
|
continue
|
||||||
case inqq && ch != '"':
|
case inqq && ch != '"':
|
||||||
linebuffer = append(linebuffer, byte(ch))
|
linebuffer = append(linebuffer, byte(ch))
|
||||||
lastKeyword = ""
|
lastKeyword = ""
|
||||||
|
// lastIsTok = false
|
||||||
continue
|
continue
|
||||||
case ch == '"':
|
case ch == '"':
|
||||||
linebuffer = append(linebuffer, byte(ch))
|
linebuffer = append(linebuffer, byte(ch))
|
||||||
lastKeyword = ""
|
lastKeyword = ""
|
||||||
inqq = !inqq
|
inqq = !inqq
|
||||||
|
// lastIsTok = false
|
||||||
continue
|
continue
|
||||||
case !inqq && breakingChar(ch):
|
case !inqq && breakingChar(ch) && !ASPartials[chunk]:
|
||||||
|
|
||||||
|
if chunk != "" {
|
||||||
|
code, ok := ApplesoftReverse[strings.ToUpper(chunk+string(ch))]
|
||||||
|
if ok {
|
||||||
|
linebuffer = append(linebuffer, byte(code))
|
||||||
|
lastKeyword = strings.ToUpper(chunk + string(ch))
|
||||||
|
chunk = ""
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
linebuffer = append(linebuffer, []byte(chunk)...)
|
linebuffer = append(linebuffer, []byte(chunk)...)
|
||||||
chunk = ""
|
chunk = ""
|
||||||
|
if ch != ' ' {
|
||||||
linebuffer = append(linebuffer, byte(ch))
|
linebuffer = append(linebuffer, byte(ch))
|
||||||
|
}
|
||||||
lastKeyword = ""
|
lastKeyword = ""
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ch != ' ' {
|
||||||
chunk += string(ch)
|
chunk += string(ch)
|
||||||
|
}
|
||||||
|
|
||||||
if lastKeyword != "" {
|
if lastKeyword != "" {
|
||||||
code, ok := ApplesoftReverse[strings.ToUpper(lastKeyword+chunk)]
|
code, ok := ApplesoftReverse[strings.ToUpper(lastKeyword+chunk)]
|
||||||
if ok {
|
if ok {
|
||||||
|
if strings.ToUpper(lastKeyword+chunk) == "REM" || strings.ToUpper(lastKeyword+chunk) == "DATA" {
|
||||||
|
inREM = true
|
||||||
|
}
|
||||||
linebuffer[len(linebuffer)-1] = byte(code)
|
linebuffer[len(linebuffer)-1] = byte(code)
|
||||||
lastKeyword = lastKeyword + chunk
|
lastKeyword = lastKeyword + chunk
|
||||||
chunk = ""
|
chunk = ""
|
||||||
@ -601,6 +696,9 @@ func ApplesoftTokenize(lines []string) []byte {
|
|||||||
|
|
||||||
code, ok := ApplesoftReverse[strings.ToUpper(chunk)]
|
code, ok := ApplesoftReverse[strings.ToUpper(chunk)]
|
||||||
if ok {
|
if ok {
|
||||||
|
if strings.ToUpper(lastKeyword+chunk) == "REM" || strings.ToUpper(lastKeyword+chunk) == "DATA" {
|
||||||
|
inREM = true
|
||||||
|
}
|
||||||
linebuffer = append(linebuffer, byte(code))
|
linebuffer = append(linebuffer, byte(code))
|
||||||
lastKeyword = chunk
|
lastKeyword = chunk
|
||||||
chunk = ""
|
chunk = ""
|
||||||
@ -610,6 +708,24 @@ func ApplesoftTokenize(lines []string) []byte {
|
|||||||
linebuffer = append(linebuffer, []byte(chunk)...)
|
linebuffer = append(linebuffer, []byte(chunk)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//~ for i := 5; i < len(linebuffer)-1; i++ {
|
||||||
|
//~ if linebuffer[i] == 0xc9 {
|
||||||
|
//~ log.Printf("Found 0xC9 (-) in linebuffer...")
|
||||||
|
//~ // minus token...
|
||||||
|
//~ before := rune(linebuffer[i-1])
|
||||||
|
//~ after := rune(linebuffer[i+1])
|
||||||
|
//~ log.Printf("Before = %s, After = %s", string(before), string(after))
|
||||||
|
|
||||||
|
//~ if after == '.' || (after >= '0' && after <= '9') {
|
||||||
|
//~ // number part
|
||||||
|
//~ if before > 128 || before == ',' || before == 0xD0 {
|
||||||
|
//~ log.Printf("changing - token at %d to symbol", i)
|
||||||
|
//~ linebuffer[i] = byte('-')
|
||||||
|
//~ }
|
||||||
|
//~ }
|
||||||
|
//~ }
|
||||||
|
//~ }
|
||||||
|
|
||||||
// ENDING ZERO BYTE
|
// ENDING ZERO BYTE
|
||||||
linebuffer = append(linebuffer, 0x00)
|
linebuffer = append(linebuffer, 0x00)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user