From 333949894e60449577566ab1f81c1e7b2496f1d1 Mon Sep 17 00:00:00 2001 From: Poseydon42 Date: Sun, 23 Jul 2023 23:10:51 +0100 Subject: [PATCH] Userland: Add glsl-compiler utility that prints parsed AST --- Userland/Utilities/CMakeLists.txt | 1 + Userland/Utilities/glsl-compiler.cpp | 45 ++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 Userland/Utilities/glsl-compiler.cpp diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index 9d880b29a7..cf63c82563 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -93,6 +93,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 0000000000..0e86264be1 --- /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; +}