basic version of catch

This commit is contained in:
2025-09-21 08:55:50 +10:00
parent 063cdc92e3
commit 28faf6142c

View File

@@ -363,6 +363,12 @@ GroundValue literalToGroundValue(const Literal& lit) {
return gv; return gv;
} }
/*
catches stackmap
This stores all catches in a scope, to catch errors before they happen.
*/
stack<map<string, Direct>> catches;
Literal groundValueToLiteral(const GroundValue& gv) { Literal groundValueToLiteral(const GroundValue& gv) {
Literal lit; Literal lit;
switch (gv.type) { switch (gv.type) {
@@ -385,14 +391,30 @@ Literal groundValueToLiteral(const GroundValue& gv) {
return lit; return lit;
} }
// Forward declaration of setVal for error function
void setVal(string varName, Literal value);
/* /*
error function error function
Takes a string (which is a debug message) and prints it to the console, letting the Takes a string (which is a debug message) and prints it to the console, letting the
user know what went wrong with the program. user know what went wrong with the program.
*/ */
void error(string in, string errCode = "syntaxError", int exitc = 1) { int error(string in, string errCode = "syntaxError", int exitc = 1) {
int pops = 0;
while (catches.size() > 0) {
if (catches.top().find(errCode) != catches.top().end()) {
Literal tmpLit;
tmpLit.val = false;
setVal(catches.top()[errCode].varName, tmpLit);
return pops;
} else {
catches.pop();
pops ++;
}
}
cout << "\033[31m" + errCode + ": \033[39m" << in << endl; cout << "\033[31m" + errCode + ": \033[39m" << in << endl;
exit(exitc); exit(exitc);
return pops;
} }
/* /*
@@ -590,6 +612,10 @@ void preProcessLabels(vector<Instruction> instructions) {
function for the program. function for the program.
*/ */
Literal exec(vector<Instruction> in, bool executingFunction) { Literal exec(vector<Instruction> in, bool executingFunction) {
{
map<string, Direct> tmp;
catches.push(tmp);
}
for (int i = 0; i < in.size(); i++) { for (int i = 0; i < in.size(); i++) {
Instruction l = in[i]; Instruction l = in[i];
if (processingFunction) { if (processingFunction) {
@@ -930,11 +956,33 @@ Literal exec(vector<Instruction> in, bool executingFunction) {
if (l.args.size() < 2) { if (l.args.size() < 2) {
error("Could not find all arguments for Catch inbuilt"); error("Could not find all arguments for Catch inbuilt");
} }
{
string errCode;
Direct varRef;
if (holds_alternative<Literal>(l.args[0])) { if (holds_alternative<Literal>(l.args[0])) {
if (holds_alternative<string>(get<Literal>(l.args[0]).val)) { if (holds_alternative<string>(get<Literal>(l.args[0]).val)) {
errCode = get<string>(get<Literal>(l.args[0]).val);
} else {
error("First argument of catch must be a string literal");
}
} else {
error("First argument of catch must be a string literal");
}
if (holds_alternative<Direct>(l.args[1])) {
varRef = get<Direct>(l.args[1]);
} else {
error("Second argument of catch must be a direct reference");
} }
catches.top()[errCode] = varRef;
Literal tmpLit;
tmpLit.val = true;
setVal(varRef.varName, tmpLit);
} }
break;
/* /*
set instruction set instruction
This instruction sets a variable to a provided value. This instruction sets a variable to a provided value.