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;
20 const auto var_size = [&var_sizes](
const std::string&
name) ->
u16 {
21 if (
auto it = var_sizes.find(
name); it != var_sizes.end())
42 const auto VariableAction = [&tokens, &var_size](
auto& ctx) {
44 std::stringstream
name;
45 name << std::string(1, boost::fusion::at_c<0>(_attr(ctx))) << boost::fusion::at_c<1>(_attr(ctx));
49 const auto VariableIndexAction = [&tokens, &var_size](
auto& ctx) {
51 std::stringstream
name;
52 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))
53 << boost::fusion::at_c<4>(_attr(ctx));
56 const auto ConstantAction = [&tokens](
auto& ctx) {
57 auto value = (_attr(ctx) ==
'0') ? BooleanFunction::Value::ZERO : BooleanFunction::Value::ONE;
65 namespace x3 = boost::spirit::x3;
67 const auto AndRule = x3::char_(
"& *")[AndAction];
68 const auto NotRule = x3::lit(
"!")[NotAction];
69 const auto NotSuffixRule = x3::lit(
"'")[NotSuffixAction];
70 const auto OrRule = x3::char_(
"|+")[OrAction];
71 const auto XorRule = x3::lit(
"^")[XorAction];
73 const auto BracketOpenRule = x3::lit(
"(")[BracketOpenAction];
74 const auto BracketCloseRule = x3::lit(
")")[BracketCloseAction];
76 const auto VariableRule = x3::lexeme[(x3::char_(
"a-zA-Z") >> *x3::char_(
"a-zA-Z0-9_"))][VariableAction];
77 const auto VariableIndexRule = x3::lexeme[(x3::char_(
"a-zA-Z") >> *x3::char_(
"a-zA-Z0-9_") >> x3::char_(
"(") >> x3::int_ >> x3::char_(
")"))][VariableIndexAction];
78 const auto ConstantRule = x3::lexeme[x3::char_(
"0-1")][ConstantAction];
80 auto iter = expression.begin();
81 const auto ok = x3::phrase_parse(iter,
86 +(AndRule | NotRule | NotSuffixRule | OrRule | XorRule | VariableIndexRule | VariableRule | ConstantRule | BracketOpenRule | BracketCloseRule),
92 if (!ok || (iter != expression.end()))
94 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, const std::map< std::string, u16 > &var_sizes={})
static Token BracketOpen()
static Token BracketClose()
static Token Constant(std::vector< BooleanFunction::Value > value)
static Token Variable(std::string name, u16 size)