Scarlet Line home page Scarlet Line - SOFTWARE DESIGN & DEVELOPMENT

[Home]->[Documentation]->[Syntac Universal Parser]->[Other Grammars]->[Extended Backus-Naur form (EBNF)]->[Symbols]->[symexp_compound_rfc]

Expand All
Collapse All
Contents

ebnf::symexp_compound_rfc Locate in Contents

Declaration Locate in Contents

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));

            }

Composition Locate in Contents

symexp_compound symexp_compound_rfc Alternation Node Concatenation Node Concatenation Node Concatenation Node Iteration Node Alternation Node '[' symbol_expression Alternation Node '\\]' Alternation Node symexp_element Iteration Node '#' Iteration Node symexp_element digit Concatenation Node @ lws @ Concatenation Node Concatenation Node digit digit '*' Iteration Node Concatenation Node Alternation Node '*' Iteration Node digit digit Iteration Node Concatenation Node @ digit digit '*' Iteration Node digit<std::string>

State Machine Locate in Contents

start:981:$0 digit|{930|$3|931} digit|{930|$18|931} digit|{930|$31|931} final:982:$0 digit|{930|$27|931} digit|{930|$3|931} digit|{930|$18|931} digit|{930|$31|931} digit|{930|$27|931} symexp_element|{851|$28|852} digit|{930|$18|931} digit|{930|$8|931} digit|{930|$34|931} digit<std::string>|{885|$23|886} digit|{930|$8|931} symbol_expression|{843|$10|844} digit|{930|$34|931} symexp_element|{851|$35|852} digit<std::string>|{885|$23|886} lws|{735|$12|736}