#ifndef EXPRESSIONS_H
#define EXPRESSIONS_H
-#include "token.hpp"
+#include "tokens/token.hpp"
-#include "token.hpp"
-#include "visitor.hpp"
-#include <string>
+#include "../interpretation/visitor.hpp"
#include <memory>
#include <vector>
struct Expr {
- std::string file;
+ const char *file;
int line, column;
- Expr(int line, int column, const std::string &filename)
+ Expr(int line, int column, const char *filename)
: line(line), column(column), file(filename) {}
virtual ~Expr() {};
std::unique_ptr<Expr> right;
std::shared_ptr<const Token> op;
- BinaryExpr(int line, int column, const std::string &file,
+ BinaryExpr(int line, int column, const char *file,
std::unique_ptr<Expr> &left, std::unique_ptr<Expr> &right,
std::shared_ptr<const Token> &op)
: left(std::move(left)), right(std::move(right)), op(op),
Expr(line, column, file) {}
- BinaryExpr(int line, int column, const std::string &file,
+ BinaryExpr(int line, int column, const char *file,
std::unique_ptr<Expr> &left, std::unique_ptr<Expr> &&right,
std::shared_ptr<const Token> &op)
: left(std::move(left)), right(std::move(right)), op(op),
};
struct BreakExpr : public Expr {
- BreakExpr(int line, int column, const std::string &file)
+ BreakExpr(int line, int column, const char *file)
: Expr(line, column, file) {}
Value accept(Expression::Visitor *visitor) {
};
struct ContinueExpr : public Expr {
- ContinueExpr(int line, int column, const std::string &file)
+ ContinueExpr(int line, int column, const char *file)
: Expr(line, column, file) {}
Value accept(Expression::Visitor *visitor) {
return visitor->visitContinueExpr(this);
std::unique_ptr<Expr> right;
std::shared_ptr<const Token> op;
- UnaryExpr(int line, int column, const std::string &file,
- std::unique_ptr<Expr> right, std::shared_ptr<const Token> &op)
+ UnaryExpr(int line, int column, const char *file, std::unique_ptr<Expr> right,
+ std::shared_ptr<const Token> &op)
: right(std::move(right)), op(op), Expr(line, column, file) {}
Value accept(Expression::Visitor *visitor) {
return visitor->visitUnaryExpr(this);
struct LiteralExpr : public Expr {
std::shared_ptr<const Token> token;
- LiteralExpr(int line, int column, const std::string &file,
+ LiteralExpr(int line, int column, const char *file,
std::shared_ptr<const Token> &literal)
: token(literal), Expr(line, column, file) {}
- LiteralExpr(int line, int column, const std::string &file,
+ LiteralExpr(int line, int column, const char *file,
std::shared_ptr<const Token> &&literal)
: token(literal), Expr(line, column, file) {}
Value accept(Expression::Visitor *visitor) {
struct SuperExpr : public Expr {
std::shared_ptr<const Token> field;
- SuperExpr(int line, int column, const std::string &file,
+ SuperExpr(int line, int column, const char *file,
std::shared_ptr<const Token> &field)
: field(field), Expr(line, column, file) {}
Value accept(Expression::Visitor *visitor) {
public:
std::shared_ptr<const Token> keyword;
- ThisExpr(int line, int column, const std::string &file,
+ ThisExpr(int line, int column, const char *file,
std::shared_ptr<const Token> &keyword)
: keyword(keyword), Expr(line, column, file) {}
struct GroupingExpr : public Expr {
std::unique_ptr<Expr> expr;
- GroupingExpr(int line, int column, const std::string &file,
+ GroupingExpr(int line, int column, const char *file,
std::unique_ptr<Expr> &expr)
: expr(std::move(expr)), Expr(line, column, file) {}
Value accept(Expression::Visitor *visitor) {
struct VariableExpr : public Expr {
std::shared_ptr<const Token> variable;
- VariableExpr(int line, int column, const std::string &file,
+ VariableExpr(int line, int column, const char *file,
std::shared_ptr<const Token> &variable)
: variable(variable), Expr(line, column, file) {}
Value accept(Expression::Visitor *visitor) {
std::shared_ptr<const Token> variable;
std::unique_ptr<Expr> value;
- AssignExpr(int line, int column, const std::string &file,
+ AssignExpr(int line, int column, const char *file,
std::shared_ptr<const Token> &variable,
std::unique_ptr<Expr> &value)
: variable(variable), value(std::move(value)), Expr(line, column, file) {}
std::unique_ptr<Expr> callee;
std::vector<std::unique_ptr<Expr>> args;
- FnCallExpr(int line, int column, const std::string &file,
+ FnCallExpr(int line, int column, const char *file,
std::unique_ptr<Expr> &callee,
std::vector<std::unique_ptr<Expr>> &args)
: callee(std::move(callee)), args(std::move(args)),
std::unique_ptr<Expr> trueBranch;
std::unique_ptr<Expr> falseBranch;
- TernaryExpr(int line, int column, const std::string &file,
+ TernaryExpr(int line, int column, const char *file,
std::unique_ptr<Expr> &condition,
std::unique_ptr<Expr> &trueBranch,
std::unique_ptr<Expr> &&falseBranch)
std::shared_ptr<const Token> field;
std::unique_ptr<Expr> instance;
- GetFieldExpr(int line, int column, const std::string &file,
+ GetFieldExpr(int line, int column, const char *file,
std::unique_ptr<Expr> &instance,
std::shared_ptr<const Token> &field)
: instance(std::move(instance)), field(field), Expr(line, column, file) {}
std::unique_ptr<Expr> value;
std::unique_ptr<Expr> instance;
- SetFieldExpr(int line, int column, const std::string &file,
+ SetFieldExpr(int line, int column, const char *file,
std::unique_ptr<Expr> &instance,
std::shared_ptr<const Token> &field,
std::unique_ptr<Expr> &value)
#include "lexer.hpp"
-#include "token.hpp"
-#include "token_type.hpp"
#include <cstdlib>
#include <cstring>
#ifndef LEXER_H
#define LEXER_H
-#include "token.hpp"
-#include "token_type.hpp"
+#include "tokens/token.hpp"
+#include "tokens/token_type.hpp"
#include <cstdint>
#include <fstream>
#include "parser.hpp"
#include "syntax_error.hpp"
-#include "token_type.hpp"
#include <fcntl.h>
#include <fstream>
#include "expressions.hpp"
#include "lexer.hpp"
#include "statements.hpp"
-#include "syntax_error.hpp"
-#include "token_type.hpp"
+#include "tokens/token_type.hpp"
#include <fstream>
#include <memory>
public:
Parser(std::ifstream &file, const char *filename)
: source(Lexer::Source(file, filename)),
- current(Lexer::getNextToken(this->source)), previous(current) {
+ current(Lexer::getNextToken(this->source)), previous(current),
+ hadError(false) {
importedFiles.insert(filename);
}
Parser(std::ifstream &file, const char *filename,
std::unordered_set<std::string> &importedFiles)
: importedFiles(importedFiles), source(Lexer::Source(file, filename)),
- current(Lexer::getNextToken(this->source)), previous(current) {}
+ current(Lexer::getNextToken(this->source)), previous(current),
+ hadError(false) {}
std::vector<std::unique_ptr<Stmt>> parse();
#include <memory>
struct Stmt {
- std::string filename;
+ const char *filename;
int line, column;
- Stmt(int line, int column, const std::string &filename)
+ Stmt(int line, int column, const char *filename)
: line(line), column(column), filename(filename) {}
virtual ~Stmt() {}
std::vector<std::shared_ptr<const Token>> args;
std::vector<std::unique_ptr<Stmt>> body;
- FnStmt(int line, int column, const std::string &file,
+ FnStmt(int line, int column, const char *file,
std::shared_ptr<const Token> &name,
std::vector<std::shared_ptr<const Token>> &args,
std::vector<std::unique_ptr<Stmt>> &&body)
std::shared_ptr<const Token> name;
std::unique_ptr<Expr> value;
- VarStmt(int line, int column, const std::string &file,
+ VarStmt(int line, int column, const char *file,
std::shared_ptr<const Token> &name, std::unique_ptr<Expr> &value)
: name(name), value(std::move(value)), Stmt(line, column, file) {}
std::unique_ptr<VariableExpr> superclass;
std::vector<std::unique_ptr<Stmt>> body;
- ClassStmt(int line, int column, const std::string &file,
+ ClassStmt(int line, int column, const char *file,
std::shared_ptr<const Token> &name,
std::unique_ptr<VariableExpr> &superclass,
std::vector<std::unique_ptr<Stmt>> &&body)
std::unique_ptr<Stmt> trueBranch;
std::unique_ptr<Stmt> falseBranch;
- IfStmt(int line, int column, const std::string &file,
+ IfStmt(int line, int column, const char *file,
std::unique_ptr<Expr> &condition, std::unique_ptr<Stmt> &trueBranch,
std::unique_ptr<Stmt> &falseBranch)
: condition(std::move(condition)), trueBranch(std::move(trueBranch)),
std::unique_ptr<Expr> condition;
std::unique_ptr<Stmt> body;
- WhileStmt(int line, int column, const std::string &file,
- std::unique_ptr<Expr> &cond, std::unique_ptr<Stmt> &body)
+ WhileStmt(int line, int column, const char *file, std::unique_ptr<Expr> &cond,
+ std::unique_ptr<Stmt> &body)
: condition(std::move(cond)), body(std::move(body)),
Stmt(line, column, file) {}
- WhileStmt(int line, int column, const std::string &file,
- std::unique_ptr<Expr> &cond, std::unique_ptr<Stmt> &&body)
+ WhileStmt(int line, int column, const char *file, std::unique_ptr<Expr> &cond,
+ std::unique_ptr<Stmt> &&body)
: condition(std::move(cond)), body(std::move(body)),
Stmt(line, column, file) {}
std::unique_ptr<Expr> increment, condition;
std::unique_ptr<Stmt> initializer, body;
- ForStmt(int line, int column, const std::string &file,
+ ForStmt(int line, int column, const char *file,
std::unique_ptr<Stmt> &initializer, std::unique_ptr<Expr> &cond,
std::unique_ptr<Expr> &increment, std::unique_ptr<Stmt> &body)
: initializer(std::move(initializer)), condition(std::move(cond)),
struct ScopedStmt : public Stmt {
std::vector<std::unique_ptr<Stmt>> body;
- ScopedStmt(int line, int column, const std::string &file,
+ ScopedStmt(int line, int column, const char *file,
std::vector<std::unique_ptr<Stmt>> &&body)
: body(std::move(body)), Stmt(line, column, file) {}
void accept(Statement::Visitor *visitor) { visitor->visitScopedStmt(this); }
struct ExprStmt : public Stmt {
std::unique_ptr<Expr> expr;
- ExprStmt(int line, int column, const std::string &file,
- std::unique_ptr<Expr> &&expr)
+ ExprStmt(int line, int column, const char *file, std::unique_ptr<Expr> &&expr)
: expr(std::move(expr)), Stmt(line, column, file) {}
void accept(Statement::Visitor *visitor) { visitor->visitExprStmt(this); }
struct ReturnStmt : public Stmt {
std::unique_ptr<Expr> value;
- ReturnStmt(int line, int column, const std::string &file,
+ ReturnStmt(int line, int column, const char *file,
std::unique_ptr<Expr> &value)
: value(std::move(value)), Stmt(line, column, file) {}
#include "expressions.hpp"
#include "statements.hpp"
-#include "token.hpp"
+#include "tokens/token.hpp"
#include <string>
+++ /dev/null
-#include "LBPLClass.hpp"
-#include "LBPLInstance.hpp"
-#include "interpreter.hpp"
-
-Value LBPLClass::call(Interpreter *interpreter, std::vector<Value> &args) {
- auto instance = std::make_shared<LBPLInstance>(this);
-
- LBPLFunc *init = findMethod("init");
- if (init) {
- init->bind(instance);
- init->call(interpreter, args);
- }
-
- return instance;
-}
-
-LBPLFunc *LBPLClass::findMethod(const std::string &name) {
- if (methods.contains(name)) {
- return methods.find(name)->second;
- } else if (superclass) {
- return superclass->findMethod(name);
- }
-
- return nullptr;
-}
-
-int LBPLClass::arity() {
- auto it = methods.find("init");
- return it == methods.end() ? 0 : it->second->arity();
-}
+++ /dev/null
-#include "ast_printer.hpp"
-#include "statements.hpp"
-
-#include <iostream>
-
-void AST_Printer::printLocation(Stmt *stmt) {
- std::cout << "Location: " << stmt->filename << " [Line: " << stmt->line
- << ", Column: " << stmt->column << "]\n";
-}
-
-void AST_Printer::visitFnStmt(FnStmt *stmt) {
- printLocation(stmt);
- std::cout << "(";
- std::cout << "fn `" + stmt->name->lexeme + "` args[";
-
- for (auto &&arg : stmt->args) {
- std::cout << "(" << arg->lexeme << ")";
- }
-
- std::cout << "] ` body {\n";
- for (auto &&bodyStmt : stmt->body) {
- bodyStmt->accept(this);
- }
-
- std::cout << "})\n";
-}
-
-void AST_Printer::visitVarStmt(VarStmt *var) {
- printLocation(var);
- std::cout << "(var " << var->name->lexeme << " value `";
-
- if (var->value) {
- var->value->accept(this);
- } else {
- std::cout << "nil";
- }
- std::cout << "`)\n";
-}
-
-void AST_Printer::visitClassStmt(ClassStmt *stmt) {
- printLocation(stmt);
- std::cout << "(class `" << stmt->name->lexeme << "` implements(";
- if (stmt->superclass) {
- stmt->superclass->accept(this);
- }
- std::cout << ") body {\n";
- for (auto &&fn : stmt->body) {
- fn->accept(this);
- }
- std::cout << "})\n";
-}
-
-void AST_Printer::visitIfStmt(IfStmt *fn) {
- printLocation(fn);
- std::cout << "(condition `";
- fn->condition->accept(this);
- std::cout << "` if true ";
- fn->trueBranch->accept(this);
- std::cout << " if false ";
- if (fn->falseBranch) {
- fn->falseBranch->accept(this);
- }
- std::cout << ")\n";
-}
-
-void AST_Printer::visitWhileStmt(WhileStmt *stmt) {
- printLocation(stmt);
- std::cout << "(while ";
- stmt->condition->accept(this);
- std::cout << " do ";
- stmt->body->accept(this);
- std::cout << ")\n";
-}
-
-void AST_Printer::visitForStmt(ForStmt *stmt) {
- printLocation(stmt);
- std::cout << "(for ";
- if (stmt->initializer) {
- stmt->initializer->accept(this);
- }
- std::cout << " while ";
- if (stmt->condition) {
- stmt->condition->accept(this);
- } else {
- std::cout << "yes";
- }
- std::cout << " do ";
- stmt->body->accept(this);
- std::cout << " then ";
- if (stmt->increment) {
- stmt->increment->accept(this);
- }
- std::cout << ")\n";
-}
-
-void AST_Printer::visitScopedStmt(ScopedStmt *stmt) {
- printLocation(stmt);
- std::cout << "{";
- for (auto &&stmt : stmt->body) {
- stmt->accept(this);
- }
- std::cout << "}";
-}
-
-void AST_Printer::visitExprStmt(ExprStmt *stmt) {
- printLocation(stmt);
- stmt->expr->accept(this);
- std::cout << "\n";
-}
-
-void AST_Printer::visitReturnStmt(ReturnStmt *stmt) {
- printLocation(stmt);
- std::cout << "(return ";
- if (stmt->value) {
- stmt->value->accept(this);
- } else {
- std::cout << "void";
- }
- std::cout << ")\n";
-}
-
-Value AST_Printer::visitBinaryExpr(BinaryExpr *expr) {
- std::cout << "(" << expr->op->lexeme << " ";
- expr->left->accept(this);
- std::cout << " ";
- expr->right->accept(this);
- std::cout << ")";
- return nullptr;
-}
-
-Value AST_Printer::visitBreakExpr(BreakExpr *expr) {
- std::cout << "(breaking)";
- return nullptr;
-}
-
-Value AST_Printer::visitContinueExpr(ContinueExpr *expr) {
- std::cout << "(continuing)\n";
- return nullptr;
-}
-
-Value AST_Printer::visitUnaryExpr(UnaryExpr *expr) {
- std::cout << "(" << expr->op->lexeme << " ";
- expr->right->accept(this);
- std::cout << ")";
- return nullptr;
-}
-
-Value AST_Printer::visitLiteralExpr(LiteralExpr *expr) {
- std::cout << expr->token->lexeme;
- return nullptr;
-}
-
-Value AST_Printer::visitSuperExpr(SuperExpr *expr) {
- std::cout << "(super)";
- return nullptr;
-}
-
-Value AST_Printer::visitThisExpr(ThisExpr *expr) {
- std::cout << "(this)";
- return nullptr;
-}
-
-Value AST_Printer::visitAssignExpr(AssignExpr *expr) {
- std::cout << "(assign ";
- expr->value->accept(this);
- std::cout << " to " << expr->variable->lexeme << ")";
- return nullptr;
-}
-
-Value AST_Printer::visitGroupExpr(GroupingExpr *expr) {
- expr->expr->accept(this);
- return nullptr;
-}
-
-Value AST_Printer::visitCallExpr(FnCallExpr *expr) {
- std::cout << "(calling `";
- expr->callee->accept(this);
- std::cout << "` with parameters [";
-
- for (auto &&arg : expr->args) {
- arg->accept(this);
- }
-
- std::cout << "])";
- return nullptr;
-}
-
-Value AST_Printer::visitGetFieldExpr(GetFieldExpr *expr) {
- std::cout << "get field `" << expr->field->lexeme << "` from ";
- expr->instance->accept(this);
- return nullptr;
-}
-
-Value AST_Printer::visitSetFieldExpr(SetFieldExpr *expr) {
- std::cout << "setting field `" << expr->field->lexeme << "` from ";
- expr->instance->accept(this);
- std::cout << " to ";
- expr->value->accept(this);
- return nullptr;
-}
-
-Value AST_Printer::visitTernaryExpr(TernaryExpr *expr) {
- std::cout << "condition `";
- expr->condition->accept(this);
- std::cout << "` if true ";
- expr->trueBranch->accept(this);
- std::cout << " if false ";
- expr->falseBranch->accept(this);
- return nullptr;
-}
-
-Value AST_Printer::visitVarExpr(VariableExpr *expr) {
- std::cout << expr->variable->lexeme;
- return nullptr;
-}
+++ /dev/null
-#ifndef AST_PRINTER_H
-#define AST_PRINTER_H
-
-#include "tree_nodes.hpp"
-#include "visitor.hpp"
-
-class AST_Printer : public Statement::Visitor, public Expression::Visitor {
- void printLocation(Stmt *);
-
- void visitFnStmt(FnStmt *) override;
- void visitVarStmt(VarStmt *) override;
- void visitClassStmt(ClassStmt *) override;
- void visitIfStmt(IfStmt *) override;
- void visitWhileStmt(WhileStmt *) override;
- void visitForStmt(ForStmt *) override;
- void visitScopedStmt(ScopedStmt *) override;
- void visitExprStmt(ExprStmt *) override;
- void visitReturnStmt(ReturnStmt *) override;
-
- Value visitBinaryExpr(BinaryExpr *) override;
- Value visitBreakExpr(BreakExpr *) override;
- Value visitContinueExpr(ContinueExpr *) override;
- Value visitUnaryExpr(UnaryExpr *) override;
- Value visitLiteralExpr(LiteralExpr *) override;
- Value visitGroupExpr(GroupingExpr *) override;
- Value visitSuperExpr(SuperExpr *) override;
- Value visitThisExpr(ThisExpr *) override;
- Value visitCallExpr(FnCallExpr *) override;
- Value visitGetFieldExpr(GetFieldExpr *) override;
- Value visitSetFieldExpr(SetFieldExpr *) override;
- Value visitTernaryExpr(TernaryExpr *) override;
- Value visitVarExpr(VariableExpr *) override;
- Value visitAssignExpr(AssignExpr *) override;
-};
-
-#endif
+++ /dev/null
-#ifndef COMMON_H
-#define COMMON_H
-
-#include "token.hpp"
-#include "token_type.hpp"
-
-#include <string>
-#include <iostream>
-
-#endif
#ifndef BUILTIN_METHODS_H
#define BUILTIN_METHODS_H
-#include "LBPLCallable.hpp"
+#include "types/LBPLCallable.hpp"
#include <chrono>
#include <iostream>
#include "environment.hpp"
-#include "LBPLTypes.hpp"
+#include "types/LBPLTypes.hpp"
#include "runtime_error.hpp"
#include <iostream>
#ifndef ENVIRONMENT_H
#define ENVIRONMENT_H
-#include "LBPLTypes.hpp"
-#include "token.hpp"
+#include "../AST-generation/tokens/token.hpp"
+#include "types/LBPLTypes.hpp"
#include <map>
#include <memory>
#include "interpreter.hpp"
-#include "LBPLClass.hpp"
-#include "LBPLFunction.hpp"
-#include "LBPLInstance.hpp"
-#include "LBPLTypes.hpp"
+#include "types/LBPLClass.hpp"
+#include "types/LBPLFunction.hpp"
+#include "types/LBPLInstance.hpp"
+#include "types/LBPLTypes.hpp"
#include "runtime_error.hpp"
#include <cstddef>
#ifndef INTERPRETER_H
#define INTERPRETER_H
-#include "LBPLTypes.hpp"
#include "builtin_methods.hpp"
#include "environment.hpp"
+#include "types/LBPLTypes.hpp"
#include "visitor.hpp"
#include <map>
bool isTruthy(const Value &);
bool isTruthy(Value &&);
- Value performBinaryOperation(std::shared_ptr<const Token> &,
- const Value &, const Value &);
+ Value performBinaryOperation(std::shared_ptr<const Token> &, const Value &,
+ const Value &);
void visitFnStmt(FnStmt *) override;
void visitVarStmt(VarStmt *) override;
#include "resolver.hpp"
-#include "syntax_error.hpp"
+#include "../AST-generation/syntax_error.hpp"
#include <string_view>
void Resolver::resolve(std::vector<std::unique_ptr<Stmt>> &stmts) {
void Resolver::resolveLocal(Expr *expr, const Token *name) {
for (int i = scopes.size() - 1; i >= 0; i--) {
if (scopes[i].contains(std::get<const char *>(name->lexeme))) {
- interpreter->resolve(expr, scopes.size() - 1 - i);
+ interpreter.resolve(expr, scopes.size() - 1 - i);
return;
}
}
void Resolver::resolveLocal(Expr *expr, const std::string &name) {
for (int i = scopes.size() - 1; i >= 0; i--) {
if (scopes[i].contains(name)) {
- interpreter->resolve(expr, scopes.size() - 1 - i);
+ interpreter.resolve(expr, scopes.size() - 1 - i);
return;
}
}
#ifndef RESOLVER_H
#define RESOLVER_H
+#include "../AST-generation/statements.hpp"
#include "interpreter.hpp"
-#include "statements.hpp"
#include "visitor.hpp"
#include <map>
class Resolver : Statement::Visitor, Expression::Visitor {
private:
- Interpreter *interpreter;
+ Interpreter &interpreter;
FunctionType::Type currentFn;
ClassType::Type currentClass;
int loops;
Value visitAssignExpr(AssignExpr *) override;
public:
- Resolver(Interpreter *interpreter)
+ Resolver(Interpreter &interpreter)
: interpreter(interpreter), currentFn(FunctionType::None),
- currentClass(ClassType::None), loops(0), scopes() {}
+ currentClass(ClassType::None), loops(0), scopes(), hadError(false) {}
void resolve(std::vector<std::unique_ptr<Stmt>> &);
};
#ifndef RUNTIME_ERROR_H
#define RUNTIME_ERROR_H
-#include "expressions.hpp"
-#include "statements.hpp"
-#include "token.hpp"
+#include "../AST-generation/expressions.hpp"
+#include "../AST-generation/statements.hpp"
#include <string>
--- /dev/null
+#include "LBPLClass.hpp"
+#include "../interpreter.hpp"
+#include "LBPLInstance.hpp"
+
+Value LBPLClass::call(Interpreter *interpreter, std::vector<Value> &args) {
+ auto instance = std::make_shared<LBPLInstance>(this);
+
+ LBPLFunc *init = findMethod("init");
+ if (init) {
+ init->bind(instance);
+ init->call(interpreter, args);
+ }
+
+ return instance;
+}
+
+LBPLFunc *LBPLClass::findMethod(const std::string &name) {
+ if (methods.contains(name)) {
+ return methods.find(name)->second;
+ } else if (superclass) {
+ return superclass->findMethod(name);
+ }
+
+ return nullptr;
+}
+
+int LBPLClass::arity() {
+ auto it = methods.find("init");
+ return it == methods.end() ? 0 : it->second->arity();
+}
#include "LBPLFunction.hpp"
-#include "interpreter.hpp"
+#include "../interpreter.hpp"
void LBPLFunc::bind(std::shared_ptr<LBPLInstance> &&instance) {
closureEnv = std::make_shared<Environment>();
#ifndef LBPL_FUNCTION_H
#define LBPL_FUNCTION_H
+#include "../../AST-generation/statements.hpp"
+#include "../environment.hpp"
#include "LBPLCallable.hpp"
-#include "environment.hpp"
-#include "statements.hpp"
#include <memory>
#include "LBPLInstance.hpp"
-#include "runtime_error.hpp"
+#include "../runtime_error.hpp"
#include <string>
Value LBPLInstance::get(const Token *name) {
#ifndef VISITOR_H
#define VISITOR_H
-#include "LBPLTypes.hpp"
+#include "types/LBPLTypes.hpp"
#include "tree_nodes.hpp"
namespace Statement {
#include <fstream>
#include <iostream>
-#include "parser.hpp"
-#include "interpreter.hpp"
-#include "resolver.hpp"
+#include "AST-generation/parser.hpp"
+#include "interpretation/interpreter.hpp"
+#include "interpretation/resolver.hpp"
int main(const int argc, const char **argv) {
if (argc < 2) {
std::cerr << "\033[1;31mNot enough arguemnts.\tUsage: lbpl [script]"
<< std::endl;
- return 1;
+ return -1;
}
std::ifstream file(argv[1]);
if (!file.good()) {
std::cerr << "I/O error: couldn't load file `" << argv[1] << "`.";
- return 1;
+ return -1;
}
- Parser *parser = new Parser(file, argv[1]);
- std::vector<std::unique_ptr<Stmt>> statements = parser->parse();
+ Parser parser(file, argv[1]);
+ std::vector<std::unique_ptr<Stmt>> statements = parser.parse();
- // AST_Printer test;
- // for (auto &&stmt : statements) {
- // stmt->accept(&test);
- // }
+ if (!parser.hadError) {
+ Interpreter interpreter;
+ Resolver resolver(interpreter);
+ resolver.resolve(statements);
- if (!parser->hadError) {
- Interpreter *interpreter = new Interpreter();
- Resolver *resolver = new Resolver(interpreter);
- resolver->resolve(statements);
-
- if (!resolver->hadError) {
- interpreter->interpret(statements);
+ if (!resolver.hadError) {
+ interpreter.interpret(statements);
+ return 0;
}
-
- delete resolver;
- delete interpreter;
}
- delete parser;
+ return -1;
}
+++ /dev/null
-#ifndef MAIN_H
-#define MAIN_H
-
-#include "common.h"
-#include "interpreter.h"
-#include "parser.h"
-#include "resolver.h"
-#include "statements.h"
-
-#include "ast_printer.h"
-
-#include <fstream>
-#include <iomanip>
-#include <iostream>
-
-std::string readFile(const char *);
-
-#endif