Boost logo

Boost Users :

Subject: Re: [Boost-users] How to implement a visitor pattern over an AST
From: Larry Evans (cppljevans_at_[hidden])
Date: 2018-12-10 23:27:59

On 12/10/18 2:14 PM, Michael Powell via Boost-users wrote:
> On Mon, Dec 10, 2018 at 3:00 PM Steven Watanabe via Boost-users
> <boost-users_at_[hidden]> wrote:
>> On 12/10/2018 12:04 PM, Michael Powell via Boost-users wrote:
>>> I have an AST successfully building, generating text file, and
>>> subsequently Spirit Qi parsing for verification purposes.
>>> Now I want to implement a visitor pattern over that AST, somehow...
>>> For "calculators" and such, "evaluating" those expressions is one
>>> thing; however, this AST is not that. It is closer akin to a parsed
>>> Xml or Json model/tree.
>>> In other words, I'd like for it to feel sort of like an iterator if
>>> that's even possible. It should have contextual awareness where it is
>>> at all times, etc, perhaps "incrementing" is a depth first analysis.
>> It's possible to do this, but making an iterator
>> over a tree is quite a bit more complex than just
>> using a depth-first visitation whenever you need
>> to process the tree.
> It is; I actually have a similar pattern in a "string rendering
> visitor" in which I have internally specialized template methods for
> the particular nodes of visitation. One might call that a unary
> visitor, given a single operand.
> In this case, I rinse and repeat given the binary case, two operands:
> template<typename T>
> bool equals(const T& x, const T& y) const {
> const auto message = "Comparator type '" +
> std::string(typeid(T).name()) + "' unsupported";
> throw std::exception(message.c_str());
> }
> template<>
> bool equals<ast::TopLevelType>(const ast::TopLevelType& x, const
> ast::TopLevelType& y) const {
> // ...
> }
> And so on... Which also guarantees that I am also walking both tree's
> at the same moment and in like fashion.
Hi Michael,

I'm spitballing here, but my novice view of karma is that it takes an
AST and, like your "string rendering visitor" turns it into a string
on std::cout or some other ostream. So, I'm guessing you could
look at karma to see how it does it, and duplicate that method,
only instead of rendering to a ostream, you'd just "render" as a bool

Again, I could largely misunderstand what karma does, so take the
above with a "large grain of salt".


Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at