From 8f16a733b9be5b6fa8a514ddb3e1ddc47596689e Mon Sep 17 00:00:00 2001 From: WerWolv Date: Sun, 10 Jan 2021 13:40:07 +0100 Subject: [PATCH] Fixed bitfields behaving like they have no size. Fixes #127 --- include/lang/lexer.hpp | 9 ++++----- include/lang/parser.hpp | 10 ++++------ source/lang/evaluator.cpp | 5 ++++- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/include/lang/lexer.hpp b/include/lang/lexer.hpp index 2cf01a440..389ea1f48 100644 --- a/include/lang/lexer.hpp +++ b/include/lang/lexer.hpp @@ -12,16 +12,15 @@ namespace hex::lang { class Lexer { public: + using LexerError = std::pair; + Lexer(); std::optional> lex(const std::string& code); - - const std::pair& getError() { return this->m_error; } + const LexerError& getError() { return this->m_error; } private: - std::pair m_error; - - using LexerError = std::pair; + LexerError m_error; [[noreturn]] void throwLexerError(std::string_view error, u32 lineNumber) const { throw LexerError(lineNumber, "Lexer: " + std::string(error)); diff --git a/include/lang/parser.hpp b/include/lang/parser.hpp index fbf9e31ae..05f85bf99 100644 --- a/include/lang/parser.hpp +++ b/include/lang/parser.hpp @@ -16,18 +16,16 @@ namespace hex::lang { class Parser { public: + using TokenIter = std::vector::const_iterator; + using ParseError = std::pair; + Parser() = default; ~Parser() = default; - using TokenIter = std::vector::const_iterator; - std::optional> parse(const std::vector &tokens); - - const std::pair& getError() { return this->m_error; } + const ParseError& getError() { return this->m_error; } private: - using ParseError = std::pair; - ParseError m_error; TokenIter m_curr; TokenIter m_originalPosition; diff --git a/source/lang/evaluator.cpp b/source/lang/evaluator.cpp index 1d5e56e38..80c046761 100644 --- a/source/lang/evaluator.cpp +++ b/source/lang/evaluator.cpp @@ -476,7 +476,10 @@ namespace hex::lang { entryPatterns.emplace_back(name, fieldBits); } - return new PatternDataBitfield(startOffset, (bits / 8) + 1, entryPatterns); + size_t size = (bits + 7) / 8; + this->m_currOffset += size; + + return new PatternDataBitfield(startOffset, size, entryPatterns); } PatternData* Evaluator::evaluateType(ASTNodeTypeDecl *node) {