diff options
author | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-04-15 04:37:43 +0630 |
---|---|---|
committer | Aryadev Chavali <aryadev@aryadevchavali.com> | 2024-04-15 04:37:43 +0630 |
commit | 062ed1227849f9954427c8e13c0b720b68c78f63 (patch) | |
tree | 5c22c25a5d333b8cccf67917e6debb8c6feaef3a /asm/preprocesser.hpp | |
parent | 72ef40e6718cbe309a8fe6f32ac31adb1a40dda2 (diff) | |
download | ovm-062ed1227849f9954427c8e13c0b720b68c78f63.tar.gz ovm-062ed1227849f9954427c8e13c0b720b68c78f63.tar.bz2 ovm-062ed1227849f9954427c8e13c0b720b68c78f63.zip |
Rewrote preprocesser API
This C++ rewrite allows me to rewrite the actual API of the system.
In particular, I'm no longer restricting myself to just using enums
then figuring out a way to get proper error logging later down the
line (through tracking tokens in the buffer internally, for example).
Instead I can now design error structures which hold references to the
token they occurred on as well as possible lexical errors (if they're
a FILE_LEXICAL_ERROR which occurs due to the ~%USE~ macro). This
means it's a lot easier to write error logging now at the top level.
Diffstat (limited to 'asm/preprocesser.hpp')
-rw-r--r-- | asm/preprocesser.hpp | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/asm/preprocesser.hpp b/asm/preprocesser.hpp index 9d733dd..a1d8a31 100644 --- a/asm/preprocesser.hpp +++ b/asm/preprocesser.hpp @@ -12,11 +12,12 @@ #ifndef PREPROCESSER_HPP #define PREPROCESSER_HPP +#include <ostream> #include <tuple> #include "./lexer.hpp" -enum pp_err_t +enum pp_err_type_t { OK = 0, EXPECTED_NAME, @@ -27,13 +28,30 @@ enum pp_err_t UNKNOWN_NAME, }; -std::pair<std::vector<token_t>, pp_err_t> -preprocesser(const std::vector<token_t> &); +struct pp_err_t +{ + const token_t *reference; + pp_err_type_t type; + lerr_t lerr; + + pp_err_t(pp_err_type_t); + pp_err_t(pp_err_type_t, const token_t *); + pp_err_t(pp_err_type_t, const token_t *, lerr_t); +}; + +std::ostream &operator<<(std::ostream &, pp_err_t &); + +std::pair<std::vector<token_t *>, pp_err_t> +preprocesser(std::vector<token_t *> &); + +std::pair<std::vector<token_t *>, pp_err_t> +preprocess_const_blocks(std::vector<token_t *> &); -std::pair<std::vector<token_t>, pp_err_t> -preprocess_macro_blocks(const std::vector<token_t> &); +std::pair<std::vector<token_t *>, pp_err_t> +preprocess_use_blocks(std::vector<token_t *> &); -std::pair<std::vector<token_t>, pp_err_t> -preprocess_use_blocks(const std::vector<token_t> &); +// TODO: Implement this +std::pair<std::vector<token_t *>, pp_err_t> +preprocess_macro_blocks(std::vector<token_t *> &); #endif |