diff --git a/README.md b/README.md index 1399b52..86ac888 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,20 @@ - Compile `meson compile` - Run, `./browser` or `./server` +## Toolchain + +## Linux + +Install clang preferably `clang-15` or `clang-14`; + +### Windows + +- Install Visual Studio, with `Desktop development with C++` enabled +- Install a newer LLVM + ## VS Code development setup -### Install +### Install Linux - LLVM and clang, `clang-15` recommended, `clang-15` based, check with `clang --version` - [Meson](https://mesonbuild.com/), build system - [Meson VS Code extension](https://marketplace.visualstudio.com/items?itemName=mesonbuild.mesonbuild) @@ -19,6 +30,7 @@ - [VSCode - CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), debugger - [VSCode - Better C++ Syntax](https://marketplace.visualstudio.com/items?itemName=jeff-hykin.better-cpp-syntax), syntax higlighting + ### Config Add these to `settings.json` if necessary diff --git a/src/bong.cpp b/src/bong.cpp index 3487263..9f54411 100644 --- a/src/bong.cpp +++ b/src/bong.cpp @@ -339,77 +339,79 @@ auto Lexer::step() noexcept -> void } } -auto Parser::parse_top_level() noexcept -> Result, Error> -{ - if (!lexer.peek()) - return Error { lexer.peek().unwrap_error() }; - else if (lexer.peek()->type == Tokens::Name) - return parse_element(); - else - return parse_value(); -} +// auto Parser::parse_top_level() noexcept -> Result, +// Error> +// { +// if (!lexer.peek()) +// return Error { lexer.peek().unwrap_error() }; +// else if (lexer.peek()->type == Tokens::Name) +// return parse_element(); +// else +// return parse_value(); +// } -auto Parser::parse_element() noexcept -> Result, Error> -{ - auto name = *lexer.peek(); +// auto Parser::parse_element() noexcept -> Result, Error> +// { +// auto name = *lexer.peek(); - auto ids = Element::Ids {}; - auto classes = Element::Classes {}; - auto properties = Element::Properties {}; - auto values = Element::Values {}; +// auto ids = Element::Ids {}; +// auto classes = Element::Classes {}; +// auto properties = Element::Properties {}; +// auto values = Element::Values {}; - if (auto result = lexer.next(); !result) - return Error { result.unwrap_error() }; - return Result, Error>::create_ok( - std::make_unique( - Element { std::string { name.value() }, {}, {}, {}, {} })); -} +// if (auto result = lexer.next(); !result) +// return Error { result.unwrap_error() }; +// return Result, Error>::create_ok( +// std::make_unique( +// Element { std::string { name.value() }, {}, {}, {}, {} })); +// } -auto Parser::parse_single_line_fields( - Element::Initializer& initializer) noexcept -> Result -{ - if (lexer.peek()->type == Tokens::Id) { - initializer.ids.push_back(std::string { lexer.peek()->value() }); - if (auto result = lexer.next(); !result) - return Error { result.unwrap_error() }; - // do the rest; - } else if (lexer.peek()->type == Tokens::Class) { - initializer.classes.push_back(std::string { lexer.peek()->value() }); - if (auto result = lexer.next(); !result) - return Error { result.unwrap_error() }; - // do the rest - } else { - if (auto result = parse_mandatory_same_line_whitespace(); !result) - return result; - if (lexer.peek()->type == Tokens::Name) { - auto key = lexer.peek(); - if (auto result = lexer.next(); !result) - return Error { result.unwrap_error() }; - if (auto result = parse_optional_whitespace(); !result) - return result; - if (lexer.peek()->type != Tokens::Equal - and lexer.peek()->type != Tokens::Colon) - return Error { - fmt::format("expected '=' or ':', got {}", - lexer.peek()->to_string()), - lexer.peek()->location, - }; - if (auto result = lexer.next(); !result) - return Error { result.unwrap_error() }; - if (auto result = parse_optional_same_line_whitespace(); !result) - return result; - auto value = parse_single_line_value(); - if (!value) - return value; - // do the rest - } else { - auto value = parse_single_line_value(); - if (!value) - return value; - // do the rest - } - } -} +// auto Parser::parse_single_line_fields( +// Element::Initializer& initializer) noexcept -> Result +// { +// if (lexer.peek()->type == Tokens::Id) { +// initializer.ids.push_back(std::string { lexer.peek()->value() }); +// if (auto result = lexer.next(); !result) +// return Error { result.unwrap_error() }; +// // do the rest; +// } else if (lexer.peek()->type == Tokens::Class) { +// initializer.classes.push_back(std::string { lexer.peek()->value() }); +// if (auto result = lexer.next(); !result) +// return Error { result.unwrap_error() }; +// // do the rest +// } else { +// if (auto result = parse_mandatory_same_line_whitespace(); !result) +// return result; +// if (lexer.peek()->type == Tokens::Name) { +// auto key = lexer.peek(); +// if (auto result = lexer.next(); !result) +// return Error { result.unwrap_error() }; +// if (auto result = parse_optional_whitespace(); !result) +// return result; +// if (lexer.peek()->type != Tokens::Equal +// and lexer.peek()->type != Tokens::Colon) +// return Error { +// fmt::format("expected '=' or ':', got {}", +// lexer.peek()->to_string()), +// lexer.peek()->location, +// }; +// if (auto result = lexer.next(); !result) +// return Error { result.unwrap_error() }; +// if (auto result = parse_optional_same_line_whitespace(); !result) +// return result; +// auto value = parse_single_line_value(); +// if (!value) +// return value; +// // do the rest +// } else { +// auto value = parse_single_line_value(); +// if (!value) +// return value; +// // do the rest +// } +// } +// return {}; +// } // auto Parser::parse_single_line_field(Element::Initializer& initializer) // noexcept diff --git a/src/bong.hpp b/src/bong.hpp index 18a1f0b..b7d3d74 100644 --- a/src/bong.hpp +++ b/src/bong.hpp @@ -201,57 +201,57 @@ struct Bool final : public Node { auto type() const noexcept -> Nodes override { return Nodes::Bool; } }; -class Parser { -public: - struct Error { - Error(Lexer::Error error) - : message { std::move(error.message) } - , location { error.location } - { } - Error(std::string message, Location location) - : message { std::move(message) } - , location { location } - { } +// class Parser { +// public: +// struct Error { +// Error(Lexer::Error error) +// : message { std::move(error.message) } +// , location { error.location } +// { } +// Error(std::string message, Location location) +// : message { std::move(message) } +// , location { location } +// { } - std::string message; - Location location; - }; +// std::string message; +// Location location; +// }; - Parser(Lexer lexer) - : lexer { std::move(lexer) } - { } +// Parser(Lexer lexer) +// : lexer { std::move(lexer) } +// { } - auto parse_top_level() noexcept -> Result, Error>; - auto parse_element() noexcept -> Result, Error>; - auto parse_element_body(Element::Initializer& initializer) noexcept - -> Result; - auto parse_element_fields(Element::Initializer& initializer) noexcept - -> Result; - auto parse_element_field(Element::Initializer& initializer) noexcept - -> Result; - auto parse_single_line_fields(Element::Initializer& initializer) noexcept - -> Result; - auto parse_element_property() noexcept -> Result; - auto parse_single_line_value() noexcept -> Result; - auto parse_value() noexcept -> Result, Error>; - auto parse_object() noexcept -> Result; - auto parse_object_properties() noexcept -> Result; - auto parse_object_property() noexcept -> Result; - auto parse_array() noexcept -> Result; - auto parse_array_values() noexcept -> Result; - auto parse_bool() noexcept -> Result; - auto parse_mandatory_same_line_whitespace() noexcept -> Result; - auto parse_optional_same_line_whitespace() noexcept -> Result; - auto parse_mandatory_linebreak() noexcept -> Result; - auto parse_single_line_whitespace() noexcept -> Result; - auto parse_line_breaker() noexcept -> Result; - auto parse_whitespace_and_line_break() noexcept -> Result; - auto parse_optional_whitespace() noexcept -> Result; - auto parse_mandatory_whitespace() noexcept -> Result; - auto parse_singular_whitespace() noexcept -> Result; +// auto parse_top_level() noexcept -> Result, Error>; +// auto parse_element() noexcept -> Result, Error>; +// auto parse_element_body(Element::Initializer& initializer) noexcept +// -> Result; +// auto parse_element_fields(Element::Initializer& initializer) noexcept +// -> Result; +// auto parse_element_field(Element::Initializer& initializer) noexcept +// -> Result; +// auto parse_single_line_fields(Element::Initializer& initializer) noexcept +// -> Result; +// auto parse_element_property() noexcept -> Result; +// auto parse_single_line_value() noexcept -> Result; +// auto parse_value() noexcept -> Result, Error>; +// auto parse_object() noexcept -> Result; +// auto parse_object_properties() noexcept -> Result; +// auto parse_object_property() noexcept -> Result; +// auto parse_array() noexcept -> Result; +// auto parse_array_values() noexcept -> Result; +// auto parse_bool() noexcept -> Result; +// auto parse_mandatory_same_line_whitespace() noexcept -> Result; auto parse_optional_same_line_whitespace() noexcept -> +// Result; auto parse_mandatory_linebreak() noexcept -> +// Result; auto parse_single_line_whitespace() noexcept -> +// Result; auto parse_line_breaker() noexcept -> Result; auto parse_whitespace_and_line_break() noexcept -> Result; auto parse_optional_whitespace() noexcept -> Result; +// auto parse_mandatory_whitespace() noexcept -> Result; +// auto parse_singular_whitespace() noexcept -> Result; -private: - Lexer lexer; -}; +// private: +// Lexer lexer; +// }; } diff --git a/src/main.cpp b/src/main.cpp index 0f50b67..82d1bc5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -94,16 +94,15 @@ auto main() -> int tokens.unwrap_error().location.col); } - // test - // fmt::print("browser: hello world!\n"); - // auto gui = GUI::create().unwrap(); - // while (true) { - // bool should_exit = gui->should_exit(); - // if (should_exit) - // break; - // gui->set_background_color(100, 180, 220); - // SDL_Rect rect = { .x = 0, .y = 0, .w = 50, .h = 50 }; - // gui->create_rect(rect, 255, 0, 0); - // gui->update_gui(); - // } + fmt::print("browser: hello world!\n"); + auto gui = GUI::create().unwrap(); + while (true) { + bool should_exit = gui->should_exit(); + if (should_exit) + break; + gui->set_background_color(100, 180, 220); + SDL_Rect rect = { .x = 0, .y = 0, .w = 50, .h = 50 }; + gui->create_rect(rect, 255, 0, 0); + gui->update_gui(); + } } \ No newline at end of file