void TopParser::next(TypeDef::Atom *atom,TypeDef::TopRule *rule) { TypeDef::State *state=topState(); TypeDef::Rule *bottom_rule=Find(state->final->actions,atom); if( rule->bottom!=bottom_rule ) { Printf(Exception,"App::TopParser::next(...) : rule mismatch"); } auto args=rule->args.getRange(); auto *ptr=topElements(args.len); for(auto p=args; +p ;++p,++ptr) { if( !IsSame(ptr->element,*p) ) { Printf(Exception,"App::TopParser::next(...) : bad stack"); } } pop(args.len); TypeDef::Kind *result=rule->result; push(result,Transition(topState()->transitions,result)); }
void TopParser::next(TypeDef::Atom *atom) { TypeDef::State *state=topState(); TypeDef::Rule *rule=Find(state->final->actions,atom); if( rule ) { Printf(Exception,"App::TopParser::next(...) : rule mismatch"); } if( atom ) push(atom,Transition(state->transitions,atom)); else check_result(); }
void CritterDialog::_selectAnswer(size_t i) { if (i >= _answers.size()) throw Exception("No answer with number " + std::to_string(i)); auto game = Game::getInstance(); auto dialog = dynamic_cast<CritterInteract*>(game->topState(1)); // @todo optimize int newOffset = dialog->script()->script()->procedures()->at(_functions.at(i))->bodyOffset(); int oldOffset = dialog->script()->programCounter() - 2; deleteAnswers(); dialog->script()->dataStack()->push(0); // arguments counter; dialog->script()->returnStack()->push(oldOffset); // return adrress dialog->script()->setProgramCounter(newOffset); dialog->script()->run(); }