#pragma once #include "cps/Lexer.h" #include "cps/AST.h" #include "cps/TypeAST.h" #include "cps/FunctionAST.h" #include #include #include #include #include #include #include #include namespace cps { class Parser { Lexer &Lex; int CurTok = tok_eof; bool StartsLine = true; bool ParsingCaseLabel = false; std::vector CaseBodyDepths; unsigned NumErrors = 0; unsigned BlockDepth = 0; // ParseBlock nesting; 1 = top level std::map BinopPrecedence; std::set TypeNames = { "INTEGER", "REAL", "BOOLEAN", "STRING", "CHAR", "VOID", "C_INT", "C_CHAR", "C_STRING", "C_DOUBLE" }; int getNextToken(); int GetTokPrecedence(); std::unique_ptr ParseExpression(); std::unique_ptr ParseUnary(); std::unique_ptr ParsePrimary(); std::unique_ptr ParseBinOpRHS(int ExprPrec, std::unique_ptr LHS); std::unique_ptr ParseNumberExpr(); std::unique_ptr ParseIdentifierExpr(); std::unique_ptr ParseParenExpr(); std::string ParseTypeName(bool AllowVoid = false); std::unique_ptr ParseStatement(); std::unique_ptr ParseStatementImpl(); std::vector> ParseBlock(std::initializer_list Terminators, bool CaseBody = false); bool isCaseLabel(); bool atCaseBoundary(); std::unique_ptr ParseCaseStmt(); std::optional>> ParseExprList(char CloseDelim, bool AllowEmpty); void syncToStatementStart(); std::unique_ptr ParseIfStmt(); std::unique_ptr ParseTryStmt(); std::unique_ptr ParseWhileStmt(); std::unique_ptr ParseRepeatStmt(); std::unique_ptr ParseForStmt(); std::unique_ptr ParseDeclare(); std::unique_ptr ParseConstant(); std::unique_ptr ParseAssignStmt(); bool ParseDesignatorSuffix(std::vector &Out); std::unique_ptr ParseTypeDecl(); std::optional> ParseRecordBody( const std::string &Name, int Line, int EndToken); bool ParseRecordField(std::vector &Out, bool IsPublic); std::unique_ptr ParseFunction(); std::unique_ptr ParseProcedure(); std::unique_ptr ParseCallStmt(); std::unique_ptr ParseReturnStmt(); std::optional> ParsePrototypeArgs(bool AllowByRef); bool ParseSignedIntBound(int64_t &Out); std::unique_ptr ParseOpenFile(); std::unique_ptr ParseReadFile(); std::unique_ptr ParseWriteFile(); std::unique_ptr ParseCloseFile(); public: Parser(Lexer &L); std::vector> Parse(); bool hadError() const { return NumErrors != 0; } }; } // namespace cps