Re: [v3] Tiny project, state of v3 etc

Seth via Spirit-general <[email protected]> Mon, 01 Jul 2024 02:13:15 +0200
Newsgroups gmane.comp.parsers.spirit.general
Message-ID <[email protected]>
--===============2709943256669688816==
Content-Type: multipart/alternative;
 boundary=c8ebda69a2dd4b0186da76e74cb1e1ed

--c8ebda69a2dd4b0186da76e74cb1e1ed
Content-Type: text/plain;charset=utf-8
Content-Transfer-Encoding: quoted-printable

On Sat, Jun 29, 2024, at 7:45 PM, Michael Powell wrote:
>> Huh, nice, very interesting. The key is the boost::multiprecision::cp=
p_dec_float_50 coordinate value, I suppose. Everything else being punctu=
ation, arrangement, etc.
>>=20
>> How about for semantic actions? Are they still supported? For instanc=
e, when I encounter a production, attribute, synthesis, I'd like to rais=
e that as a signal, for instance, that a listener subscribing to the par=
ser may subscribe and follow, respond, otherwise populate the DSL.
>=20
> Need a bit of guidance where SA are concerned.=20
>=20
With all due respect, I think you're making things unnecessarily complic=
ated by focusing on SA's from the get go. I'd focus on the functional re=
quirements first and foremost.

If you insist on an event-based parser you might be better off just usin=
g `int_parser` directly without even bothering about the rule machinery,=
 since IMHO Spirit's non-terminal parsers shine _without_ semantic actio=
ns =C2=B9

=C2=B9 https://stackoverflow.com/questions/8259440/boost-spirit-semantic=
-actions-are-evil


> If I have a rule that wants to synthesize an enumerated value, let's s=
ay, and the RHS was an alternatives of chars (below), how do I do that, =
what goes in the SA, and where?

I'd do this: https://coliru.stacked-crooked.com/a/93d68b17f9f11662

#include <boost/spirit/home/x3.hpp>
#include <iostream>

enum class Foo { bar, baz, qux, quux, corge, grault, garply, waldo, fred=
, plugh, xyzzy, thud };

static inline std::ostream& operator<<(std::ostream& os, Foo f) {
    switch (f) {
        case Foo::bar:    return os << "bar";
        case Foo::baz:    return os << "baz";
        case Foo::qux:    return os << "qux";
        case Foo::quux:   return os << "quux";
        case Foo::corge:  return os << "corge";
        case Foo::grault: return os << "grault";
        case Foo::garply: return os << "garply";
        case Foo::waldo:  return os << "waldo";
        case Foo::fred:   return os << "fred";
        case Foo::plugh:  return os << "plugh";
        case Foo::xyzzy:  return os << "xyzzy";
        case Foo::thud:   return os << "thud";
        default: return os << "???";
    }
}

namespace x3 =3D boost::spirit::x3;

x3::symbols<Foo> const foo =3D {
    { "bar",    Foo::bar    },
    { "baz",    Foo::baz    },
    { "qux",    Foo::qux    },
    { "quux",   Foo::quux   },
    { "corge",  Foo::corge  },
    { "grault", Foo::grault },
    { "garply", Foo::garply },
    { "waldo",  Foo::waldo  },
    { "fred",   Foo::fred   },
    { "plugh",  Foo::plugh  },
    { "xyzzy",  Foo::xyzzy  },
    { "thud",   Foo::thud   }
};

int main() {
    std::string_view input =3D "bar, baz, QuX, QuUx, CoRgE, gRAULT, GARP=
LY,\n"
                             "WALDO, fred, plugh, xyzzy, thud";

    std::vector<Foo> result;
    if (phrase_parse(input.begin(), input.end(), x3::no_case[foo] % ',',=
 x3::space, result))
        for (auto f : result)
            std::cout << static_cast<int>(f) << "(" << f << ")" << std::=
endl;
    else
        std::cout << "Parsing failed\n";
}

> Another thing I might like to do is trigger a signal from said SA, if =
that is possible to do, which I am assuming it is.=20

Correct.

E.g. in Qi: https://coliru.stacked-crooked.com/a/a862c00ef67851c0

#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/phoenix.hpp>
#include <boost/signals2.hpp>
#include <boost/spirit/include/qi.hpp>
#include <fmt/ostream.h>
#include <fmt/ranges.h>
#include <fmt/std.h>

enum class Foo { bar, baz, qux, quux, corge, grault, garply, waldo, fred=
, plugh, xyzzy, thud };

static inline std::ostream& operator<<(std::ostream& os, Foo f) {
    switch (f) {
        case Foo::bar:    return os << "bar";
        case Foo::baz:    return os << "baz";
        case Foo::qux:    return os << "qux";
        case Foo::quux:   return os << "quux";
        case Foo::corge:  return os << "corge";
        case Foo::grault: return os << "grault";
        case Foo::garply: return os << "garply";
        case Foo::waldo:  return os << "waldo";
        case Foo::fred:   return os << "fred";
        case Foo::plugh:  return os << "plugh";
        case Foo::xyzzy:  return os << "xyzzy";
        case Foo::thud:   return os << "thud";
        default: return os << "???";
    }
}

using Num   =3D boost::multiprecision::cpp_dec_float_50;
using Coord =3D std::tuple<Num, Num, Num>;
template <> struct fmt::formatter<Foo> : ostream_formatter {};
template <> struct fmt::formatter<Num> : ostream_formatter {};

using Token  =3D std::variant<Foo, Num>;
using Tokens =3D std::vector<Token>;

namespace qi =3D boost::spirit::qi;
struct FooParser : qi::symbols<char, Foo> {
    FooParser() {
        add("bar", Foo::bar)("baz", Foo::baz)("qux", Foo::qux)("quux", F=
oo::quux)("corge", Foo::corge)(
            "grault", Foo::grault)("garply", Foo::garply)("waldo", Foo::=
waldo)("fred", Foo::fred)(
            "plugh", Foo::plugh)("xyzzy", Foo::xyzzy)("thud", Foo::thud);
    }
} const foo;

namespace qi =3D boost::spirit::qi;
template <typename It> struct ParseTokens : qi::grammar<It, std::vector<=
Token>()> {
    ParseTokens() : ParseTokens::base_type(start) {
        boost::phoenix::function on_foo_ { [this](Foo f) { on_foo(f); } =
};
        boost::phoenix::function on_num_ { [this](Num n) { on_number(n);=
 } };

        using namespace qi::labels;
        start %=3D qi::skip(qi::space)[                             //
            *(num_[on_num_(_1)] | qi::no_case[foo_][on_foo_(_1)]) //
        ];
    }

    boost::signals2::signal<void(Num num)> on_number;
    boost::signals2::signal<void(Foo foo)> on_foo;

  private:

    qi::rule<It, std::vector<Token>()> start;
    FooParser                          foo_;
    qi::real_parser<Num>               num_;
};

int main() {
    ParseTokens<std::string_view::const_iterator> file_;
    file_.on_foo.connect([](Foo f) { fmt::print("Event Foo: {}\n", f); }=
);

    std::string_view input =3D         R"(1.1 2.2 QuX 2. 3.  1 2 3 -1.1 =
-2.2 -3.3 -.1 -.2 -.3
                -1. -2. -3.  xyzzy .3e3 1.e1 2.e2 3.e3
                1e1 COrGe 2e2 3e3 1.e1 waldo 2.e2 3.e3)";

    std::vector<Token> coords;
    if (parse(begin(input), end(input), file_, coords))
        fmt::print("Parsed:\n {}\n", coords);
    else
        fmt::print("Failed to parse\n");
}

Printing

Event Foo: qux
Event Foo: xyzzy
Event Foo: corge
Event Foo: waldo
Parsed:
 [variant(1.1), variant(2.2), variant(qux), variant(2), variant(3), vari=
ant(1), variant(2), variant(3), variant(-1.1), variant(-2.2), variant(-3=
.3), variant(-0.1), variant(-0.2), variant(-0.3), variant(-1), variant(-=
2), variant(-3), variant(xyzzy), variant(300), variant(10), variant(200)=
, variant(3000), variant(10), variant(corge), variant(200), variant(3000=
), variant(10), variant(waldo), variant(200), variant(3000)]


> That for abstractions like a listener component can then respond with =
appropriate user space call backs, possibly involving context, probably =
also the synthesized attribute, and so on. The precise shape and argumen=
ts of said callbacks, tentative until I get my arms around the X3 SA mec=
hanism.

In X3 everything is potentially simpler - at least for the compiler: htt=
ps://coliru.stacked-crooked.com/a/57671f7c64b7d768

I suspect an X/Y problem hiding in the focus on SA. You can always just =
write some code and then ask when you get stuck, instead of painting air=
 castles and assuming solutions ahead of time. Of course, planning is ha=
lf the job, but it helps to know the tools and limitations if you do.
--c8ebda69a2dd4b0186da76e74cb1e1ed
Content-Type: text/html;charset=utf-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html><html><head><title></title><style type=3D"text/css">p.Mso=
Normal,p.MsoNoSpacing{margin:0}</style></head><body><div>On Sat, Jun 29,=
 2024, at 7:45 PM, Michael Powell wrote:<br></div><blockquote type=3D"ci=
te" id=3D"qt" style=3D""><div dir=3D"ltr"><div class=3D"qt-gmail_quote">=
<blockquote class=3D"qt-gmail_quote" style=3D"margin-top:0px;margin-righ=
t:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-l=
eft-style:solid;border-left-color:rgb(204, 204, 204);padding-left:1ex;">=
<div dir=3D"ltr"><div class=3D"qt-gmail_quote"><div>Huh, nice, very inte=
resting. The key is the&nbsp;boost::multiprecision::cpp_dec_float_50 coo=
rdinate value, I suppose. Everything else being punctuation, arrangement=
, etc.<br></div><div><br></div><div>How about for semantic actions? Are =
they still supported? For instance, when I encounter a production, attri=
bute, synthesis, I'd like to raise that as a signal, for instance, that =
a listener subscribing to the parser may subscribe and follow, respond, =
otherwise populate the DSL.<br></div></div></div></blockquote><div><br><=
/div><div>Need a bit of guidance where SA are concerned. <br></div><div>=
<br></div></div></div></blockquote><div>With all due respect, I think yo=
u're making things unnecessarily complicated by focusing on SA's from th=
e get go. I'd focus on the functional requirements first and foremost.<b=
r></div><div><br></div><div>If you insist on an event-based parser you m=
ight be better off just using `int_parser` directly without even botheri=
ng about the rule machinery, since IMHO Spirit's non-terminal parsers sh=
ine _without_ semantic actions =C2=B9<br></div><div><br></div><div>=C2=B9=
 <a href=3D"https://stackoverflow.com/questions/8259440/boost-spirit-sem=
antic-actions-are-evil">https://stackoverflow.com/questions/8259440/boos=
t-spirit-semantic-actions-are-evil</a><br></div><div><br></div><div><br>=
</div><blockquote type=3D"cite" id=3D"qt" style=3D""><div dir=3D"ltr"><d=
iv class=3D"qt-gmail_quote"><div>If I have a rule that wants to synthesi=
ze an enumerated value, let's say, and the RHS was an alternatives of ch=
ars (below), how do I do that, what goes in the SA, and where?<br></div>=
</div></div></blockquote><div><br></div><div>I'd do this: <a href=3D"htt=
ps://coliru.stacked-crooked.com/a/93d68b17f9f11662">https://coliru.stack=
ed-crooked.com/a/93d68b17f9f11662</a><br></div><div><br></div><div><span=
 class=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-se=
rif;"><span class=3D"size" style=3D"font-size:0.889em;">#include &lt;boo=
st/spirit/home/x3.hpp&gt;<br></span></span></div><div><span class=3D"fon=
t" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span c=
lass=3D"size" style=3D"font-size:0.889em;">#include &lt;iostream&gt;<br>=
</span></span></div><div><span class=3D"font" style=3D"font-family:menlo=
, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-s=
ize:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D=
"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"siz=
e" style=3D"font-size:0.889em;">enum class Foo { bar, baz, qux, quux, co=
rge, grault, garply, waldo, fred, plugh, xyzzy, thud };<br></span></span=
></div><div><span class=3D"font" style=3D"font-family:menlo, consolas, m=
onospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;"=
><br></span></span></div><div><span class=3D"font" style=3D"font-family:=
menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"f=
ont-size:0.889em;">static inline std::ostream&amp; operator&lt;&lt;(std:=
:ostream&amp; os, Foo f) {<br></span></span></div><div><span class=3D"fo=
nt" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span =
class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; switch (f=
) {<br></span></span></div><div><span class=3D"font" style=3D"font-famil=
y:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo=
::bar:&nbsp;&nbsp;&nbsp; return os &lt;&lt; "bar";<br></span></span></di=
v><div><span class=3D"font" style=3D"font-family:menlo, consolas, monosp=
ace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::baz:&nbsp;&nbsp;&nbsp; =
return os &lt;&lt; "baz";<br></span></span></div><div><span class=3D"fon=
t" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span c=
lass=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp; case Foo::qux:&nbsp;&nbsp;&nbsp; return os &lt;&lt; "qux";=
<br></span></span></div><div><span class=3D"font" style=3D"font-family:m=
enlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"fo=
nt-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::q=
uux:&nbsp;&nbsp; return os &lt;&lt; "quux";<br></span></span></div><div>=
<span class=3D"font" style=3D"font-family:menlo, consolas, monospace, sa=
ns-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::corge:&nbsp; return os &lt;&lt=
; "corge";<br></span></span></div><div><span class=3D"font" style=3D"fon=
t-family:menlo, consolas, monospace, sans-serif;"><span class=3D"size" s=
tyle=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=
ase Foo::grault: return os &lt;&lt; "grault";<br></span></span></div><di=
v><span class=3D"font" style=3D"font-family:menlo, consolas, monospace, =
sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::garply: return os &lt;&lt; "=
garply";<br></span></span></div><div><span class=3D"font" style=3D"font-=
family:menlo, consolas, monospace, sans-serif;"><span class=3D"size" sty=
le=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cas=
e Foo::waldo:&nbsp; return os &lt;&lt; "waldo";<br></span></span></div><=
div><span class=3D"font" style=3D"font-family:menlo, consolas, monospace=
, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::fred:&nbsp;&nbsp; return o=
s &lt;&lt; "fred";<br></span></span></div><div><span class=3D"font" styl=
e=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D=
"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp; case Foo::plugh:&nbsp; return os &lt;&lt; "plugh";<br></span></sp=
an></div><div><span class=3D"font" style=3D"font-family:menlo, consolas,=
 monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em=
;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::xyzzy:&nbsp; ret=
urn os &lt;&lt; "xyzzy";<br></span></span></div><div><span class=3D"font=
" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span cl=
ass=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp; case Foo::thud:&nbsp;&nbsp; return os &lt;&lt; "thud";<br><=
/span></span></div><div><span class=3D"font" style=3D"font-family:menlo,=
 consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-si=
ze:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: return =
os &lt;&lt; "???";<br></span></span></div><div><span class=3D"font" styl=
e=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D=
"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; }<br></span></spa=
n></div><div><span class=3D"font" style=3D"font-family:menlo, consolas, =
monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;=
">}<br></span></span></div><div><span class=3D"font" style=3D"font-famil=
y:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;"><br></span></span></div><div><span class=3D"font" s=
tyle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=
=3D"size" style=3D"font-size:0.889em;">namespace x3 =3D boost::spirit::x=
3;<br></span></span></div><div><span class=3D"font" style=3D"font-family=
:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"=
font-size:0.889em;"><br></span></span></div><div><span class=3D"font" st=
yle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D=
"size" style=3D"font-size:0.889em;">x3::symbols&lt;Foo&gt; const foo =3D=
 {<br></span></span></div><div><span class=3D"font" style=3D"font-family=
:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"=
font-size:0.889em;">&nbsp;&nbsp;&nbsp; { "bar",&nbsp;&nbsp;&nbsp; Foo::b=
ar&nbsp;&nbsp;&nbsp; },<br></span></span></div><div><span class=3D"font"=
 style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span cla=
ss=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; { "baz",&nbs=
p;&nbsp;&nbsp; Foo::baz&nbsp;&nbsp;&nbsp; },<br></span></span></div><div=
><span class=3D"font" style=3D"font-family:menlo, consolas, monospace, s=
ans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbs=
p;&nbsp; { "qux",&nbsp;&nbsp;&nbsp; Foo::qux&nbsp;&nbsp;&nbsp; },<br></s=
pan></span></div><div><span class=3D"font" style=3D"font-family:menlo, c=
onsolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size=
:0.889em;">&nbsp;&nbsp;&nbsp; { "quux",&nbsp;&nbsp; Foo::quux&nbsp;&nbsp=
; },<br></span></span></div><div><span class=3D"font" style=3D"font-fami=
ly:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;">&nbsp;&nbsp;&nbsp; { "corge",&nbsp; Foo::corge&nbsp=
; },<br></span></span></div><div><span class=3D"font" style=3D"font-fami=
ly:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;">&nbsp;&nbsp;&nbsp; { "grault", Foo::grault },<br></=
span></span></div><div><span class=3D"font" style=3D"font-family:menlo, =
consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-siz=
e:0.889em;">&nbsp;&nbsp;&nbsp; { "garply", Foo::garply },<br></span></sp=
an></div><div><span class=3D"font" style=3D"font-family:menlo, consolas,=
 monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em=
;">&nbsp;&nbsp;&nbsp; { "waldo",&nbsp; Foo::waldo&nbsp; },<br></span></s=
pan></div><div><span class=3D"font" style=3D"font-family:menlo, consolas=
, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889e=
m;">&nbsp;&nbsp;&nbsp; { "fred",&nbsp;&nbsp; Foo::fred&nbsp;&nbsp; },<br=
></span></span></div><div><span class=3D"font" style=3D"font-family:menl=
o, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-=
size:0.889em;">&nbsp;&nbsp;&nbsp; { "plugh",&nbsp; Foo::plugh&nbsp; },<b=
r></span></span></div><div><span class=3D"font" style=3D"font-family:men=
lo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font=
-size:0.889em;">&nbsp;&nbsp;&nbsp; { "xyzzy",&nbsp; Foo::xyzzy&nbsp; },<=
br></span></span></div><div><span class=3D"font" style=3D"font-family:me=
nlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"fon=
t-size:0.889em;">&nbsp;&nbsp;&nbsp; { "thud",&nbsp;&nbsp; Foo::thud&nbsp=
;&nbsp; }<br></span></span></div><div><span class=3D"font" style=3D"font=
-family:menlo, consolas, monospace, sans-serif;"><span class=3D"size" st=
yle=3D"font-size:0.889em;">};<br></span></span></div><div><span class=3D=
"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><sp=
an class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><=
div><span class=3D"font" style=3D"font-family:menlo, consolas, monospace=
, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">int mai=
n() {<br></span></span></div><div><span class=3D"font" style=3D"font-fam=
ily:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;">&nbsp;&nbsp;&nbsp; std::string_view input =3D "bar,=
 baz, QuX, QuUx, CoRgE, gRAULT, GARPLY,\n"<br></span></span></div><div><=
span class=3D"font" style=3D"font-family:menlo, consolas, monospace, san=
s-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=
&nbsp;&nbsp; "WALDO, fred, plugh, xyzzy, thud";<br></span></span></div><=
div><span class=3D"font" style=3D"font-family:menlo, consolas, monospace=
, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;"><br></s=
pan></span></div><div><span class=3D"font" style=3D"font-family:menlo, c=
onsolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size=
:0.889em;">&nbsp;&nbsp;&nbsp; std::vector&lt;Foo&gt; result;<br></span><=
/span></div><div><span class=3D"font" style=3D"font-family:menlo, consol=
as, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.88=
9em;">&nbsp;&nbsp;&nbsp; if (phrase_parse(input.begin(), input.end(), x3=
::no_case[foo] % ',', x3::space, result))<br></span></span></div><div><s=
pan class=3D"font" style=3D"font-family:menlo, consolas, monospace, sans=
-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (auto f : result)<br></span></span></d=
iv><div><span class=3D"font" style=3D"font-family:menlo, consolas, monos=
pace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cou=
t &lt;&lt; static_cast&lt;int&gt;(f) &lt;&lt; "(" &lt;&lt; f &lt;&lt; ")=
" &lt;&lt; std::endl;<br></span></span></div><div><span class=3D"font" s=
tyle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=
=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; else<br></span=
></span></div><div><span class=3D"font" style=3D"font-family:menlo, cons=
olas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.=
889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; std::cout &lt;&lt; "P=
arsing failed\n";<br></span></span></div><div><span class=3D"font" style=
=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"=
size" style=3D"font-size:0.889em;">}<br></span></span></div><div><span c=
lass=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-seri=
f;"><span class=3D"size" style=3D"font-size:0.889em;"></span></span><br>=
</div><blockquote type=3D"cite" id=3D"qt" style=3D""><div dir=3D"ltr"><d=
iv class=3D"qt-gmail_quote"><div>Another thing I might like to do is tri=
gger a signal from said SA, if that is possible to do, which I am assumi=
ng it is. <br></div></div></div></blockquote><div><br></div><div>Correct=
.<br></div><div><br></div><div>E.g. in Qi: <a href=3D"https://coliru.sta=
cked-crooked.com/a/a862c00ef67851c0">https://coliru.stacked-crooked.com/=
a/a862c00ef67851c0</a><br></div><div><br></div><div><span class=3D"font"=
 style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span cla=
ss=3D"size" style=3D"font-size:0.889em;">#include &lt;boost/fusion/adapt=
ed/std_tuple.hpp&gt;</span><span class=3D"size" style=3D"font-size:0.889=
em;"><br></span></span></div><div><span class=3D"font" style=3D"font-fam=
ily:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;">#include &lt;boost/multiprecision/cpp_dec_float.hpp=
&gt;</span><span class=3D"size" style=3D"font-size:0.889em;"><br></span>=
</span></div><div><span class=3D"font" style=3D"font-family:menlo, conso=
las, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.8=
89em;">#include &lt;boost/phoenix.hpp&gt;</span><span class=3D"size" sty=
le=3D"font-size:0.889em;"><br></span></span></div><div><span class=3D"fo=
nt" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span =
class=3D"size" style=3D"font-size:0.889em;">#include &lt;boost/signals2.=
hpp&gt;</span><span class=3D"size" style=3D"font-size:0.889em;"><br></sp=
an></span></div><div><span class=3D"font" style=3D"font-family:menlo, co=
nsolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:=
0.889em;">#include &lt;boost/spirit/include/qi.hpp&gt;</span><span class=
=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><div><spa=
n class=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-s=
erif;"><span class=3D"size" style=3D"font-size:0.889em;">#include &lt;fm=
t/ostream.h&gt;</span><span class=3D"size" style=3D"font-size:0.889em;">=
<br></span></span></div><div><span class=3D"font" style=3D"font-family:m=
enlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"fo=
nt-size:0.889em;">#include &lt;fmt/ranges.h&gt;</span><span class=3D"siz=
e" style=3D"font-size:0.889em;"><br></span></span></div><div><span class=
=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;">=
<span class=3D"size" style=3D"font-size:0.889em;">#include &lt;fmt/std.h=
&gt;</span><span class=3D"size" style=3D"font-size:0.889em;"><br></span>=
</span></div><div><span class=3D"font" style=3D"font-family:menlo, conso=
las, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.8=
89em;"><br></span></span></div><div><span class=3D"font" style=3D"font-f=
amily:menlo, consolas, monospace, sans-serif;"><span class=3D"size" styl=
e=3D"font-size:0.889em;">enum class Foo { bar, baz, qux, quux, corge, gr=
ault, garply, waldo, fred, plugh, xyzzy, thud };</span><span class=3D"si=
ze" style=3D"font-size:0.889em;"><br></span></span></div><div><span clas=
s=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;"=
><span class=3D"size" style=3D"font-size:0.889em;"><br></span></span></d=
iv><div><span class=3D"font" style=3D"font-family:menlo, consolas, monos=
pace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">sta=
tic inline std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, Foo =
f) {</span><span class=3D"size" style=3D"font-size:0.889em;"><br></span>=
</span></div><div><span class=3D"font" style=3D"font-family:menlo, conso=
las, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.8=
89em;">&nbsp;&nbsp;&nbsp; switch (f) {</span><span class=3D"size" style=3D=
"font-size:0.889em;"><br></span></span></div><div><span class=3D"font" s=
tyle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=
=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp; case Foo::bar:&nbsp;&nbsp;&nbsp; return os &lt;&lt; "bar";</sp=
an><span class=3D"size" style=3D"font-size:0.889em;"><br></span></span><=
/div><div><span class=3D"font" style=3D"font-family:menlo, consolas, mon=
ospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::baz:&nbsp;&nbsp;&nbs=
p; return os &lt;&lt; "baz";</span><span class=3D"size" style=3D"font-si=
ze:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D"=
font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"size=
" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
; case Foo::qux:&nbsp;&nbsp;&nbsp; return os &lt;&lt; "qux";</span><span=
 class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><di=
v><span class=3D"font" style=3D"font-family:menlo, consolas, monospace, =
sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::quux:&nbsp;&nbsp; return os =
&lt;&lt; "quux";</span><span class=3D"size" style=3D"font-size:0.889em;"=
><br></span></span></div><div><span class=3D"font" style=3D"font-family:=
menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"f=
ont-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::=
corge:&nbsp; return os &lt;&lt; "corge";</span><span class=3D"size" styl=
e=3D"font-size:0.889em;"><br></span></span></div><div><span class=3D"fon=
t" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span c=
lass=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp; case Foo::grault: return os &lt;&lt; "grault";</span><span=
 class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><di=
v><span class=3D"font" style=3D"font-family:menlo, consolas, monospace, =
sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::garply: return os &lt;&lt; "=
garply";</span><span class=3D"size" style=3D"font-size:0.889em;"><br></s=
pan></span></div><div><span class=3D"font" style=3D"font-family:menlo, c=
onsolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size=
:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::waldo:&n=
bsp; return os &lt;&lt; "waldo";</span><span class=3D"size" style=3D"fon=
t-size:0.889em;"><br></span></span></div><div><span class=3D"font" style=
=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"=
size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp; case Foo::fred:&nbsp;&nbsp; return os &lt;&lt; "fred";</span><span=
 class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><di=
v><span class=3D"font" style=3D"font-family:menlo, consolas, monospace, =
sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::plugh:&nbsp; return os &lt;&=
lt; "plugh";</span><span class=3D"size" style=3D"font-size:0.889em;"><br=
></span></span></div><div><span class=3D"font" style=3D"font-family:menl=
o, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-=
size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case Foo::xyzz=
y:&nbsp; return os &lt;&lt; "xyzzy";</span><span class=3D"size" style=3D=
"font-size:0.889em;"><br></span></span></div><div><span class=3D"font" s=
tyle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=
=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp; case Foo::thud:&nbsp;&nbsp; return os &lt;&lt; "thud";</span><=
span class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div=
><div><span class=3D"font" style=3D"font-family:menlo, consolas, monospa=
ce, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default: return os &lt;&lt; "???";=
</span><span class=3D"size" style=3D"font-size:0.889em;"><br></span></sp=
an></div><div><span class=3D"font" style=3D"font-family:menlo, consolas,=
 monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em=
;">&nbsp;&nbsp;&nbsp; }</span><span class=3D"size" style=3D"font-size:0.=
889em;"><br></span></span></div><div><span class=3D"font" style=3D"font-=
family:menlo, consolas, monospace, sans-serif;"><span class=3D"size" sty=
le=3D"font-size:0.889em;">}</span><span class=3D"size" style=3D"font-siz=
e:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D"f=
ont-family:menlo, consolas, monospace, sans-serif;"><span class=3D"size"=
 style=3D"font-size:0.889em;"><br></span></span></div><div><span class=3D=
"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><sp=
an class=3D"size" style=3D"font-size:0.889em;">using Num&nbsp;&nbsp; =3D=
 boost::multiprecision::cpp_dec_float_50;</span><span class=3D"size" sty=
le=3D"font-size:0.889em;"><br></span></span></div><div><span class=3D"fo=
nt" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span =
class=3D"size" style=3D"font-size:0.889em;">using Coord =3D std::tuple&l=
t;Num, Num, Num&gt;;</span><span class=3D"size" style=3D"font-size:0.889=
em;"><br></span></span></div><div><span class=3D"font" style=3D"font-fam=
ily:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;">template &lt;&gt; struct fmt::formatter&lt;Foo&gt; =
: ostream_formatter {};</span><span class=3D"size" style=3D"font-size:0.=
889em;"><br></span></span></div><div><span class=3D"font" style=3D"font-=
family:menlo, consolas, monospace, sans-serif;"><span class=3D"size" sty=
le=3D"font-size:0.889em;">template &lt;&gt; struct fmt::formatter&lt;Num=
&gt; : ostream_formatter {};</span><span class=3D"size" style=3D"font-si=
ze:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D"=
font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"size=
" style=3D"font-size:0.889em;"><br></span></span></div><div><span class=3D=
"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><sp=
an class=3D"size" style=3D"font-size:0.889em;">using Token&nbsp; =3D std=
::variant&lt;Foo, Num&gt;;</span><span class=3D"size" style=3D"font-size=
:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D"fo=
nt-family:menlo, consolas, monospace, sans-serif;"><span class=3D"size" =
style=3D"font-size:0.889em;">using Tokens =3D std::vector&lt;Token&gt;;<=
/span><span class=3D"size" style=3D"font-size:0.889em;"><br></span></spa=
n></div><div><span class=3D"font" style=3D"font-family:menlo, consolas, =
monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;=
"><br></span></span></div><div><span class=3D"font" style=3D"font-family=
:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"=
font-size:0.889em;">namespace qi =3D boost::spirit::qi;</span><span clas=
s=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><div><sp=
an class=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-=
serif;"><span class=3D"size" style=3D"font-size:0.889em;">struct FooPars=
er : qi::symbols&lt;char, Foo&gt; {</span><span class=3D"size" style=3D"=
font-size:0.889em;"><br></span></span></div><div><span class=3D"font" st=
yle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D=
"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; FooParser() {</sp=
an><span class=3D"size" style=3D"font-size:0.889em;"><br></span></span><=
/div><div><span class=3D"font" style=3D"font-family:menlo, consolas, mon=
ospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add("bar", Foo::bar)("baz", Fo=
o::baz)("qux", Foo::qux)("quux", Foo::quux)("corge", Foo::corge)(</span>=
<span class=3D"size" style=3D"font-size:0.889em;"><br></span></span></di=
v><div><span class=3D"font" style=3D"font-family:menlo, consolas, monosp=
ace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "grault",=
 Foo::grault)("garply", Foo::garply)("waldo", Foo::waldo)("fred", Foo::f=
red)(</span><span class=3D"size" style=3D"font-size:0.889em;"><br></span=
></span></div><div><span class=3D"font" style=3D"font-family:menlo, cons=
olas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.=
889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p; "plugh", Foo::plugh)("xyzzy", Foo::xyzzy)("thud", Foo::thud);</span><=
span class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div=
><div><span class=3D"font" style=3D"font-family:menlo, consolas, monospa=
ce, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp=
;&nbsp;&nbsp; }</span><span class=3D"size" style=3D"font-size:0.889em;">=
<br></span></span></div><div><span class=3D"font" style=3D"font-family:m=
enlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"fo=
nt-size:0.889em;">} const foo;</span><span class=3D"size" style=3D"font-=
size:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D=
"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"siz=
e" style=3D"font-size:0.889em;"><br></span></span></div><div><span class=
=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;">=
<span class=3D"size" style=3D"font-size:0.889em;">namespace qi =3D boost=
::spirit::qi;</span><span class=3D"size" style=3D"font-size:0.889em;"><b=
r></span></span></div><div><span class=3D"font" style=3D"font-family:men=
lo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font=
-size:0.889em;">template &lt;typename It&gt; struct ParseTokens : qi::gr=
ammar&lt;It, std::vector&lt;Token&gt;()&gt; {</span><span class=3D"size"=
 style=3D"font-size:0.889em;"><br></span></span></div><div><span class=3D=
"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><sp=
an class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; ParseT=
okens() : ParseTokens::base_type(start) {</span><span class=3D"size" sty=
le=3D"font-size:0.889em;"><br></span></span></div><div><span class=3D"fo=
nt" style=3D"font-family:menlo, consolas, monospace, sans-serif;"><span =
class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp; boost::phoenix::function on_foo_ { [this](Foo f) { on_foo=
(f); } };</span><span class=3D"size" style=3D"font-size:0.889em;"><br></=
span></span></div><div><span class=3D"font" style=3D"font-family:menlo, =
consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-siz=
e:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boost::phoenix::f=
unction on_num_ { [this](Num n) { on_number(n); } };</span><span class=3D=
"size" style=3D"font-size:0.889em;"><br></span></span></div><div><span c=
lass=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-seri=
f;"><span class=3D"size" style=3D"font-size:0.889em;"><br></span></span>=
</div><div><span class=3D"font" style=3D"font-family:menlo, consolas, mo=
nospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">=
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using namespace qi::labels;</=
span><span class=3D"size" style=3D"font-size:0.889em;"><br></span></span=
></div><div><span class=3D"font" style=3D"font-family:menlo, consolas, m=
onospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;"=
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start %=3D qi::skip(qi::spac=
e)[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span class=3D"size" style=3D"font-=
size:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D=
"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"siz=
e" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p;&nbsp;&nbsp;&nbsp;&nbsp; *(num_[on_num_(_1)] | qi::no_case[foo_][on_fo=
o_(_1)]) //</span><span class=3D"size" style=3D"font-size:0.889em;"><br>=
</span></span></div><div><span class=3D"font" style=3D"font-family:menlo=
, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-s=
ize:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ];</span><span =
class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><div=
><span class=3D"font" style=3D"font-family:menlo, consolas, monospace, s=
ans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&nbs=
p;&nbsp; }</span><span class=3D"size" style=3D"font-size:0.889em;"><br><=
/span></span></div><div><span class=3D"font" style=3D"font-family:menlo,=
 consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-si=
ze:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D"=
font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"size=
" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; boost::signals2::signa=
l&lt;void(Num num)&gt; on_number;</span><span class=3D"size" style=3D"fo=
nt-size:0.889em;"><br></span></span></div><div><span class=3D"font" styl=
e=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D=
"size" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; boost::signals2::=
signal&lt;void(Foo foo)&gt; on_foo;</span><span class=3D"size" style=3D"=
font-size:0.889em;"><br></span></span></div><div><span class=3D"font" st=
yle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D=
"size" style=3D"font-size:0.889em;"><br></span></span></div><div><span c=
lass=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-seri=
f;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp; private:</s=
pan><span class=3D"size" style=3D"font-size:0.889em;"><br></span></span>=
</div><div><span class=3D"font" style=3D"font-family:menlo, consolas, mo=
nospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">=
<br></span></span></div><div><span class=3D"font" style=3D"font-family:m=
enlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D"fo=
nt-size:0.889em;">&nbsp;&nbsp;&nbsp; qi::rule&lt;It, std::vector&lt;Toke=
n&gt;()&gt; start;</span><span class=3D"size" style=3D"font-size:0.889em=
;"><br></span></span></div><div><span class=3D"font" style=3D"font-famil=
y:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=3D=
"font-size:0.889em;">&nbsp;&nbsp;&nbsp; FooParser&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; foo_;</span><spa=
n class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><d=
iv><span class=3D"font" style=3D"font-family:menlo, consolas, monospace,=
 sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;&n=
bsp;&nbsp; qi::real_parser&lt;Num&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num_;</span><span clas=
s=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><div><sp=
an class=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-=
serif;"><span class=3D"size" style=3D"font-size:0.889em;">};</span><span=
 class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div><di=
v><span class=3D"font" style=3D"font-family:menlo, consolas, monospace, =
sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;"><br></spa=
n></span></div><div><span class=3D"font" style=3D"font-family:menlo, con=
solas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0=
.889em;">int main() {</span><span class=3D"size" style=3D"font-size:0.88=
9em;"><br></span></span></div><div><span class=3D"font" style=3D"font-fa=
mily:menlo, consolas, monospace, sans-serif;"><span class=3D"size" style=
=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; ParseTokens&lt;std::string_vi=
ew::const_iterator&gt; file_;</span><span class=3D"size" style=3D"font-s=
ize:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D=
"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"siz=
e" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp; file_.on_foo.connect(=
[](Foo f) { fmt::print("Event Foo: {}\n", f); });</span><span class=3D"s=
ize" style=3D"font-size:0.889em;"><br></span></span></div><div><span cla=
ss=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-serif;=
"><span class=3D"size" style=3D"font-size:0.889em;"><br></span></span></=
div><div><span class=3D"font" style=3D"font-family:menlo, consolas, mono=
space, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&n=
bsp;&nbsp;&nbsp; std::string_view input =3D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp=
;&nbsp;&nbsp;&nbsp; R"(1.1 2.2 QuX 2. 3.&nbsp; 1 2 3 -1.1 -2.2 -3.3 -.1 =
-.2 -.3</span><span class=3D"size" style=3D"font-size:0.889em;"><br></sp=
an></span></div><div><span class=3D"font" style=3D"font-family:menlo, co=
nsolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:=
0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n=
bsp;&nbsp;&nbsp;&nbsp;&nbsp; -1. -2. -3.&nbsp; xyzzy .3e3 1.e1 2.e2 3.e3=
</span><span class=3D"size" style=3D"font-size:0.889em;"><br></span></sp=
an></div><div><span class=3D"font" style=3D"font-family:menlo, consolas,=
 monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em=
;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb=
sp;&nbsp;&nbsp;&nbsp; 1e1 COrGe 2e2 3e3 1.e1 waldo 2.e2 3.e3)";</span><s=
pan class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div>=
<div><span class=3D"font" style=3D"font-family:menlo, consolas, monospac=
e, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;"><br></=
span></span></div><div><span class=3D"font" style=3D"font-family:menlo, =
consolas, monospace, sans-serif;"><span class=3D"size" style=3D"font-siz=
e:0.889em;">&nbsp;&nbsp;&nbsp; std::vector&lt;Token&gt; coords;</span><s=
pan class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div>=
<div><span class=3D"font" style=3D"font-family:menlo, consolas, monospac=
e, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp;=
&nbsp;&nbsp; if (parse(begin(input), end(input), file_, coords))</span><=
span class=3D"size" style=3D"font-size:0.889em;"><br></span></span></div=
><div><span class=3D"font" style=3D"font-family:menlo, consolas, monospa=
ce, sans-serif;"><span class=3D"size" style=3D"font-size:0.889em;">&nbsp=
;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fmt::print("Parsed:\n {}\n", coord=
s);</span><span class=3D"size" style=3D"font-size:0.889em;"><br></span><=
/span></div><div><span class=3D"font" style=3D"font-family:menlo, consol=
as, monospace, sans-serif;"><span class=3D"size" style=3D"font-size:0.88=
9em;">&nbsp;&nbsp;&nbsp; else</span><span class=3D"size" style=3D"font-s=
ize:0.889em;"><br></span></span></div><div><span class=3D"font" style=3D=
"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D"siz=
e" style=3D"font-size:0.889em;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs=
p; fmt::print("Failed to parse\n");</span><span class=3D"size" style=3D"=
font-size:0.889em;"><br></span></span></div><div><span class=3D"font" st=
yle=3D"font-family:menlo, consolas, monospace, sans-serif;"><span class=3D=
"size" style=3D"font-size:0.889em;">}</span><span class=3D"size" style=3D=
"font-size:0.889em;"><br></span></span></div><div><br></div><div><span c=
lass=3D"font" style=3D"font-family:menlo, consolas, monospace, sans-seri=
f;"><span class=3D"size" style=3D"font-size:0.889em;">Printing</span></s=
pan><br></div><div><br></div><div><pre class=3D"f0" style=3D"display:inl=
ine-block;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:=
0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0p=
x;">Event Foo: qux<br></pre></div><div><pre class=3D"f0" style=3D"displa=
y:inline-block;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-=
left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-le=
ft:0px;">Event Foo: xyzzy<br></pre></div><div><pre class=3D"f0" style=3D=
"display:inline-block;margin-top:0px;margin-right:0px;margin-bottom:0px;=
margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;pad=
ding-left:0px;">Event Foo: corge<br></pre></div><div><pre class=3D"f0" s=
tyle=3D"display:inline-block;margin-top:0px;margin-right:0px;margin-bott=
om:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:=
0px;padding-left:0px;">Event Foo: waldo<br></pre></div><div><pre class=3D=
"f0" style=3D"display:inline-block;margin-top:0px;margin-right:0px;margi=
n-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-b=
ottom:0px;padding-left:0px;">Parsed:<br></pre></div><div><pre class=3D"f=
0" style=3D"display:inline-block;margin-top:0px;margin-right:0px;margin-=
bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bot=
tom:0px;padding-left:0px;"> [variant(1.1), variant(2.2), variant(qux), v=
ariant(2), variant(3), variant(1), variant(2), variant(3), variant(-1.1)=
, variant(-2.2), variant(-3.3), variant(-0.1), variant(-0.2), variant(-0=
.3), variant(-1), variant(-2), variant(-3), variant(xyzzy), variant(300)=
, variant(10), variant(200), variant(3000), variant(10), variant(corge),=
 variant(200), variant(3000), variant(10), variant(waldo), variant(200),=
 variant(3000)]<br></pre></div><div><br></div><div><br></div><blockquote=
 type=3D"cite" id=3D"qt" style=3D""><div dir=3D"ltr"><div class=3D"qt-gm=
ail_quote"><div>That for abstractions like a listener component can then=
 respond with appropriate user space call backs, possibly involving cont=
ext, probably also the synthesized attribute, and so on. The precise sha=
pe and arguments of said callbacks, tentative until&nbsp;I get my arms a=
round the X3 SA mechanism.<br></div></div></div></blockquote><div><br></=
div><div>In X3 everything is potentially simpler - at least for the comp=
iler: <a href=3D"https://coliru.stacked-crooked.com/a/57671f7c64b7d768">=
https://coliru.stacked-crooked.com/a/57671f7c64b7d768</a><br></div><div>=
<br></div><div>I  suspect an X/Y problem hiding in the focus on SA. You =
can always just write some code and then ask when you get stuck, instead=
 of painting air castles and assuming solutions ahead of time. Of course=
, planning is half the job, but it helps to know the tools and limitatio=
ns if you do.<br></div></body></html>
--c8ebda69a2dd4b0186da76e74cb1e1ed--


--===============2709943256669688816==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


--===============2709943256669688816==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Spirit-general mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/spirit-general

--===============2709943256669688816==--