sapphire/src/Parser.h

53 lines
1.1 KiB
C
Raw Normal View History

2022-06-02 16:25:01 +00:00
#pragma once
2022-06-07 16:12:43 +00:00
#include <memory>
#include "Lexer.h"
2022-06-08 15:39:51 +00:00
#include "AST/NumberNode.h"
2022-06-02 16:25:01 +00:00
class Parser
{
2022-06-08 15:39:51 +00:00
template<typename T>
struct ErrorOr
{
std::string error()
{
return m_error;
}
std::shared_ptr<T> get()
{
return m_ptr;
}
Token errtok()
{
2022-06-08 15:50:19 +00:00
return *(error_tok.get());
2022-06-08 15:39:51 +00:00
}
2022-06-08 15:49:22 +00:00
ErrorOr(T* ptr) : m_ptr(ptr), m_is_error(false) {}
2022-06-08 15:39:51 +00:00
ErrorOr(const std::string& error, const Token& error_tok) : m_error(error), m_is_error(true), error_tok(error_tok) {}
bool is_error() { return m_is_error; }
private:
bool m_is_error;
std::string m_error;
2022-06-08 15:50:19 +00:00
std::shared_ptr<Token> error_tok;
2022-06-08 15:39:51 +00:00
std::shared_ptr<T> m_ptr;
};
2022-06-02 16:25:01 +00:00
private:
2022-06-08 15:39:51 +00:00
Parser(const TokenStream& tokens);
TokenStream tokens;
ErrorOr<ExprNode> walk_expr();
ErrorOr<NumberNode> walk_number();
2022-06-08 17:17:16 +00:00
int m_index;
int saved_m_index;
void save_current_position();
void restore_current_position();
2022-06-02 16:25:01 +00:00
public:
~Parser();
2022-06-07 16:12:43 +00:00
static std::shared_ptr<Parser> new_parser(const TokenStream& tokens);
std::shared_ptr<ASTNode> parse();
2022-06-02 16:25:01 +00:00
};