diff --git a/src/main.cpp b/src/main.cpp index 074900e..c8d5e9b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,7 +57,7 @@ enum class Instructions { Setlist, Getlistat, Setlistat, Getlistsize, Listappend, Listprepend, Getstrcharat, Getstrsize, Stoi, Stod, Tostring, - Fun, Return, Endfun, Pusharg, Call, + Fun, Return, Endfun, Pusharg, Call, Local, Use, Extern }; @@ -76,7 +76,7 @@ enum class Instructions { See also parser function */ enum class Types { - Int, Double, String, Char, Bool, Value, Direct, Line, ListRef, Label + Int, Double, String, Char, Bool, Value, Direct, Line, ListRef, Label, Type, Function }; /* @@ -137,6 +137,13 @@ struct Direct { string varName; }; +struct TypeRef { + Types type; +}; + +struct FunctionRef { + string fnName; +}; /* Function struct Contains information needed to run a Ground function. @@ -180,6 +187,12 @@ map lists; */ map labels; +/* + functions map + Contains the positions of functions and types of their values +*/ +map functions; + /* ValueRef struct If the program being executed makes a value reference, it is stored in a ValueRef @@ -237,7 +250,7 @@ struct Line { */ struct Instruction { Instructions inst = Instructions::Empty; - vector> args; + vector> args; }; /* @@ -314,6 +327,19 @@ bool isListRef(string in) { else return false; } +bool isType(string in) { + if (in.size() >= 1 && in[0] == '-') { + string type = in.substr(1); + if (type == "string" || type == "char" || type == "bool" || type == "double" || type == "int") return true; + else return false; + } else return false; +} + +bool isFunction(string in) { + if (in.size() >= 1 && in[0] == '!') return true; + else return false; +} + /* getType function This function determines the type of a value inside a string based on the is* @@ -330,6 +356,8 @@ Types getType(string in) { if (isLine(in)) return Types::Line; if (isLabel(in)) return Types::Label; if (isListRef(in)) return Types::ListRef; + if (isType(in)) return Types::Type; + if (isFunction(in)) return Types::Function; error("Could not determine type of \"" + in + "\""); return Types::Int; } @@ -487,7 +515,7 @@ void exec(vector in) { } bool first = true; - for (variant k : l.args) { + for (variant k : l.args) { if (holds_alternative(k)) { listContents.val.push_back(get(k)); } else { @@ -1543,6 +1571,23 @@ vector parser(vector> in) { case Types::Label: error("Label should be defined as first token"); break; + case Types::Type: + { + TypeRef newType; + string type = i.substr(1); + if (type == "string") newType.type = Types::String; + else if (type == "char") newType.type = Types::Char; + else if (type == "double") newType.type = Types::Double; + else if (type == "int") newType.type = Types::Int; + else if (type == "bool") newType.type = Types::Bool; + } + break; + case Types::Function: + { + FunctionRef newFunction; + newFunction.fnName = i.substr(1); + newInst.args.push_back(newFunction); + } case Types::Line: { Line newLine;