diff --git a/docs/syntax.md b/docs/syntax.md index aa4c20f..accfdf2 100644 --- a/docs/syntax.md +++ b/docs/syntax.md @@ -232,7 +232,21 @@ Some symbols specific to this category: Defines a function. All code between `fun` and `endfun` will be included in the function. -Usage: `fun !functionname -type &var -type &var -type &var # and so on...` +Usage: `fun -type !functionname -type &var -type &var -type &var # and so on...` + +Usage note: The first type specified before the function name must be the return type. The type displayed before all vars + +#### local + +Defines a variable. The variable will be destroyed when the function is finished. + +Usage: `local &var $value` + +#### return + +Returns back to the main program (or other function that called this function). Also returns a value, which must be of the type defined when defining the function. + +Usage: `return $value` #### endfun diff --git a/src/main.cpp b/src/main.cpp index 319c312..074900e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -57,7 +57,8 @@ enum class Instructions { Setlist, Getlistat, Setlistat, Getlistsize, Listappend, Listprepend, Getstrcharat, Getstrsize, Stoi, Stod, Tostring, - Fun, Endfun, Pusharg, Call + Fun, Return, Endfun, Pusharg, Call, + Use, Extern }; /* @@ -122,6 +123,30 @@ struct List { vector val; }; +/* + Direct struct + If the program being executed makes a direct reference, it is stored in a Direct + struct. For example, if the following line was written: + stdin &myVar + The Direct struct in the instruction should look like this: + { + varName = "myVar"; + } +*/ +struct Direct { + string varName; +}; + +/* + Function struct + Contains information needed to run a Ground function. +*/ +struct Function { + int startPos; + Types returnType; + vector> args; +}; + /* ListRef struct Contains the name of a list referenced by the program. For example, if the @@ -169,20 +194,6 @@ struct ValueRef { string varName; }; -/* - Direct struct - If the program being executed makes a direct reference, it is stored in a Direct - struct. For example, if the following line was written: - stdin &myVar - The Direct struct in the instruction should look like this: - { - varName = "myVar"; - } -*/ -struct Direct { - string varName; -}; - /* Line struct If the program being executed makes a line reference, it is stored in a Line @@ -1346,6 +1357,10 @@ void exec(vector in) { } } break; + /* + end instructoin + Ends execution of the code, eith the status code provided. + */ case Instructions::End: if (l.args.size() < 1) { error("Could not find all arguments required for End inbuilt"); @@ -1360,6 +1375,20 @@ void exec(vector in) { error("First argument of end must be an int value"); } break; + case Instructions::Fun: + break; + case Instructions::Return: + break; + case Instructions::Endfun: + break; + case Instructions::Pusharg: + break; + case Instructions::Call: + break; + case Instructions::Use: + break; + case Instructions::Extern: + break; default: cout << "Still to be implemented" << endl; break; @@ -1486,6 +1515,13 @@ vector parser(vector> in) { else if (i == "stoi") newInst.inst = Instructions::Stoi; else if (i == "stod") newInst.inst = Instructions::Stod; else if (i == "tostring") newInst.inst = Instructions::Tostring; + else if (i == "fun") newInst.inst = Instructions::Fun; + else if (i == "return") newInst.inst = Instructions::Return; + else if (i == "endfun") newInst.inst = Instructions::Endfun; + else if (i == "pusharg") newInst.inst = Instructions::Pusharg; + else if (i == "call") newInst.inst = Instructions::Call; + else if (i == "use") newInst.inst = Instructions::Use; + else if (i == "extern") newInst.inst = Instructions::Extern; else error("Unexpected token: " + i); } else { Types type = getType(i);