|
Boost : |
From: tobi_at_[hidden]
Date: 2024-02-27 17:44:40
Boost.Parser review
Why do we need a DSEL-Parser library in Boost:
I think nobody, who once has written a parser with a DSEL (like e.g.
Spirit) in C++, ever want's to go back to out off source
parser-generators like yacc/bison or ANTLR (or even hand written
parsers): it is so convenient having the parser definition as a grammar
within the code. Additionally, you can quite easily hook into the parser
(e.g. Spirit's Phoenix functions). So, IMHO there is definitely need for
such C++ libraries.
On the other hand, the task of creating such a library is very
challenging and requires high expertise and coding standards, as
library-users have to rely on its correctness. So, Boost with its
standards and peer-review process is definitely the place for such a
library. (Personally, I wouldn't use a parser-library the hasn't gone
through such a process.)
Should accept Boost.Parser into Boost?
There are already three parser libraries in Boost: Spirt and its
successors Qi and X3
- Spirit: very outdated interface, IIRC C++98 compatible, superseded by
Qi
- Qi: Simply a revolution in parsing! It was blowing my mind, when I
first used it. The way attributes were composed and semantic actions
could applied with Phoenix was totally exciting. But of course, there
was also the downside of (very) long compilation-times and frustrating
long error-messages when something got wrong. And (again IIRC) Qi came
to life before C++11, so it is also C++98.
- X3: I only wrote one larger X3 parser, and to be frank, IMHO it never
made it to production-level. There are several things that worked
perfectly with Qi, which I never got running the same way in X3.
Additionally, the Spirit libraries seem no longer to be in active
development.
Now, let's get to Boost.Parser:
First, I don't want to go into the details of the library, as I think
other reviewers did a very good job there.
I've been following its evolving since I heard of it in 2022. Back then,
I did some test with it and reported some Issues, which got resolved.
During the last two years many additional features got added to it. So,
Boost.Parser is definitely under active development.
Furthermore, the author is an expert for Unicode, which is reflected in
the built-in Unicode support of the library.
It is written in modern C++ (requires C++17). It is compile-time
friendly, supports std::ranges and concepts.
It offers an option/abstraction to choose between std::tuples, if
needed, or the more flexible hana-implementation.
It's syntax is close to Qi, so transition for Qi-users should not be too
hard.
The documentation contains a lot of examples that help to understand how
the library works and how it can be used.
Finally, I really like the very easy to use trace-mode.
Again, should accept Boost.Parser into Boost?
Definitely Yes!
Tobias
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk