Scarlet Line home page Scarlet Line - SOFTWARE DESIGN & DEVELOPMENT

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

Expand All
Collapse All
Contents

ebnf::expression_modifier Locate in Contents

Declaration Locate in Contents

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

Composition Locate in Contents

symexp_compound expression_modifier Alternation Node '?' '+' '*' Concatenation Node '{' Alternation Node '}' Concatenation Node Concatenation Node Concatenation Node Alternation Node ',' Iteration Node digit Iteration Node Concatenation Node @ digit digit ',' Iteration Node digit

State Machine Locate in Contents

start:977:$0 final:978:$0 digit|{930|$9|931} digit|{930|$18|931} digit|{930|$9|931} digit|{930|$18|931} digit|{930|$9|931} digit|{930|$14|931} digit|{930|$14|931}