|
Scarlet Line - SOFTWARE DESIGN & DEVELOPMENT |
[Home]->[Documentation]->[Syntac Universal Parser]->[Other Grammars]->[Extended Backus-Naur form (EBNF)]->[Symbols]->[symexp_compound_rfc]
|
ebnf::symexp_compound_rfc
|
| symexp_compound_rfc[parser_type & tree, vertex_token rule_symbol, vertex_token parent_value, arc_token & current_link, parser_type::arc_label_type & current_dollar_label] ::= digit* ("*" digit*)? "[" symbol_expression[tree, rule_symbol, parent_value, current_link, current_dollar_label] lws? "]" { long _var1 = atol($1); long _var2 = atol($6); if ($3.empty()) { /*| no */'*' ... |/**/ if ($1.empty()) /* no modifier at all */ { _var2 = 1;/* zero or one */ } else /*| just one set of digits, no */'*' ... |/**/ { _var2 = _var1;/* exactly this many */ } } if (_var2 > (_var1 + 0x100)) { std::cerr << $file << ':' << $line << ": warning: a large finite iteration range [ " << _var1 << " -> " << _var2 << " ] can use excessive stack space, consider unbounding the range" << std::endl; } current_link = tree.add_iterate_condition(current_link, _var1, _var2); tree.add_dollar_label_before(tree.arc_label(* current_link), current_dollar_label); current_dollar_label = tree.arc_label(* current_link); } | (digit+ ("*" digit*)? | "*" digit*) symexp_element[tree, rule_symbol, parent_value, current_link, current_dollar_label] { long _var1 = atol($2); long _var2 = std::max(atol($7), atol($10)); if ($6.empty() && $9.empty()) /*| no */'*' whatsoever |/**/ _var2 = _var1; if (_var2 > (_var1 + 0x100)) { std::cerr << $file << ':' << $line << ": warning: a large finite iteration range [ " << _var1 << " -> " << _var2 << " ] can use excessive stack space, consider unbounding the range" << std::endl; } current_link = tree.add_iterate_condition(current_link, _var1, _var2); tree.add_dollar_label_before(tree.arc_label(* current_link), current_dollar_label); current_dollar_label = tree.arc_label(* current_link); } /*| Default is Comma-seperated lists, can be changed by re-defining list_seperator:*/ element (list_seperator element){n-1,m-1} element (lws? (',' lws?)+ element){n-1,m-1} element ( ','+ element){n-1,m-1} lws == [ \t\r\n]+ |/**/ | digit* "#" digit* symexp_element[tree, rule_symbol, parent_value, current_link, current_dollar_label] { long _var1 = atol($1); long _var2 = atol($4); vertex_token _element = parser_type::arc_to(* current_link); parser_type::arc_label_type _element_label = current_dollar_label; current_link = tree.add_concat_condition(current_link); tree.add_dollar_label_before(tree.arc_label(* current_link), current_dollar_label); current_dollar_label = tree.arc_label(* current_link); vertex_token my_value = parser_type::arc_to(* current_link); my_value = parser_type::arc_to(* (tree.insert_iterate_node(my_value, _var1?_var1-1:0, _var2?_var2-1:0))); vertex_token concat_value = parser_type::arc_to(* (tree.insert_concat_node(my_value))); tree.insert_symbol(concat_value, tree.get_list_symbol().c_str()); arc_token _sub_element = tree.insert_arc(tree.arc(concat_value, _element)); tree.set_dollar_label(tree.arc_label(* _sub_element), tree.dollar_label(_element_label)); } |
|
|