From 145e2d9e015c26f23a567d4a8a42467108dda0af Mon Sep 17 00:00:00 2001 From: Stephane Del Pino <stephane.delpino44@gmail.com> Date: Tue, 2 Jul 2019 15:25:47 +0200 Subject: [PATCH] Improve output of AST now one can select some details (useful for unit tests) --- src/language/ASTPrinter.cpp | 52 +++++++++++++++++++++++++------------ src/language/ASTPrinter.hpp | 16 +++++++++++- src/language/PugsParser.cpp | 2 +- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/src/language/ASTPrinter.cpp b/src/language/ASTPrinter.cpp index 572a97a11..bfb526cc7 100644 --- a/src/language/ASTPrinter.cpp +++ b/src/language/ASTPrinter.cpp @@ -1,6 +1,8 @@ #include <ASTPrinter.hpp> #include <EscapedString.hpp> +#include <PEGGrammar.hpp> + namespace language { void @@ -12,22 +14,34 @@ ASTPrinter::_print(std::ostream& os, const Node& node) const } else { os << node.name(); } - os << rang::fg::reset << ':'; - os << dataTypeName(node.m_data_type) << ':'; + os << rang::fg::reset; - os << rang::fgB::cyan; - std::visit( - [&](const auto& value) { - using T = std::decay_t<decltype(value)>; - if constexpr (std::is_same_v<T, std::monostate>) { - os << "--"; - } else if constexpr (std::is_same_v<T, std::string>) { - os << '\"' << escapeString(value) << '\"'; - } else { - os << value; - } - }, - node.m_value); + if (node.is<language::name>() or node.is<language::literal>() or node.is<language::integer>() or + node.is<language::real>()) { + os << ':' << rang::fgB::green << node.string() << rang::fg::reset; + } + + if (m_info & static_cast<InfoBaseType>(Info::data_type)) { + os << ':'; + os << dataTypeName(node.m_data_type) << rang::fg::reset; + } + + if (m_info & static_cast<InfoBaseType>(Info::data_value)) { + os << ':'; + os << rang::fgB::cyan; + std::visit( + [&](const auto& value) { + using T = std::decay_t<decltype(value)>; + if constexpr (std::is_same_v<T, std::monostate>) { + os << "--"; + } else if constexpr (std::is_same_v<T, std::string>) { + os << '\"' << escapeString(value) << '\"'; + } else { + os << value; + } + }, + node.m_value); + } os << rang::fg::reset << ")\n"; if (not node.children.empty()) { @@ -71,7 +85,8 @@ operator<<(std::ostream& os, const ASTPrinter& ast_printer) return os; } -ASTPrinter::ASTPrinter(const language::Node& node, Format format) : m_node{node} +ASTPrinter::ASTPrinter(const language::Node& node, Format format, std::initializer_list<Info> initializer_list) + : m_node{node} { if (format == Format::pretty) { T_junction = " \u251c\u2500\u2500"; @@ -85,5 +100,10 @@ ASTPrinter::ASTPrinter(const language::Node& node, Format format) : m_node{node} pipe_space = " | "; space_space = " "; } + + m_info = 0; + for (auto i : initializer_list) { + m_info |= static_cast<InfoBaseType>(i); + } } } // namespace language diff --git a/src/language/ASTPrinter.hpp b/src/language/ASTPrinter.hpp index a4715fba2..ec6c8b93b 100644 --- a/src/language/ASTPrinter.hpp +++ b/src/language/ASTPrinter.hpp @@ -14,9 +14,21 @@ class ASTPrinter pretty }; + using InfoBaseType = uint32_t; + + enum class Info : InfoBaseType + { + none = 0, + data_type = 1 << 0, + data_value = 1 << 1, + all = std::numeric_limits<InfoBaseType>::max() + }; + private: const Node& m_node; + InfoBaseType m_info; + mutable std::string prefix; mutable std::vector<int> last_prefix_size; @@ -34,7 +46,9 @@ class ASTPrinter public: friend std::ostream& operator<<(std::ostream& os, const ASTPrinter& ast_printer); - ASTPrinter(const Node& node, Format format = Format::pretty); + ASTPrinter(const Node& node, + Format format = Format::pretty, + std::initializer_list<Info> initializer_list = {Info::all}); ASTPrinter(const ASTPrinter&) = delete; diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp index 2edd84b3b..db2f4f593 100644 --- a/src/language/PugsParser.cpp +++ b/src/language/PugsParser.cpp @@ -484,7 +484,7 @@ parser(const std::string& filename) language::build_node_type(*root_node); - std::cout << language::ASTPrinter{*root_node, language::ASTPrinter::Format::raw} << '\n'; + std::cout << language::ASTPrinter{*root_node} << '\n'; language::ExecUntilBreakOrContinue exec_all; root_node->execute(exec_all); -- GitLab