/* The parser builds an abstact syntax tree from input tokens. */ #pragma once #include #include #include #include #include "nodes.hpp" #include "toker.hpp" class Parser { std::string incfile; std::set included; std::map arrayDecls; std::shared_ptr toker; std::shared_ptr main_toker; std::shared_ptr consts; std::shared_ptr structs; std::shared_ptr funcs; std::shared_ptr datas; std::shared_ptr parseStmtSeq(int scope); void parseStmtSeq(std::shared_ptr stmts, int scope); void ex(const std::string& s); void exp(const std::string& s); std::string parseIdent(); void parseChar(int c); std::string parseTypeTag(); std::shared_ptr parseVar(); std::shared_ptr parseVar(const std::string& ident, const std::string& tag); std::shared_ptr parseCall(const std::string& ident, const std::string& tag); std::shared_ptr parseIf(); std::shared_ptr parseVarDecl(int kind, bool constant); std::shared_ptr parseArrayDecl(); std::shared_ptr parseFuncDecl(); std::shared_ptr parseStructDecl(); std::shared_ptr parseExprSeq(); std::shared_ptr parseExpr(bool opt); std::shared_ptr parseExpr1(bool opt); //And, Or, Eor std::shared_ptr parseExpr2(bool opt); //<,=,>,<=,<>,>= std::shared_ptr parseExpr3(bool opt); //+,- std::shared_ptr parseExpr4(bool opt); //Lsr,Lsr,Asr std::shared_ptr parseExpr5(bool opt); //*,/,Mod std::shared_ptr parseExpr6(bool opt); //^ std::shared_ptr parseUniExpr(bool opt); //+,-,Not,~ std::shared_ptr parsePrimary(bool opt); public: Parser(Toker& t); ~Parser(); std::shared_ptr parse(std::string const& main); };