示例#1
0
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));
 }
示例#2
0
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();
}