main.cpp: Parse the test program and print the AST
This commit is contained in:
@ -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)
|
23
src/main.cpp
23
src/main.cpp
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user