1

main.cpp: Parse the test program and print the AST

This commit is contained in:
2023-03-21 14:34:14 +01:00
parent e2a4ebecf3
commit 7e1159f785
2 changed files with 30 additions and 6 deletions

View File

@ -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)

View File

@ -5,26 +5,35 @@
#include <boost/program_options.hpp>
#include <iomanip>
#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<Token> tokens) -> bool {
auto lex(std::string_view input_string, std::vector<Token> &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<std::string_view>(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<Token> &tokens) -> std::unique_ptr<Node> {
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<Node> ast = parse(tokens);
PrintObserver(*ast).Observer::traverse();
return 0;
}