diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index 6c2c30f89820c30..d37f4c3f95e2e45 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -92,6 +92,7 @@ target_link_libraries(expr PRIVATE LibRegex) target_link_libraries(fdtdump PRIVATE LibDeviceTree) target_link_libraries(file PRIVATE LibGfx LibIPC LibArchive LibCompress LibAudio) target_link_libraries(functrace PRIVATE LibDebug LibX86) +target_link_libraries(glsl-compiler PRIVATE LibGLSL) target_link_libraries(gml-format PRIVATE LibGUI) target_link_libraries(grep PRIVATE LibFileSystem LibRegex) target_link_libraries(gunzip PRIVATE LibCompress) diff --git a/Userland/Utilities/glsl-compiler.cpp b/Userland/Utilities/glsl-compiler.cpp new file mode 100644 index 000000000000000..0e86264be16dd5c --- /dev/null +++ b/Userland/Utilities/glsl-compiler.cpp @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2021-2022, the SerenityOS developers. + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +ErrorOr serenity_main(Main::Arguments arguments) +{ + Core::ArgsParser args_parser; + String path; + bool print_tokens = false; + args_parser.add_option(print_tokens, "Print Tokens", "tokens", 't'); + args_parser.add_positional_argument(path, "Input file", "input-file", Core::ArgsParser::Required::Yes); + args_parser.parse(arguments); + + if (path.is_empty()) + return 1; + + auto file = TRY(Core::File::open(path, Core::File::OpenMode::Read)); + auto content = TRY(file->read_until_eof()); + String content_view = TRY(String::from_utf8(content)); + + GLSL::Preprocessor preprocessor(path, content_view); + auto tokens = TRY(preprocessor.process_and_lex()); + + GLSL::Parser parser(tokens, path); + if (print_tokens) + parser.print_tokens(); + auto root = TRY(parser.parse()); + + dbgln("Parser errors:"); + for (auto& error : parser.errors()) { + dbgln("{}", error); + } + + auto standard_out = TRY(Core::File::standard_output()); + TRY(root->dump(*standard_out)); + + return 0; +}