: FileGrammar::base_type(
file) {
[
op(qi::_val, Node::kRoot)];
shell = rep::confix(
"#!", qi::eol)[*(qi::char_[qi::_a += qi::_1]
- qi::eol)][
op(qi::_val,Node::kShell)]
statement = rep::qi::iter_pos[qi::_a = qi::_1]
condition = (qi::lit(
"#ifdef")[
op(qi::_a,Node::kIfdef)]
| qi::lit(
"#ifndef")[
op(qi::_a,Node::kIfndef)])
>> property[
op(qi::_val,qi::_1)]
>> (*statement[
op(qi::_a,qi::_1)])[
op(qi::_val, qi::_a)]
>> -(qi::lit(
"#else")[
op(qi::_b,Node::kElse)]
>> *statement[
op(qi::_b,qi::_1)])[
op(qi::_val,qi::_b)]
>> qi::lit(
"#endif")[
op(qi::_val, Node::kCondition)];
[
op(qi::_val, Node::kInclude)];
units = qi::lit(
"#units")
[
op(qi::_val, Node::kUnits)];
[
op(qi::_val, Node::kPrintOptions)];
qi::lit(
"on")[
op(qi::_val, Node::kPrintOn)]
| qi::lit(
"off")[
op(qi::_val, Node::kPrintOff)]
];
qi::lit(
"printtree")[
op(qi::_val, Node::kPrintTree)]
];
[
op(qi::_val, Node::kDumpFile)];
[
op(qi::_val, Node::kAssign)]
>> ';';
property = rep::qi::iter_pos[
op(qi::_val, qi::_1)]
[
op(qi::_val, Node::kProperty)];
property[
op(qi::_val, Node::kPropertyRef)];
oper = rep::qi::iter_pos[
op(qi::_val, qi::_1)]
>> (qi::lit(
"=")[
op(qi::_val, Node::kEqual)]
|
qi::lit(
"+=")[
op(qi::_val, Node::kPlusEqual)]
|
qi::lit(
"-=")[
op(qi::_val, Node::kMinusEqual)]);
value = rep::qi::iter_pos[qi::_a = qi::_1]
>>
[qi::_val = qi::_1][
op(qi::_val, qi::_a)]
;
|
enc::char_('[')[qi::_val=']']
|
enc::char_('{')[qi::_val='}'];
>> -(value[
op(qi::_val,qi::_1)] %
',')
)[
op(qi::_val,Node::kVector)];
>> -(
pair[
op(qi::_val, qi::_1)] %
',')
>> enc::char_('}'))
[
op(qi::_val, Node::kMap)];
>> value[
op(qi::_val,qi::_1)]
[
op(qi::_val,Node::kPair)];
(
gstring[
op(qi::_val, qi::_1)][
op(qi::_val, Node::kString)])
|
(gbool[
op(qi::_val, qi::_1)][
op(qi::_val, Node::kBool)])
|
(greal[qi::_val = qi::_1]);
}