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