aboutsummaryrefslogtreecommitdiffstats
path: root/parser.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'parser.hpp')
-rw-r--r--parser.hpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/parser.hpp b/parser.hpp
new file mode 100644
index 0000000..65f2686
--- /dev/null
+++ b/parser.hpp
@@ -0,0 +1,67 @@
+/**
+ * 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 parser.hpp
+ * @brief Source code parser to produce AST.
+ */
+
+#ifndef PARSER_HPP
+#define PARSER_HPP
+
+#include "ast.hpp"
+#include "state.hpp"
+
+#include <deque>
+#include <optional>
+#include <string>
+#include <variant>
+
+class Parser {
+public:
+ enum Error {
+ None,
+ ExpectedProcedure,
+ ExpectedIdentifier,
+ ExpectedProcedureCallClose,
+ ExpectedArgumentList,
+ UnknownIdentifier,
+ InvalidOperator,
+ InvalidOperand,
+ };
+
+ void addString(const std::string& str);
+
+ void consumeWhitespace();
+ std::optional<std::string> consumeIdentifier();
+ std::optional<std::variant<int, double>> consumeLiteralNumber();
+
+ AST::Node *parse(CompilerState&);
+
+private:
+ std::deque<char> text;
+ Error lastError = None;
+
+ AST::Node *parseExpression();
+ AST::Node *parseProcedureCall();
+ AST::Node *parseConditional();
+ AST::Node *parseDefinition();
+ AST::Node *parseAssignment();
+ AST::Node *parseLambdaExpression();
+};
+
+#endif // PARSER_HPP
+