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..a117991089dbf70 --- /dev/null +++ b/Userland/Utilities/glsl-compiler.cpp @@ -0,0 +1,44 @@ +/* + * 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; + StringView 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()); + StringView content_view(content); + + GLSL::Preprocessor preprocessor(path, content_view); + auto tokens = preprocessor.process_and_lex(); + + GLSL::Parser parser(tokens, path); + if (print_tokens) + parser.print_tokens(); + auto root = parser.parse(); + + dbgln("Parser errors:"); + for (auto& error : parser.errors()) { + dbgln("{}", error); + } + + root->dump(); + + return 0; +}