/// AUTOGENERATED COPYRIGHT HEADER START // Copyright (C) 2024 Michael Fabian 'Xaymar' Dirks // AUTOGENERATED COPYRIGHT HEADER END /* #include "parser.hpp" #include "ast/function.hpp" #include #include #include blitz::parser::parser(std::string file) { // Try and load the file std::shared_ptr instream = std::make_shared(file); if (instream->bad() || !instream->good()) { throw std::ios_base::failure("Failed to open file."); } m_files.push(std::make_pair(file, instream)); } blitz::parser::~parser() { while (m_files.size() > 0) { std::shared_ptr file = std::dynamic_pointer_cast(m_files.top().second); file->close(); m_files.pop(); } } std::unique_ptr blitz::parser::parse() { std::unique_ptr scope = std::make_unique(); std::unique_ptr expr; while ((expr = std::move(parse_expression())) != nullptr) { scope->AddExpression(std::move(expr)); } return std::move(scope); } void blitz::parser::log(const char* msg, ...) { std::vector buf(65535); va_list val; va_start(val, msg); int rval = vsnprintf(buf.data(), buf.size(), msg, val); va_end(val); std::cout << buf.data() << '\n'; } void blitz::parser::log_error(const char* msg, ...) { std::vector buf(65535); va_list val; va_start(val, msg); int rval = vsnprintf(buf.data(), buf.size(), msg, val); va_end(val); std::cerr << buf.data() << '\n'; } std::pair blitz::parser::next() { return m_lexer.next(m_files.top().second); } std::unique_ptr blitz::parser::parse_expression() { while (true) { auto tkn = next(); log("%s", tkn.second.c_str()); switch (tkn.first) { case blitz::lexer::tokentype::TokenNewLine: case blitz::lexer::tokentype::TokenComment: // Skip Comments, since we don't really need them for the AST. continue; case blitz::lexer::tokentype::TokenPlus: case blitz::lexer::tokentype::TokenMinus: default: // End Of File / Unknown case blitz::lexer::tokentype::TokenUnknown: case blitz::lexer::tokentype::TokenEOF: return nullptr; break; } } } std::unique_ptr blitz::parser::parse_number(blitz::lexer::tokentype token, std::string value) { if (token != lexer::tokentype::TokenNumber) { log_error("Unexpected Token during parsing, expected number."); return nullptr; } char* endptr = const_cast(value.c_str() + value.size()); int32_t parsed = strtol(value.c_str(), &endptr, 10); if (errno == ERANGE) { log_error("Number out of range."); return nullptr; } return std::make_unique(parsed); } std::unique_ptr blitz::parser::parse_decimal(blitz::lexer::tokentype token, std::string value) { if (token != lexer::tokentype::TokenNumber) { log_error("Unexpected Token during parsing, expected number."); return nullptr; } char* endptr = const_cast(value.c_str() + value.size()); float_t parsed = strtof(value.c_str(), &endptr); if (errno == ERANGE) { log_error("Number out of range."); return nullptr; } return std::make_unique(parsed); } */