Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller A variant of recursive descent parsing Björn Fahller E --> E "+" E | E "-" E | "-" E | E "*" E | E "/" E | "(" E ")" | v
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller std::variant A very brief intro. using v = std::variantstd::string, bool, std::list>; v var{std::string(”foo”)}; Construct holding a std::string
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller std::variant A very brief intro. using v = std::variantstd::string, bool, std::list>; v var{std::string(”foo”)}; std::get(v) = ”bar”; Access the std::string and assign it a new value
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller std::visit(func_obj, v...) visitor visitor_obj; int i = std::visit(visitor_obj, variant_var);
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller std::visit(func_obj, v...) Matt Kline ”std::visit is everything wrong with modern C++” https://bitbashing.io/std-visit.html visitor visitor_obj; int i = std::visit(visitor_obj, variant_var);
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller std::visit(func_obj, v...) class visitor { public: int operator()(std::string) { /* str things */ } int operator()(int) { /* int things */ } int operator()(auto) { /* other things */ } }; visitor visitor_obj; int i = std::visit(visitor_obj, variant_var);
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller class visitor { public: int operator()(std::string) { /* str things */ } int operator()(int) { /* int things */ } int operator()(auto) { /* other things */ } }; visitor visitor_obj; int i = std::visit(visitor_obj, variant_var); std::visit(func_obj, v...) ● Uncool! Implementation far away from use.
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller class visitor { public: int operator()(std::string) { /* str things */ } int operator()(int) { /* int things */ } int operator()(auto) { /* other things */ } }; visitor visitor_obj; int i = std::visit(visitor_obj, variant_var); std::visit(func_obj, v...) ● Uncool! Implementation far away from use. ● A lambda is an object of class type with operator()
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller class visitor { public: int operator()(std::string) { /* str things */ } int operator()(int) { /* int things */ } int operator()(auto) { /* other things */ } }; visitor visitor_obj; int i = std::visit(visitor_obj, variant_var); std::visit(func_obj, v...) ● Uncool! Implementation far away from use. ● A lambda is an object of class type with operator() ● A lambda can be a base class
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller class visitor { public: int operator()(std::string) { /* str things */ } int operator()(int) { /* int things */ } int operator()(auto) { /* other things */ } }; visitor visitor_obj; int i = std::visit(visitor_obj, variant_var); std::visit(func_obj, v...) ● Uncool! Implementation far away from use. ● A lambda is an object of class type with operator() ● A lambda can be a base class
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller overload template class overload : T... { public: overload(T... t) : T(t)... {} using T::operator()...; }; auto x = overload( [](int) {}, [](std::string){} );
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller overload template class overload : T... { public: overload(T... t) : T(t)... {} using T::operator()...; }; auto x = overload( [](int) {}, [](std::string){} ); C++17 variadic using, to bring operator() from each T into view
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller overload template class overload : T... { public: overload(T... t) : T(t)... {} using T::operator()...; }; auto x = overload( [](int) {}, [](std::string){} ); C++17 automatic template type deduction from constructor.
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller std::variant using v = std::variantstd::string, bool, std::list>; void func(v obj) { std::visit(overload( [](int) { /* int stuff */ }, [](std::string) { /* string stuff */ }, [](const auto&) { /* other stuff */ }), obj); } Now the logic is where we use it. Cool!
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller Representing tokens Tokens for a very simple calculator. template struct C {}; struct number { double value; }; struct ident { std::string_view value; }; struct eof {}; struct remember {}; struct forget {};
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller Representing tokens Tokens for a very simple calculator. template struct C {}; struct number { double value; }; struct ident { std::string_view value; }; struct eof {}; struct remember {}; struct forget {}; For single character tokens like + - * / (
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller Representing tokens Tokens for a very simple calculator. template struct C {}; struct number { double value; }; struct ident { std::string_view value; }; struct eof {}; struct remember {}; struct forget {}; Let numeric literals hold the value
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller Representing tokens Tokens for a very simple calculator. template struct C {}; struct number { double value; }; struct ident { std::string_view value; }; struct eof {}; struct remember {}; struct forget {}; And identifiers the name.
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller Representing tokens Tokens for a very simple calculator. template struct C {}; struct number { double value; }; struct ident { std::string_view value; }; struct eof {}; struct remember {}; struct forget {}; Keywords for storing and dropping variables
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller Representing tokens Tokens for a very simple calculator. template struct C {}; struct number { double value; }; struct ident { std::string_view value; }; struct eof {}; struct remember {}; struct forget {}; and for lexer errors an exception is thrown
Variant of Parsing, C++ Stockholm 0x07, Björn Fahller @bjorn_fahller Björn Fahller https://github.com/rollbear/variant_parse [email protected] @bjorn_fahller @rollbear cpplang, swedencpp A variant of recursive descent parsing