Bob interpreter refactored into object

This commit is contained in:
Bobby Lucero 2023-05-20 20:51:46 -04:00
parent 650771e6fe
commit 23799125a7
3 changed files with 73 additions and 26 deletions

0
headers/AST.h Normal file
View File

View File

@ -64,12 +64,14 @@ std::vector<Token> Lexer::Tokenize(std::string source){
} }
else if(t == ' ' || t == '\t' || t == '\n') else if(t == ' ' || t == '\t' || t == '\n')
{ {
src.erase(src.begin()); src.erase(src.begin()); //ignore t
} }
else else
{ {
throw std::runtime_error("Unknown Token: '" + std::string(1, t) + "'"); throw std::runtime_error("Unknown Token: '" + std::string(1, t) + "'");
} }
} }
} }

View File

@ -3,38 +3,83 @@
#include <string> #include <string>
#include "../headers/Lexer.h" #include "../headers/Lexer.h"
#define VERSION "0.0.1"
using namespace std; using namespace std;
class Bob
{
public:
Lexer lexer;
public:
void runFile(string path)
{
ifstream file = ifstream(path);
string source = "";
if(file.is_open()){
source = string(istreambuf_iterator<char>(file), istreambuf_iterator<char>());
}
else
{
cout << "File not found" << endl;
return;
}
this->run(source);
}
void runPrompt()
{
cout << "Bob v" << VERSION << ", 2023" << endl;
for(;;)
{
string line;
cout << "-> ";
std::getline(std::cin, line);
if(std::cin.eof())
{
break;
}
this->run(line);
}
}
private:
bool hadError = false;
private:
void run(string source)
{
vector<Token> tokens = lexer.Tokenize(source);
for(Token t : tokens){
cout << "{type: " << t.type << ", value: " << t.value << "}" << endl;
}
}
};
int main(){ int main(){
string TokenTypeMappings[] = { // string TokenTypeMappings[] = {
"Identifier", // "Identifier",
"Number", // "Number",
"Equals", // "Equals",
"OpenParen", // "OpenParen",
"CloseParen", // "CloseParen",
"BinaryOperator", // "BinaryOperator",
"TestKeyword" // "TestKeyword"
}; // };
Lexer l;
string path = "source.bob"; Bob bobLang;
ifstream file = ifstream(path);
string source = ""; //bobLang.runFile("source.bob");
bobLang.runPrompt();
if(file.is_open()){
source = string(istreambuf_iterator<char>(file), istreambuf_iterator<char>());
}
else
{
cout << "File not found" << endl;
}
vector<Token> tokens = l.Tokenize(source);
for(Token t : tokens){
cout << "Type: " << TokenTypeMappings[t.type] << ", Value: " + t.value << endl;
}
return 0; return 0;
} }