Comments, better errors, bug fixes
This commit is contained in:
parent
7c93d76588
commit
f1bcf6ff1e
27
example.okto
27
example.okto
|
@ -1,5 +1,24 @@
|
|||
#!/home/max/code/okto/okto
|
||||
int dingus = 5
|
||||
log dingus
|
||||
dingus ++
|
||||
log dingus
|
||||
// Hello! This is some example Okto code to help you get started.
|
||||
// Log something to the console...
|
||||
log "Hello Okto!"
|
||||
log 3.14159
|
||||
log 7
|
||||
|
||||
// Log a variable to the console
|
||||
str myString = "Hello Okto String!"
|
||||
log "${myString}"
|
||||
|
||||
// Do some stuff with integers
|
||||
// All this stuff can be done with decimals too, using the "dec" keyword.
|
||||
int myInt = 5
|
||||
log $myInt
|
||||
|
||||
myInt ++
|
||||
log $myInt
|
||||
|
||||
myInt = $myInt + 4
|
||||
log $myInt
|
||||
|
||||
// Exit the program
|
||||
exit
|
||||
|
|
50
src/main.cpp
50
src/main.cpp
|
@ -13,6 +13,7 @@ enum class VarType {
|
|||
INTEGER,
|
||||
DECIMAL,
|
||||
STRING,
|
||||
BOOLEAN,
|
||||
UNKNOWN
|
||||
};
|
||||
|
||||
|
@ -43,7 +44,7 @@ private:
|
|||
map<string, Variable> variables;
|
||||
bool isVerbose = false;
|
||||
const vector<string> builtInFunctions = {
|
||||
"exit", "log", "type", "run", "verbose", "str", "dec", "int"
|
||||
"exit", "log", "type", "run", "verbose", "str", "dec", "int", "bool"
|
||||
};
|
||||
|
||||
const vector<string> operators = {
|
||||
|
@ -78,8 +79,11 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void error(const string& str) {
|
||||
void error(const string& str, int exitCode = 1) {
|
||||
cout << "\u001b[31m Error running code: " << str << "\u001b[39m" << endl;
|
||||
if (exitCode != 0) {
|
||||
exit(exitCode);
|
||||
}
|
||||
}
|
||||
|
||||
void verbose(const string& str) {
|
||||
|
@ -252,11 +256,18 @@ public:
|
|||
if (tokens.empty()) return 0;
|
||||
tokens = preProcessTokens(tokens);
|
||||
|
||||
verbose("Attempting to run function " + tokens[0].first);
|
||||
|
||||
if (tokens[0].first == "//") {
|
||||
verbose("Comment detected. Skipping line...");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (tokens[0].first == "log") {
|
||||
verbose("Log command run");
|
||||
verbose("Log function run");
|
||||
|
||||
if (tokens.size() < 2) {
|
||||
error("log requires an argument");
|
||||
error("Log requires an argument");
|
||||
return 0;
|
||||
}
|
||||
const auto& [token, type] = tokens[1];
|
||||
|
@ -264,12 +275,13 @@ public:
|
|||
cout << token << endl;
|
||||
}
|
||||
else {
|
||||
error("that type cannot be logged");
|
||||
error("Type " + type + " cannot be logged");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
else if (tokens[0].first == "exit") {
|
||||
verbose("Exit function run");
|
||||
if (tokens.size() < 2) {
|
||||
exit(0);
|
||||
} else if (tokens.size() > 1) {
|
||||
|
@ -284,8 +296,9 @@ public:
|
|||
}
|
||||
|
||||
else if (tokens[0].first == "type") {
|
||||
verbose("Type function run");
|
||||
if (tokens.size() < 2) {
|
||||
error("type requires an argument");
|
||||
error("Type requires an argument");
|
||||
return 0;
|
||||
}
|
||||
const auto& [token, type] = tokens[1];
|
||||
|
@ -294,8 +307,13 @@ public:
|
|||
}
|
||||
|
||||
else if (tokens[0].first == "run") {
|
||||
verbose("Run function run");
|
||||
if (tokens.size() < 2) {
|
||||
error("run requires an argument");
|
||||
error("Run requires an argument");
|
||||
return 0;
|
||||
}
|
||||
if (tokens[1].second != "string") {
|
||||
error("Run argument must be string");
|
||||
return 0;
|
||||
}
|
||||
string inputStr = tokens[1].first;
|
||||
|
@ -305,7 +323,7 @@ public:
|
|||
return 0;
|
||||
}
|
||||
else if (tokens[0].first == "str") {
|
||||
verbose("String command run");
|
||||
verbose("String function run");
|
||||
if (tokens.size() < 2) {
|
||||
error("variable must have a name");
|
||||
return 0;
|
||||
|
@ -339,7 +357,7 @@ public:
|
|||
}
|
||||
|
||||
else if (tokens[0].first == "int") {
|
||||
verbose("Integer command run");
|
||||
verbose("Integer function run");
|
||||
if (tokens.size() < 2) {
|
||||
error("variable must have a name");
|
||||
return 0;
|
||||
|
@ -372,7 +390,7 @@ public:
|
|||
}
|
||||
|
||||
else if (tokens[0].first == "dec") {
|
||||
verbose("Decimal command run");
|
||||
verbose("Decimal function run");
|
||||
if (tokens.size() < 2) {
|
||||
error("variable must have a name");
|
||||
return 0;
|
||||
|
@ -405,7 +423,9 @@ public:
|
|||
}
|
||||
|
||||
else if (tokens[0].first == "verbose") {
|
||||
verbose("Verbose mode disabled");
|
||||
isVerbose = !isVerbose;
|
||||
verbose("Verbose mode enabled");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -578,7 +598,7 @@ public:
|
|||
}
|
||||
|
||||
if (!tokens[0].first.empty()) {
|
||||
error("I don't know how that works");
|
||||
error(tokens[0].first + " isn't a function or variable. Check that the function or variable exists prior to running this line of code?");
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
@ -586,24 +606,24 @@ public:
|
|||
};
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
cout << "Oktolang interpreter\n";
|
||||
Interpreter interpreter;
|
||||
|
||||
if (argc > 1) {
|
||||
ifstream inFile(argv[1]);
|
||||
string line;
|
||||
while (getline(inFile, line)) {
|
||||
if (line[0] == '#') continue;
|
||||
if (interpreter.executeCommand(line) != 0) return 1;
|
||||
interpreter.executeCommand(line);
|
||||
}
|
||||
} else {
|
||||
string input;
|
||||
cout << "Oktolang interpreter\n";
|
||||
while (true) {
|
||||
cout << "> ";
|
||||
getline(cin, input);
|
||||
if (interpreter.executeCommand(input) != 0) break;
|
||||
interpreter.executeCommand(input);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user