From 7e1159f7851fb4ec027f3ad5584bf5d2f0ccad7b Mon Sep 17 00:00:00 2001 From: ChUrl Date: Tue, 21 Mar 2023 14:34:14 +0100 Subject: [PATCH] main.cpp: Parse the test program and print the AST --- CMakeLists.txt | 13 ++++++++++++- src/main.cpp | 23 ++++++++++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 321eff2..8d0f436 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,17 @@ find_package(Boost 1.81 COMPONENTS program_options REQUIRED) add_executable(lasm src/main.cpp src/lexer/Token.cpp - src/lexer/Lexer.cpp) + src/lexer/Lexer.cpp + src/ast/Node.cpp + src/ast/nodes/RootNode.cpp + src/ast/nodes/ConstNode.cpp + src/ast/nodes/RegNode.cpp + src/ast/nodes/MovNode.cpp + src/ast/nodes/AluNode.cpp + src/ast/nodes/JumpNode.cpp + src/ast/Observer.cpp + src/ast/PrefixObserver.cpp + src/codegen/PrintObserver.cpp + src/parser/Parser.cpp) target_link_libraries(lasm Boost::program_options) \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index d6f9d5c..081fb22 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,26 +5,35 @@ #include #include #include "lexer/Lexer.h" +#include "ast/Node.h" +#include "parser/Parser.h" +#include "codegen/PrintObserver.h" namespace po = boost::program_options; -auto lex(std::string_view input_string, std::vector tokens) -> bool { +auto lex(std::string_view input_string, std::vector &tokens) -> bool { Lexer lexer(input_string); while (true) { - const Token token = lexer.next(); + Token token = lexer.next(); std::cout << std::setw(10) << token.getTypeName() << ": " << static_cast(token) << std::endl; if (token.getType() == Token::UNEXPECTED) { return false; } - if (token.getType() == Token::END) { + + tokens.push_back(std::move(token)); + + if (tokens.back().getType() == Token::END) { return true; } - - tokens.push_back(token); } } +auto parse(std::vector &tokens) -> std::unique_ptr { + Parser parser(tokens); + return std::move(parser.parse()); +} + auto main(int argc, char **argv) -> int { // Argument parsing straight from the Boost manual: https://www.boost.org/doc/libs/1_60_0/doc/html/program_options/tutorial.html @@ -81,6 +90,10 @@ auto main(int argc, char **argv) -> int { } // Parsing + std::cout << "Parsing:" << std::endl; + const std::unique_ptr ast = parse(tokens); + + PrintObserver(*ast).Observer::traverse(); return 0; }