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