diff options
Diffstat (limited to 'libalee/corewords.hpp')
-rw-r--r-- | libalee/corewords.hpp | 90 |
1 files changed, 63 insertions, 27 deletions
diff --git a/libalee/corewords.hpp b/libalee/corewords.hpp index f4ab851..30d0a42 100644 --- a/libalee/corewords.hpp +++ b/libalee/corewords.hpp @@ -1,54 +1,78 @@ -/** - * Alee Forth: A portable and concise Forth implementation in modern C++. - * Copyright (C) 2023 Clyne Sullivan <clyne@bitgloo.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ +// +/// @file corewords.hpp +/// @brief Manages the fundamental word-set and its execution. +// +// Alee Forth: A portable and concise Forth implementation in modern C++. +// Copyright (C) 2023 Clyne Sullivan <clyne@bitgloo.com> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. #ifndef ALEEFORTH_COREWORDS_HPP #define ALEEFORTH_COREWORDS_HPP #include "config.hpp" -#include "types.hpp" #include "dictionary.hpp" +#include "types.hpp" + +#include <algorithm> + +class State; /** * To be implemented by the user, this function is called when the `sys` word * is executed. + * @param state Current execution state object. */ -void user_sys(State&); +void user_sys(State& state); +/** + * @class CoreWords + * @brief Provides the fundamental word-set and manages its execution. + */ class CoreWords { public: - constexpr static Cell WordCount = 37; - constexpr static Cell Semicolon = 26; + /** + * Searches for the token/index of the given word if it is part of the + * fundamental word-set. + * @param state Current execution state object. + * @param word Word (stored in state's dictionary memory) to look up. + * @return The token/index of the word or -1 if not found. + */ + static Cell findi(State& state, Word word); /** - * Finds execution token that corresponds to the given word. - * Returns -1 if not found. + * Looks up the token/index of the given fundamental word. + * Primarily used for compile-time lookup. + * @param word The word to look up. + * @return The token/index of the word or -1 if not found. */ - static Cell findi(State&, Word); - consteval static Cell findi(const char *word) { + consteval static Cell token(const char *word) { return findi(word, strlen(word)); } /** - * Executes the given CoreWord execution token using the given state. + * Executes the given execution token using the given state. + * @param token Any valid execution token (word, fundamental, constant...). + * @param state The state object to execute with. */ - static void run(Cell, State&); + static void run(Cell token, State& state); + /** + * String lookup table for the fundamental word-set. + * This also determines the opcode (index) of these words. + */ constexpr static char wordsarr[] = "_lit\0drop\0dup\0swap\0pick\0sys\0" "+\0-\0m*\0_/\0_%\0" @@ -59,7 +83,19 @@ public: "depth\0_rdepth\0_in\0_ev\0find\0" "_uma\0u<\0um/mod\0"; + /** + * Count of total fundamental words. + */ + constexpr static Cell WordCount = [] { + return std::count(wordsarr, wordsarr + sizeof(wordsarr), '\0'); }(); + private: + /** + * Generic implementation of findi(). Private; use public implementations. + * @param it Beginning iterator of the word to search for. + * @param size Size of the searched-for word i.e. end == it + size. + * @return The token/index of the word or -1 if not found. + */ template<typename Iter> LIBALEE_SECTION constexpr static Cell findi(Iter it, std::size_t size) |