Files
newsolstice/src/parser/parser.hpp

102 lines
2.4 KiB
C++
Raw Normal View History

2026-07-31 15:58:09 +10:00
#pragma once
2026-08-01 09:16:32 +10:00
#include <ostream>
2026-07-31 15:58:09 +10:00
#include <vector>
#include <optional>
#include "../lexer/lexer.hpp"
namespace Solstice {
enum class NodeType {
Root, Literal, Identifier,
FunctionBind, Bind, Set,
Lambda, FunctionCall,
Add, Subtract, Multiply, Divide,
Equal, NotEqual, GreaterThan, LesserThan
};
enum class Precedence {
NewLine,
Identifier,
If,
While,
Compare,
Set,
FunctionCall,
Add,
Multiply,
Other,
Root
};
extern std::unordered_map<TokenType, NodeType> tokToNodeType;
class Node {
public:
NodeType type = NodeType::Root;
std::vector<Node> children;
std::variant<Literal, std::string> data;
Node() = delete;
Node(NodeType type) : type(type) {}
Node(NodeType type, const std::vector<Node>& children) : type(type), children(children) {}
Node(const Literal& literal) : type(NodeType::Literal), data(literal) {}
Node(const std::string& id) : type(NodeType::Identifier), data(id) {}
2026-08-01 09:16:32 +10:00
std::optional<Literal> getLiteral() const;
std::optional<std::string> getIdentifier() const;
2026-07-31 15:58:09 +10:00
};
2026-08-01 09:16:32 +10:00
std::ostream& operator<<(std::ostream& stream, const Node& node);
2026-07-31 15:58:09 +10:00
class Parser {
std::vector<Token> input;
Node output{NodeType::Root};
size_t current = 0;
std::optional<Token> peek(int64_t ahead = 0);
std::optional<Token> consume();
std::optional<Node> getPreviousNode(Node& parent);
Node parseKwType();
Node parseHashCimport();
Node parseHashEffect();
Node parseAssignBind();
Node parseAssignSet();
Node parseAssignType();
Node parseActionFunction();
Node parseExpr(TokenType type);
Node parseOpenCurly();
Node parseOpenParen();
Node parseOpenSpiky();
Node parseCloseCurly();
Node parseCloseParen();
Node parseCloseSpiky();
Node parseNewLine();
Node parseLiteral();
Node parseIdentifier();
static Precedence getTokenPrecedence(const Token& token);
// Returns false when finished
std::optional<Node> parseOneNode(Precedence precedence = Precedence::Other);
public:
Parser() = delete;
Parser(const std::vector<Token>& input) : input(input) {}
const Node& parse();
};
}