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