Skip to content

Commit

Permalink
barebones statements start
Browse files Browse the repository at this point in the history
  • Loading branch information
amanuel2 committed Jun 20, 2024
1 parent 6870fdf commit 35564d7
Show file tree
Hide file tree
Showing 16 changed files with 406 additions and 308 deletions.
180 changes: 102 additions & 78 deletions compile_commands.json

Large diffs are not rendered by default.

18 changes: 8 additions & 10 deletions include/ast/eval.hh
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@

#include <exception>
#include <ast/expr.hh>
#include <ast/stmt.hh>
#include <utils/arithmetic.hh>
#include <utils/literals.hh>

using any = std::any;
using string = std::string;
Expand Down Expand Up @@ -43,7 +46,7 @@ namespace rift
};


class EvalVisitor : public rift::ast::Expr::Visitor<Token>
class EvalVisitor : public rift::ast::Expr::Visitor<Token>, public rift::ast::StmtVisitor
{
using BinaryExpr = rift::ast::Expr::Binary<Token>;
using GroupingExpr = rift::ast::Expr::Grouping<Token>;
Expand All @@ -54,20 +57,15 @@ namespace rift
virtual ~EvalVisitor();
Eval* eval;

/* expr.hh */
Token visit_binary(const BinaryExpr& expr) const override;
Token visit_grouping(const GroupingExpr& expr) const override;
Token visit_literal(const LiteralExpr& expr) const override;
Token visit_unary(const UnaryExpr& expr) const override;

/* helpers */
bool truthy(Token val) const;
bool equal(Token left, Token right) const;
bool isNumber(Token val) const;
bool isString(Token val) const;
any castNumber(Token val) const;
std::string castString(Token val) const;
std::string castNumberString(any val) const;
std::any any_arithmetic(any left, any right, Token type) const;
/* stmt.hh */
void visit_print_stmt(const StmtPrint& expr) const override;
void visit_var_stmt(const StmtVar& expr) const override;
};

/// @class EvaluatorException
Expand Down
2 changes: 1 addition & 1 deletion include/ast/expr.hh
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ namespace rift
virtual T visit_unary(const Unary<T>& expr) const = 0;
};

# pragma mark - Concrete Expressions
#pragma mark - Concrete Expressions

/// @class Binary
/// @param left The left operand
Expand Down
36 changes: 19 additions & 17 deletions include/ast/stmt.hh
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,19 @@
#pragma once

#include <ast/expr.hh>
#include <ast/parser.hh>
#include <utils/macros.hh>

namespace rift
{
namespace ast
{

class StmtVisitor;
__DEFAULT_FORWARD_NONE_VA(
StmtVisitor,
StmtPrint,
StmtVar
);

class Stmt
{
Expand All @@ -31,33 +37,29 @@ namespace rift

class StmtVisitor
{

public:
void visit_expression_stmt(const Stmt& expr) const;
void visit_print_stmt(const Stmt& expr) const;
void visit_var_stmt(const Stmt& expr) const;
virtual void visit_print_stmt(const StmtPrint& expr) const = 0;
virtual void visit_var_stmt(const StmtVar& expr) const = 0;
};

using VoidExpr = rift::ast::Expr::Expr<void>;
class Expression : public Stmt
class StmtPrint : public Stmt
{
public:
Expression(VoidExpr *expr) : expr(expr) {};
~Expression() = default;
VoidExpr *expr;

void accept(StmtVisitor &visitor) override { visitor.visit_expression_stmt(*this); };
StmtPrint(GenExpr *expr) : expr(expr) {};
~StmtPrint() = default;
GenExpr *expr;

void accept(StmtVisitor &visitor) override { visitor.visit_print_stmt(*this); };
};

class Print : public Stmt
class StmtVar : public Stmt
{
public:
Print(VoidExpr *expr) : expr(expr) {};
~Print() = default;
VoidExpr *expr;
StmtVar(GenExpr *expr) : expr(expr) {};
~StmtVar() = default;
GenExpr *expr;

void accept(StmtVisitor &visitor) override { visitor.visit_print_stmt(*this); };
void accept(StmtVisitor &visitor) override { visitor.visit_var_stmt(*this); };
};
}
}
4 changes: 2 additions & 2 deletions include/error/error.hh
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ namespace rift
[[maybe_unused]] static bool runtimeErrorOccured = false;

/// @brief Used to report an error.
void report(int line, const std::string& where, const std::string& msg, const rift::scanner::Token& token, std::exception e);
void report(int line, std::string_view where, std::string msg, const rift::scanner::Token& token, std::exception e);
/// @brief Used to report an runtime error.
void runTimeError(const std::string& msg);
void runTimeError(std::string_view msg);
}
}
2 changes: 1 addition & 1 deletion include/scanner/tokens.hh
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ namespace rift
}
bool operator==(const Token &token);

std::any getLiteral();
std::any getLiteral() const;
};

}
Expand Down
47 changes: 13 additions & 34 deletions lib/ast/stmt.cc → include/utils/arithmetic.hh
Original file line number Diff line number Diff line change
Expand Up @@ -12,42 +12,21 @@
/// ///
/////////////////////////////////////////////////////////////

#include <ast/stmt.hh>

#pragma once

#include <any>
#include <string>
#include <ast/expr.hh>
#include <ast/eval.hh>
#include <utils/macros.hh>

namespace rift::ast
{
// ****
// TODO: Have visit_expression and visit_print inside eval.cc
// which then evaluate() gets trinkled down into
// ****
void StmtVisitor::visit_expression_stmt(const Stmt& expr) const
{
auto *expression = dynamic_cast<const Expression*>(&expr);
if (expression)
{
Eval eval;
eval.evaluate(*expression->expr);
}
}

void StmtVisitor::visit_print_stmt(const Stmt& expr) const
{
auto *print = dynamic_cast<const Print*>(&expr);
if (print)
{
Eval eval;
eval.evaluate(*print->expr);
}
}
using any = std::any;
using string = std::string;

// void StmtVisitor::visit_var_stmt(const Stmt& expr) const
// {
// auto *var = dynamic_cast<const Var*>(&expr);
// if (var)
// {
// Eval eval;
// eval.evaluate(*var->expr);
// }
// }
namespace rift
{
/// @brief evaluates the given values with operation
extern any any_arithmetic(any left, any right, const Token& op);
}
42 changes: 42 additions & 0 deletions include/utils/literals.hh
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/////////////////////////////////////////////////////////////
/// ///
/// ██████╗ ██╗███████╗████████╗ ///
/// ██╔══██╗██║██╔════╝╚══██╔══╝ ///
/// ██████╔╝██║█████╗ ██║ ///
/// ██╔══██╗██║██╔══╝ ██║ ///
/// ██║ ██║██║██║ ██║ ///
/// ╚═╝ ╚═╝╚═╝╚═╝ ╚═╝ ///
/// * RIFT CORE - The official compiler for Rift. ///
/// * Copyright (c) 2024, Rift-Org ///
/// * License terms may be found in the LICENSE file. ///
/// ///
/////////////////////////////////////////////////////////////



#pragma once

#include <any>
#include <string>
#include <ast/expr.hh>

using any = std::any;
using string = std::string;

namespace rift
{
/// @brief evaluates token for truthiness
extern bool truthy(const Token& tok);
/// @brief evaluates tokens for equality
extern bool equal(const Token& tl, const Token& tr);
/// @brief parses token's literal to check if its a number
extern bool isNumber(const Token& tok);
/// @brief parses token's literal to check if its a string
extern bool isString(const Token& tok);
/// @brief casts token to a number
extern any castNumber(const Token& tok);
/// @brief casts token to a number then to a string for printing
extern std::string castNumberString(const any& val);
/// @brief casts token to a string
extern std::string castString(const Token& tok);
}
15 changes: 15 additions & 0 deletions include/utils/macros.hh
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,14 @@

#pragma mark - Forward Declarations

// for no class
#define __DEFAULT_FORWARD_NONE_1(class_name) __DEFAULT_FORWARD_NONE(class_name)
#define __DEFAULT_FORWARD_NONE_2(class1, class2) __DEFAULT_FORWARD_NONE(class1) __DEFAULT_FORWARD_NONE(class2)
#define __DEFAULT_FORWARD_NONE_3(class1, class2, class3) __DEFAULT_FORWARD_NONE(class1) __DEFAULT_FORWARD_NONE(class2) __DEFAULT_FORWARD_NONE(class3)
#define __DEFAULT_FORWARD_NONE_4(class1, class2, class3, class4) __DEFAULT_FORWARD_NONE(class1) __DEFAULT_FORWARD_NONE(class2) __DEFAULT_FORWARD_NONE(class3) __DEFAULT_FORWARD_NONE(class4)
#define __DEFAULT_FORWARD_NONE_5(class1, class2, class3, class4, class5) __DEFAULT_FORWARD_NONE(class1) __DEFAULT_FORWARD_NONE(class2) __DEFAULT_FORWARD_NONE(class3) __DEFAULT_FORWARD_NONE(class4) __DEFAULT_FORWARD_NONE(class5)
#define __DEFAULT_FORWARD_NONE_6(class1, class2, class3, class4, class5, class6) __DEFAULT_FORWARD_NONE(class1) __DEFAULT_FORWARD_NONE(class2) __DEFAULT_FORWARD_NONE(class3) __DEFAULT_FORWARD_NONE(class4) __DEFAULT_FORWARD_NONE(class5) __DEFAULT_FORWARD_NONE(class6)

// for one class
#define __DEFAULT_FORWARD_1(class_name) __DEFAULT_FORWARD(class_name)
#define __DEFAULT_FORWARD_2(class1, class2) __DEFAULT_FORWARD(class1) __DEFAULT_FORWARD(class2)
Expand All @@ -36,6 +44,9 @@

#define __SELECT_FORWARD(_1, _2, _3, _4, _5, _6, NAME, ...) NAME

#define __DEFAULT_FORWARD_NONE(class_name)\
class class_name; \

#define __DEFAULT_FORWARD(class_name) \
template <typename T> \
class class_name; \
Expand All @@ -51,6 +62,10 @@
__SELECT_FORWARD(__VA_ARGS__, __DEFAULT_FORWARD_6, __DEFAULT_FORWARD_5, \
__DEFAULT_FORWARD_4, __DEFAULT_FORWARD_3, \
__DEFAULT_FORWARD_2, __DEFAULT_FORWARD_1) (__VA_ARGS__)
#define __DEFAULT_FORWARD_NONE_VA(...) \
__SELECT_FORWARD(__VA_ARGS__, __DEFAULT_FORWARD_NONE_6, __DEFAULT_FORWARD_NONE_5, \
__DEFAULT_FORWARD_NONE_4, __DEFAULT_FORWARD_NONE_3, \
__DEFAULT_FORWARD_NONE_2, __DEFAULT_FORWARD_NONE_1) (__VA_ARGS__)
#define __DEFAULT_FORWARD_MULTI_VA(...) \
__SELECT_FORWARD(__VA_ARGS__, __DEFAULT_FORWARD_MULTI_6, __DEFAULT_FORWARD_MULTI_5, \
__DEFAULT_FORWARD_MULTI_4, __DEFAULT_FORWARD_MULTI_3, \
Expand Down
5 changes: 4 additions & 1 deletion lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,15 @@
# /////////////////////////////////////////////////////////////

set( SOURCES

# Scanner
scanner/tokens.cc
scanner/scanner.cc
reader/reader.cc

# Utils
utils/arithmetic.cc
utils/literals.cc

# AST
ast/eval.cc
ast/parser.cc
Expand Down
Loading

0 comments on commit 35564d7

Please sign in to comment.