Scarlet Line home page Scarlet Line - SOFTWARE DESIGN & DEVELOPMENT

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

Expand All
Collapse All
Contents

ebnf::symbol_append_union Locate in Contents

Declaration Locate in Contents

symbol_append_union[parser_type & tree, vertex_token & return_value, arc_token & current_link, parser_type::arc_label_type & current_dollar_label] ::= { std::string _symbol_name, _param_list;/* }*/
        label[_symbol_name] ( "[" (param_list { assign(_param_list,$0);/* } ) */"]" )? lws? expands_to_union
            {
            if ( tree.is_symbol_defined(_symbol_name.c_str()) )
                {
                return_value = tree.get_symbol_id(_symbol_name.c_str());
                for (arc_token _childx = tree.out_arcs_begin(return_value), _childy = tree.out_arcs_end(return_value);/* _childx != _childy; ++ _childx)*/
                    {
                    current_link = _childx;
                    }
                current_dollar_label = tree.arc_label(* current_link);
                tree.add_comment(return_value, "\n\n");
                }
            else
                { /* new symbol*/
                std::cerr << $file << ':' << $line << ": warning: appending union to undefined symbol: " << _symbol_name << std::endl;
                return_value = tree.create_symbol(_symbol_name.c_str(), $line);
                tree.reset_current_symbol(return_value);
                tree.set_is_symbol_implicit_ws(return_value);
                tree.set_symbol_param_list(return_value, _param_list);
                tree.set_primary_symbol_if_blank(_symbol_name);
                tree.set_default_type(return_value);
                if (_M_verbose)
                    {
                    std::cerr << "Define Symbol (union)" << return_value << ":" << _symbol_name << std::endl;
                    }
                /* new-symbol := <no-match> | ...*/
                current_link = tree.insert_terminal_range_list(return_value, "[]");
                current_dollar_label = tree.arc_label(* current_link);
                tree.add_dollar_label(current_dollar_label);
                }
            }

Composition Locate in Contents

production_rule symbol_append_union Concatenation Node label Alternation Node Alternation Node expands_to_union Concatenation Node @ lws @ '[' param_list<std::string> '\\]'

State Machine Locate in Contents

start:993:$0 label|{818|$1|819} final:994:$0 param_list<std::string>|{834|$5|835} lws|{735|$8|736} expands_to_union|{995|$9|996}