forked from ground/ground
Start work on functions
This commit is contained in:
@@ -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.
|
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
|
#### endfun
|
||||||
|
|
||||||
|
66
src/main.cpp
66
src/main.cpp
@@ -57,7 +57,8 @@ enum class Instructions {
|
|||||||
Setlist, Getlistat, Setlistat, Getlistsize, Listappend, Listprepend,
|
Setlist, Getlistat, Setlistat, Getlistsize, Listappend, Listprepend,
|
||||||
Getstrcharat, Getstrsize,
|
Getstrcharat, Getstrsize,
|
||||||
Stoi, Stod, Tostring,
|
Stoi, Stod, Tostring,
|
||||||
Fun, Endfun, Pusharg, Call
|
Fun, Return, Endfun, Pusharg, Call,
|
||||||
|
Use, Extern
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -122,6 +123,30 @@ struct List {
|
|||||||
vector<Literal> val;
|
vector<Literal> 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<pair<Direct, Types>> args;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ListRef struct
|
ListRef struct
|
||||||
Contains the name of a list referenced by the program. For example, if the
|
Contains the name of a list referenced by the program. For example, if the
|
||||||
@@ -169,20 +194,6 @@ struct ValueRef {
|
|||||||
string varName;
|
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
|
Line struct
|
||||||
If the program being executed makes a line reference, it is stored in a Line
|
If the program being executed makes a line reference, it is stored in a Line
|
||||||
@@ -1346,6 +1357,10 @@ void exec(vector<Instruction> in) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
/*
|
||||||
|
end instructoin
|
||||||
|
Ends execution of the code, eith the status code provided.
|
||||||
|
*/
|
||||||
case Instructions::End:
|
case Instructions::End:
|
||||||
if (l.args.size() < 1) {
|
if (l.args.size() < 1) {
|
||||||
error("Could not find all arguments required for End inbuilt");
|
error("Could not find all arguments required for End inbuilt");
|
||||||
@@ -1360,6 +1375,20 @@ void exec(vector<Instruction> in) {
|
|||||||
error("First argument of end must be an int value");
|
error("First argument of end must be an int value");
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
cout << "Still to be implemented" << endl;
|
cout << "Still to be implemented" << endl;
|
||||||
break;
|
break;
|
||||||
@@ -1486,6 +1515,13 @@ vector<Instruction> parser(vector<vector<string>> in) {
|
|||||||
else if (i == "stoi") newInst.inst = Instructions::Stoi;
|
else if (i == "stoi") newInst.inst = Instructions::Stoi;
|
||||||
else if (i == "stod") newInst.inst = Instructions::Stod;
|
else if (i == "stod") newInst.inst = Instructions::Stod;
|
||||||
else if (i == "tostring") newInst.inst = Instructions::Tostring;
|
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 error("Unexpected token: " + i);
|
||||||
} else {
|
} else {
|
||||||
Types type = getType(i);
|
Types type = getType(i);
|
||||||
|
Reference in New Issue
Block a user