: qi::grammar<Iterator, Node(), Skipper> {
FileGrammar() : FileGrammar::base_type(file) {
file = -shell[op(qi::_val,qi::_1)] >>
*(statement[op(qi::_val, qi::_1)])
[op(qi::_val, Node::kRoot)];
shell = rep::confix("#!", qi::eol)[*(qi::char_[qi::_a += qi::_1]
- qi::eol)][op(qi::_val,Node::kShell)]
[op(qi::_val,qi::_a)];
statement = rep::qi::iter_pos[qi::_a = qi::_1]
>> (include | assign | units | print_options | pragma
| condition)[qi::_val = qi::_1][op(qi::_val,qi::_a)];
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)];
include = qi::lit("#include")
>> gstring[op(qi::_val, qi::_1)]
[op(qi::_val, Node::kInclude)];
units = qi::lit("#units")
>> gstring[op(qi::_val, qi::_1)]
[op(qi::_val, Node::kUnits)];
print_options = qi::lit("#printOptions") >> qi::lit("full")
[op(qi::_val, Node::kPrintOptions)];
pragma = qi::lit("#pragma") >> (pragma_print | pragma_tree |
pragma_dump_file);
pragma_print = qi::lit("print") >> enc::no_case[
qi::lit("on")[op(qi::_val, Node::kPrintOn)]
| qi::lit("off")[op(qi::_val, Node::kPrintOff)]
];
pragma_tree = enc::no_case[
qi::lit("printtree")[op(qi::_val, Node::kPrintTree)]
];
pragma_dump_file = qi::lit("dumpfile") >> gstring[op(qi::_val, qi::_1)]
[op(qi::_val, Node::kDumpFile)];
assign = property[op(qi::_val, qi::_1)]
[op(qi::_val, Node::kAssign)]
>> oper[op(qi::_val, qi::_1)]
>> value[op(qi::_val, qi::_1)]
>> ';';
property = rep::qi::iter_pos[op(qi::_val, qi::_1)]
>> (gidentifier[op(qi::_val, qi::_1)] % '.')
[op(qi::_val, Node::kProperty)];
property_ref %= -qi::lit('@') >>
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]
>>
(map_value | vector_value | simple_value | property |
property_ref)
[qi::_val = qi::_1][op(qi::_val, qi::_a)]
;
begin_vector = enc::char_('(')[qi::_val=')']
|
enc::char_('[')[qi::_val=']']
|
enc::char_('{')[qi::_val='}'];
end_vector = qi::char_(qi::_r1);
vector_value = (begin_vector[qi::_a = qi::_1]
>> -(value[op(qi::_val,qi::_1)] % ',')
>> end_vector(qi::_a)
)[op(qi::_val,Node::kVector)];
map_value = (enc::char_('{')
>> -(pair[op(qi::_val, qi::_1)] % ',')
>> enc::char_('}'))
[op(qi::_val, Node::kMap)];
pair = simple_value[op(qi::_val,qi::_1)] >> ':'