4 #include <boost/fusion/include/at_c.hpp>
5 #include <boost/fusion/sequence/intrinsic/at_c.hpp>
6 #include <boost/spirit/home/x3.hpp>
11 namespace BooleanFunctionParser
17 std::vector<Token> tokens;
31 const auto VariableAction = [&tokens](
auto& ctx) {
35 std::stringstream
name;
36 name << std::string(1, boost::fusion::at_c<0>(_attr(ctx)));
37 name << boost::fusion::at_c<1>(_attr(ctx));
41 const auto VariableIndexAction = [&tokens](
auto& ctx) {
46 std::stringstream
name;
47 name << std::string(1, boost::fusion::at_c<1>(_attr(ctx)));
48 name << boost::fusion::at_c<2>(_attr(ctx));
49 name << boost::fusion::at_c<3>(_attr(ctx));
50 name << boost::fusion::at_c<4>(_attr(ctx));
51 name << boost::fusion::at_c<5>(_attr(ctx));
54 const auto ConstantAction = [&tokens](
auto& ctx) {
55 const auto value = (_attr(ctx) ==
'0') ? BooleanFunction::Value::ZERO : BooleanFunction::Value::ONE;
63 namespace x3 = boost::spirit::x3;
65 const auto AndRule = x3::lit(
"&")[AndAction];
66 const auto NotRule = x3::char_(
"!~")[NotAction];
67 const auto OrRule = x3::lit(
"|")[OrAction];
68 const auto XorRule = x3::lit(
"^")[XorAction];
70 const auto BracketOpenRule = x3::lit(
"(")[BracketOpenAction];
71 const auto BracketCloseRule = x3::lit(
")")[BracketCloseAction];
73 const auto VariableRule = x3::lexeme[(x3::char_(
"a-zA-Z") >> *x3::char_(
"a-zA-Z0-9_"))][VariableAction];
74 const auto VariableIndexRoundBracketRule =
75 x3::lexeme[(-(x3::char_(
"\\")) >> x3::char_(
"a-zA-Z") >> *x3::char_(
"a-zA-Z0-9_") >> x3::char_(
"(") >> x3::int_ >> x3::char_(
")"))][VariableIndexAction];
76 const auto VariableIndexSquareBracketRule =
77 x3::lexeme[(-(x3::char_(
"\\")) >> x3::char_(
"a-zA-Z") >> *x3::char_(
"a-zA-Z0-9_") >> x3::char_(
"[") >> x3::int_ >> x3::char_(
"]"))][VariableIndexAction];
78 const auto VariableIndexRule = VariableIndexRoundBracketRule | VariableIndexSquareBracketRule;
80 const auto ConstantRule = x3::lexeme[x3::char_(
"0-1")][ConstantAction];
81 const auto ConstantPrefixRule = x3::lit(
"0b") >> x3::lexeme[x3::char_(
"0-1")][ConstantAction];
82 const auto ConstantSuffixRule = x3::lexeme[x3::char_(
"0-1") >> x3::lit(
"'b1")][ConstantAction];
84 auto iter = expression.begin();
85 const auto ok = x3::phrase_parse(
91 +(AndRule | NotRule | OrRule | XorRule | VariableIndexRule | VariableRule | ConstantSuffixRule | ConstantPrefixRule | ConstantRule | BracketOpenRule | BracketCloseRule),
95 if (!ok || (iter != expression.end()))
97 return ERR(
"could not parse Boolean function '" + expression +
"': " + std::string(iter, expression.end()));
Result< std::vector< Token > > parse_with_standard_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)