#include "cps/Parser.h" using namespace cps; int Parser::getNextToken() { return CurTok = Lex.gettok(); } std::unique_ptr Parser::ParseNumberExpr() { auto Result = std::make_unique(Lex.NumVal); getNextToken(); return Result; } std::unique_ptr Parser::ParseIdentifierExpr() { std::string IdName = Lex.IdentifierStr; getNextToken(); return std::make_unique(IdName); } std::unique_ptr Parser::ParseExpression() { if (CurTok == tok_number) return ParseNumberExpr(); if (CurTok == tok_identifier) return ParseIdentifierExpr(); return nullptr; } std::vector> Parser::Parse() { std::vector> Statements; while (CurTok != tok_eof) { if (CurTok == tok_declare) { // DECLARE : INTEGER getNextToken(); // eat DECLARE if (CurTok != tok_identifier) break; // Error std::string Name = Lex.IdentifierStr; getNextToken(); // eat Name if (CurTok != tok_colon) break; // Error: expected ':' getNextToken(); // eat ':' if (CurTok != tok_integer_kw) break; // Error: expected INTEGER getNextToken(); // eat INTEGER Statements.push_back(std::make_unique(Name)); } else if (CurTok == tok_identifier) { // <- std::string Name = Lex.IdentifierStr; getNextToken(); // eat Name if (CurTok != tok_assign) break; // Error: expected '<-' getNextToken(); // eat '<-' auto Expr = ParseExpression(); Statements.push_back(std::make_unique(Name, std::move(Expr))); } else if (CurTok == tok_input) { // INPUT getNextToken(); // eat INPUT if (CurTok != tok_identifier) break; Statements.push_back(std::make_unique(Lex.IdentifierStr)); getNextToken(); } else if (CurTok == tok_output) { // OUTPUT getNextToken(); // eat OUTPUT auto Expr = ParseExpression(); Statements.push_back(std::make_unique(std::move(Expr))); } else { getNextToken(); // Skip unknown } } return Statements; }