diff --git a/peglib.h b/peglib.h index f70b4f6..7b9f7dd 100644 --- a/peglib.h +++ b/peglib.h @@ -2224,7 +2224,12 @@ struct AstBase : public Annotation }; template -void ast_to_s(const std::shared_ptr& ptr, std::string& s, int level = 0) { +void ast_to_s_core( + const std::shared_ptr& ptr, + std::string& s, + int level, + std::function fn) { + const auto& ast = *ptr; for (auto i = 0; i < level; i++) { s += " "; @@ -2240,15 +2245,21 @@ void ast_to_s(const std::shared_ptr& ptr, std::string& s, int level = 0) { } else { s += "+ " + name + "\n"; } + if (fn) { + s += fn(ast, level + 1); + } for (auto node : ast.nodes) { - ast_to_s(node, s, level + 1); + ast_to_s_core(node, s, level + 1, fn); } } template -std::string ast_to_s(const std::shared_ptr& ptr) { +std::string ast_to_s( + const std::shared_ptr& ptr, + std::function fn = nullptr) { + std::string s; - ast_to_s(ptr, s); + ast_to_s_core(ptr, s, 0, fn); return s; }