5 #include <boost/fusion/include/at_c.hpp>
6 #include <boost/fusion/sequence/intrinsic/at_c.hpp>
7 #include <boost/spirit/home/x3.hpp>
11 namespace BooleanFunctionParser
17 std::vector<Token> tokens;
33 const auto VariableAction = [&tokens](
auto& ctx) {
35 std::stringstream
name;
36 name << std::string(1, boost::fusion::at_c<0>(_attr(ctx))) << boost::fusion::at_c<1>(_attr(ctx));
40 const auto VariableIndexAction = [&tokens](
auto& ctx) {
42 std::stringstream
name;
43 name << std::string(1, boost::fusion::at_c<0>(_attr(ctx))) << boost::fusion::at_c<1>(_attr(ctx)) << boost::fusion::at_c<2>(_attr(ctx)) << boost::fusion::at_c<3>(_attr(ctx))
44 << boost::fusion::at_c<4>(_attr(ctx));
47 const auto ConstantAction = [&tokens](
auto& ctx) {
48 auto value = (_attr(ctx) ==
'0') ? BooleanFunction::Value::ZERO : BooleanFunction::Value::ONE;
56 namespace x3 = boost::spirit::x3;
58 const auto AndRule = x3::char_(
"& *")[AndAction];
59 const auto NotRule = x3::lit(
"!")[NotAction];
60 const auto NotSuffixRule = x3::lit(
"'")[NotSuffixAction];
61 const auto OrRule = x3::char_(
"|+")[OrAction];
62 const auto XorRule = x3::lit(
"^")[XorAction];
64 const auto BracketOpenRule = x3::lit(
"(")[BracketOpenAction];
65 const auto BracketCloseRule = x3::lit(
")")[BracketCloseAction];
67 const auto VariableRule = x3::lexeme[(x3::char_(
"a-zA-Z") >> *x3::char_(
"a-zA-Z0-9_"))][VariableAction];
68 const auto VariableIndexRule = x3::lexeme[(x3::char_(
"a-zA-Z") >> *x3::char_(
"a-zA-Z0-9_") >> x3::char_(
"(") >> x3::int_ >> x3::char_(
")"))][VariableIndexAction];
69 const auto ConstantRule = x3::lexeme[x3::char_(
"0-1")][ConstantAction];
71 auto iter = expression.begin();
72 const auto ok = x3::phrase_parse(iter,
77 +(AndRule | NotRule | NotSuffixRule | OrRule | XorRule | VariableIndexRule | VariableRule | ConstantRule | BracketOpenRule | BracketCloseRule),
83 if (!ok || (iter != expression.end()))
85 return ERR(
"could not to parse Boolean function '" + expression +
"': " + std::string(iter, expression.end()));
Result< std::vector< Token > > parse_with_liberty_grammar(const std::string &expression)
static Token BracketOpen()
static Token BracketClose()
static Token Constant(std::vector< BooleanFunction::Value > value)
static Token Variable(std::string name, u16 size)