aboutsummaryrefslogtreecommitdiffstats
path: root/ast.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'ast.hpp')
-rw-r--r--ast.hpp183
1 files changed, 183 insertions, 0 deletions
diff --git a/ast.hpp b/ast.hpp
new file mode 100644
index 0000000..0310f3f
--- /dev/null
+++ b/ast.hpp
@@ -0,0 +1,183 @@
+/**
+ * lisp-compiler: Compiles LISP using LLVM.
+ * Copyright (C) 2022 Clyne Sullivan
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * @file ast.hpp
+ * @brief Abstract Syntax Tree (AST) implementation.
+ */
+
+#ifndef AST_HPP
+#define AST_HPP
+
+#include <string>
+#include <vector>
+#include <variant>
+
+struct CompilerState;
+
+namespace llvm {
+ struct Value;
+}
+
+namespace AST {
+
+using Value = llvm::Value *;
+
+struct Node
+{
+ virtual ~Node() {};
+
+ virtual Value codegen(CompilerState&) = 0;
+ virtual std::string desc() {
+ return "Node";
+ }
+};
+
+struct Identifier : public Node
+{
+ std::string name;
+
+ virtual Value codegen(CompilerState&) final;
+
+ virtual std::string desc() final {
+ return std::string("Identifier: ") + name;
+ }
+};
+
+struct Literal : public Node
+{
+ enum Type {
+ Unknown,
+ Number,
+ } type = Unknown;
+ std::variant<int, double> value;
+
+ virtual Value codegen(CompilerState&) final;
+
+ virtual std::string desc() final {
+ std::string str ("Literal: ");
+
+ switch (type) {
+ default:
+ case Unknown:
+ str += "unknown";
+ break;
+ case Number:
+ str += std::visit([](auto&& v) { return std::to_string(v); }, value);
+ break;
+ }
+
+ return str;
+ }
+};
+
+struct ProcedureCall : public Node
+{
+ Node *callee;
+ std::vector<Node *> operands;
+
+ virtual Value codegen(CompilerState&) final;
+
+ virtual std::string desc() final {
+ std::string str ("ProcedureCall: ");
+
+ str = str + "<" + (callee ? callee->desc() : "unknown") + ">";
+ str += '(';
+ if (!operands.empty()) {
+ for (const auto& op : operands) {
+ str = str + "<" + (op ? op->desc() : "unknown") + ">";
+ str += ", ";
+ }
+
+ str.pop_back();
+ str.pop_back();
+ }
+ str += ')';
+
+ return str;
+ }
+};
+
+struct LambdaExpression : public Node
+{
+ std::vector<Identifier *> operands;
+ std::vector<Node *> body;
+
+ virtual Value codegen(CompilerState&) final;
+
+ virtual std::string desc() final {
+ return "LambdaExpression";
+ }
+};
+
+struct Conditional : public Node
+{
+ Node *cond;
+ Node *iftrue;
+ Node *iffalse;
+
+ virtual Value codegen(CompilerState&) final;
+
+ virtual std::string desc() final {
+ return "Conditional";
+ }
+};
+
+struct Definition : public Node
+{
+ Identifier *ident;
+ Node *value;
+
+ virtual Value codegen(CompilerState&) final;
+
+ virtual std::string desc() final {
+ return "Definition";
+ }
+};
+
+struct Assignment : public Node
+{
+ Identifier *ident;
+ Node *value;
+
+ virtual Value codegen(CompilerState&) final;
+
+ virtual std::string desc() final {
+ return "Assignment";
+ }
+};
+
+struct DerivedExpression : public Node
+{
+ std::string name;
+
+ virtual Value codegen(CompilerState&) final {
+ return nullptr;
+ }
+
+ virtual std::string desc() final {
+ return "DerivedExpression";
+ }
+};
+
+// MacroUse
+// MacroBlock
+// Includer
+
+}
+
+#endif // AST_HPP
+