Files
argon-v3/src/trycatch.go

77 lines
2.1 KiB
Go

package main
import (
"strings"
)
var tryCompiled = makeRegex(`\s*try\s(.|\n)+`)
var catchCompiled = makeRegex(`\s*catch\s*\(\s*` + spacelessVariable + `\s*\)\s*(.|\n)+`)
type TryCatch struct {
Try any
Catch any
errorName string
line int
path string
code string
}
func isTryCatch(code UNPARSEcode) bool {
return tryCompiled.MatchString(code.code)
}
func parseTryCatch(code UNPARSEcode, index int, codelines []UNPARSEcode) (TryCatch, bool, ArErr, int) {
trytrimmed := strings.TrimSpace(code.code)
totalIndex := 0
tryparsed, worked, err, i := translateVal(UNPARSEcode{trytrimmed[4:], code.realcode, code.line, code.path}, index, codelines, 2)
if !worked {
return TryCatch{}, false, err, i
}
totalIndex += i
if index+totalIndex >= len(codelines) {
return TryCatch{}, false, ArErr{"Syntax Error", "expected catch statement", code.line, code.path, code.realcode, true}, i
}
catchtrimmed := strings.TrimSpace(codelines[index+totalIndex].code)
if !catchCompiled.MatchString(catchtrimmed) {
return TryCatch{}, false, ArErr{"Syntax Error", "invalid syntax", code.line, code.path, code.realcode, true}, i
}
catchtrimmed = catchtrimmed[6:]
catchbracketSplit := strings.SplitN(catchtrimmed, ")", 2)
errorName := strings.TrimSpace(strings.TrimSpace(catchbracketSplit[0])[1:])
errcode := catchbracketSplit[1]
catchparsed, worked, err, i := translateVal(UNPARSEcode{errcode, code.realcode, code.line, code.path}, index+totalIndex, codelines, 2)
if !worked {
return TryCatch{}, false, err, i
}
totalIndex += i
return TryCatch{
tryparsed,
catchparsed,
errorName,
code.line,
code.path,
code.realcode,
}, true, ArErr{}, totalIndex
}
func runTryCatch(t TryCatch, stack stack, stacklevel int) (any, ArErr) {
val, err := runVal(t.Try, stack, stacklevel+1)
if err.EXISTS {
vars := anymap{}
vars[t.errorName] = Map(anymap{
"type": err.TYPE,
"message": err.message,
"line": newNumber().SetInt64(int64(err.line)),
"path": err.path,
"code": err.code,
})
val, err = runVal(t.Catch, append(stack, Map(vars)), stacklevel+1)
if err.EXISTS {
return nil, err
}
}
return val, ArErr{}
}