====== Language plugins : Implementation ====== ===== parse_top_item ===== The function ''parse_top_item'' must be provided. Usually you can just copy this. /*--------------------------------------------------------------------------*/ void LANG_VERILOG::parse_top_item(CS& cmd, CARD_LIST* Scope) { cmd.get_line("gnucap-verilog>"); new__instance(cmd, NULL, Scope); } /*--------------------------------------------------------------------------*/ It parses one line of input, where the definition of "line" may differ depending on the language. The string, in this case ''"gnucap-verilog>"'' is used as a prompt in interactive mode, and is suppressed when reading from a file. For educational purposes, the code for ''new_''''_instance'' follows. You do not need to duplicate it. You do need to provide ''find_type_in_string'', which returns the type as a string, by scanning the input. ''parse_item'' is shown here. It dispatches to one of ''parse_module'', ''parse_instance'', ''parse_paramset'', ''parse_comment'', or ''parse_command'', which you must provide. /*--------------------------------------------------------------------------*/ void LANGUAGE::new__instance(CS& cmd, MODEL_SUBCKT* owner, CARD_LIST* Scope) { if (cmd.is_end()) { // nothing }else{ std::string type = find_type_in_string(cmd); if (const CARD* proto = find_proto(type, owner)) { CARD* new_instance = proto->clone_instance(); assert(new_instance); new_instance->set_owner(owner); CARD* x = parse_item(cmd, new_instance); if (x) { assert(Scope); Scope->push_back(x); }else{ } }else{ cmd.warn(bDANGER, type + ": no match"); } } } /*--------------------------------------------------------------------------*/ CARD* LANGUAGE::parse_item(CS& cmd, CARD* c) { // See Stroustrup 15.4.5 // If you can think of a better way, tell me. // It must be in the LANGUAGE class, not CARD. if (dynamic_cast(c)) { return parse_module(cmd, prechecked_cast(c)); }else if (dynamic_cast(c)) { return parse_instance(cmd, prechecked_cast(c)); }else if (dynamic_cast(c)) { return parse_paramset(cmd, prechecked_cast(c)); }else if (dynamic_cast< DEV_COMMENT*>(c)) { return parse_comment(cmd, prechecked_cast(c)); }else if (dynamic_cast(c)) { return parse_command(cmd, prechecked_cast(c)); }else{untested(); incomplete(); unreachable(); return NULL; } } /*--------------------------------------------------------------------------*/