expression_modifier[parser_type & tree, arc_token & current_link, parser_type::arc_label_type & current_dollar_label] ::= "?" { current_link = tree.add_iterate_condition(current_link, 0, 1); tree.add_dollar_label_before(tree.arc_label(* current_link), current_dollar_label); current_dollar_label = tree.arc_label(* current_link); } | "+" { current_link = tree.add_iterate_condition(current_link, 1, 0); tree.add_dollar_label_before(tree.arc_label(* current_link), current_dollar_label); current_dollar_label = tree.arc_label(* current_link); } | "*" { current_link = tree.add_iterate_condition(current_link, 0, 0); tree.add_dollar_label_before(tree.arc_label(* current_link), current_dollar_label); current_dollar_label = tree.arc_label(* current_link); } | "{" ( ( digit+ ("," digit*)? ) | ( "," digit* ) ) "}" { long _first = atol($4), _second; if (!$3.empty()) { /* first form*/ if (!$6.empty()) _second = atol($9); else _second = _first; } else { /* second form*/ _second = atol($13); } if (_second > (_first + 0x100)) { std::cerr << $file << ':' << $line << ": warning: a large finite iteration range [ " << _first << " -> " << _second << " ] can use excessive stack space, consider unbounding the range" << std::endl; } current_link = tree.add_iterate_condition(current_link, _first, _second); tree.add_dollar_label_before(tree.arc_label(* current_link), current_dollar_label); current_dollar_label = tree.arc_label(* current_link); } |