#pragma once #ifndef CALC_PARSER_H #define CALC_PARSER_H #include "calcParser.h" #include "CalcLexer.h" #include "AST.h" #include #include #include namespace calc { class Parser : public calcParser> { public: Parser(CalcLexer lex); protected: using Value = std::unique_ptr; Token lex() override; Value error(Token current, const std::vector& expected) override; Value reduce_arguments(std::deque subparts) override; Value reduce_assign(std::deque subparts) override; Value reduce_binop(std::deque subparts) override; Value reduce_expr_simple(std::deque subparts) override; Value reduce_functioncall(std::deque subparts) override; Value reduce_functiondef(std::deque subparts) override; Value reduce_idents(std::deque subparts) override; Value reduce_opt_arguments(std::deque subparts) override; Value reduce_opt_idents(std::deque subparts) override; Value reduce_parenthesized(std::deque subparts) override; Value reduce_toplevel(std::deque subparts) override; Value reduce_umin(std::deque subparts) override; private: CalcLexer m_lex; std::map m_variables; std::map> m_functions; }; } /* calc */ #endif //CALC_PARSER_H