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
|
add_executable(lasm
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
src/lexer/Token.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)
|
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 <boost/program_options.hpp>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include "lexer/Lexer.h"
|
#include "lexer/Lexer.h"
|
||||||
|
#include "ast/Node.h"
|
||||||
|
#include "parser/Parser.h"
|
||||||
|
#include "codegen/PrintObserver.h"
|
||||||
|
|
||||||
namespace po = boost::program_options;
|
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);
|
Lexer lexer(input_string);
|
||||||
while (true) {
|
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;
|
std::cout << std::setw(10) << token.getTypeName() << ": " << static_cast<std::string_view>(token) << std::endl;
|
||||||
|
|
||||||
if (token.getType() == Token::UNEXPECTED) {
|
if (token.getType() == Token::UNEXPECTED) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (token.getType() == Token::END) {
|
|
||||||
|
tokens.push_back(std::move(token));
|
||||||
|
|
||||||
|
if (tokens.back().getType() == Token::END) {
|
||||||
return true;
|
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 {
|
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
|
// 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
|
// Parsing
|
||||||
|
std::cout << "Parsing:" << std::endl;
|
||||||
|
const std::unique_ptr<Node> ast = parse(tokens);
|
||||||
|
|
||||||
|
PrintObserver(*ast).Observer::traverse();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user