#include #include #include #include #include "token.hpp" #include "expr.hpp" #include "stmt.hpp" namespace dsp { struct parse_error_t : std::runtime_error { parse_error_t(const std::string& msg) : std::runtime_error(msg) { } }; struct parser_t { int current_ix = 0; std::vector tokens; parser_t(const std::vector& tokens) : tokens(tokens) { } static parse_error_t error(const token_t& token, const std::string message); bool at_end_p(); const token_t& previous(); const token_t& peek(); const token_t& peek(int n); const token_t& advance(); bool check(enum token_t::type_t token_type); bool match(enum token_t::type_t token_type); template bool match(enum token_t::type_t token_type, Targs... args); token_t consume(enum token_t::type_t token_type, const std::string error_message); expr_t * immediate(); expr_t * expression(); expr_t * term(); expr_t * factor(); expr_t * unary(); expr_t * shift(); expr_t * andl(); expr_t * orl(); expr_t * primary(); std::optional alu(); bool xyd1_src(); std::optional d1_dest(); std::optional xyd1_bus(); std::optional op(); load::dest_t load_dest(); load::cond_t load_cond(); std::optional load(); dma::src_t dma_src(); dma::dst_t dma_dst(); std::optional dma_length_ram(); std::optional dma(); std::optional jump_cond(); std::optional jump(); std::optional loop(); std::optional end(); std::optional instruction(); std::optional statement(); }; }