mirror of
https://github.com/Open-Argon/argon-v3.git
synced 2025-12-06 00:46:07 +00:00
77 lines
2.1 KiB
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{}
|
|
}
|