From 59ecb61463119e77637214e3c298c422c4537ea0 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 9 Feb 2023 14:01:05 -0500 Subject: [PATCH] parse files --- alee.cpp | 57 ++++++++++++++++++++++++++++++++++++------------------ core.fth | 15 ++++++++++++++ parser.hpp | 2 ++ 3 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 core.fth diff --git a/alee.cpp b/alee.cpp index 8ca209c..265982c 100644 --- a/alee.cpp +++ b/alee.cpp @@ -19,40 +19,59 @@ #include "memdict.hpp" #include "parser.hpp" +#include #include +#include -// : variable create 0 , ; -// : create here constant ; -// : constant +static void parseLine(Parser&, State&, std::string_view); +static void parseFile(Parser&, State&, std::istream&); -int main() +int main(int argc, char *argv[]) { MemDict dict; State state (dict); Parser parser; - for (;;) { - std::string line; - std::cout << state.size() << ' ' << state.compiling << "> "; - std::getline(std::cin, line); - - ParseStatus r; - std::string_view lv (line); - do { - r = parser.parse(state, lv); - } while (r == ParseStatus::Continue); - - if (r != ParseStatus::Finished) - std::cout << "r " << to_string(r) << std::endl; + std::vector args (argv + 1, argv + argc); + for (const auto& a : args) { + std::ifstream file (a); + parseFile(parser, state, file); } + //std::cout << state.size() << ' ' << state.compiling << "> "; + parseFile(parser, state, std::cin); + return 0; } int user_sys(State& state) { - const auto value = state.pop(); - std::cout << value << std::endl; + switch (state.pop()) { + case 0: + std::cout << state.pop() << std::endl; + break; + } + return 0; } +void parseLine(Parser& parser, State& state, std::string_view line) +{ + ParseStatus r; + do { + r = parser.parse(state, line); + } while (r == ParseStatus::Continue); + + if (r != ParseStatus::Finished) + std::cout << "r " << to_string(r) << std::endl; +} + +void parseFile(Parser& parser, State& state, std::istream& file) +{ + while (file.good()) { + std::string line; + std::getline(file, line); + parseLine(parser, state, line); + } +} + diff --git a/core.fth b/core.fth new file mode 100644 index 0000000..ab53923 --- /dev/null +++ b/core.fth @@ -0,0 +1,15 @@ +( : variable create 0 , ; ) +( : create here const ; ) + +: . 0 sys ; + +: over 1 pick ; +: -rot rot rot ; +: nip swap drop ; +: tuck swap over ; + +: 1+ 1 + ; +: 1- 1 - ; + +: 0= 0 = ; +: >= < 0= ; diff --git a/parser.hpp b/parser.hpp index 2aee82a..588315d 100644 --- a/parser.hpp +++ b/parser.hpp @@ -27,6 +27,8 @@ public: ParseStatus parse(State& state, std::string_view& str) { const auto end = str.find_first_of(" \t\n\r"); const auto sub = str.substr(0, end); + if (sub.empty()) + return ParseStatus::Finished; if (state.pass != Pass::None) { switch (state.pass) {