示例#1
0
void FaToDFA::setFA(FiniteAutomata *_FA)
{
    this->FA = *_FA;
    if(this->FA.hasEpsilon())
        emit sendStatusBarMessage(tr("WARNING: Input finite automata has epsilon rules."));
    not_dfa_widget->clearStatus();
    setMode(mode);
}
示例#2
0
StateNode::StateNode(DiagramScene *scene, FiniteAutomata *_FA, QString uniqueName)
{
    FA = _FA;
    myscene = scene;
    node_name = uniqueName;
    firstInit();

    connect(this,SIGNAL(sendStatusBarMessage(QString)),scene,SIGNAL(sendStatusBarMessage(QString)));
    connect(this,SIGNAL(FA_changed(FiniteAutomata*)),scene,SIGNAL(FA_changed(FiniteAutomata*)));
    connect(this,SIGNAL(xChanged()),this,SLOT(positionChanged()));
    connect(this,SIGNAL(yChanged()),this,SLOT(positionChanged()));

    FA->addState(node_name);
    emit FA_changed(FA);


}
示例#3
0
void FaToDFA::nextStep()
{
    if(FA.startState == "")
    {
        emit sendStatusBarMessage("WARNING: Input FA has not start state.");
        return;
    }
    if(FA.hasEpsilon())
    {
        emit sendStatusBarMessage("ERROR: Input FA has epsilon rules.");
        return;
    }

    algorithm_widget->enablePrev();
    switch(prewInstruction)
    {
        case HEADER:
            actInstruction = VAR_INIT;
        break;
        case VAR_INIT:
            actInstruction = DO;
        break;
        case DO:
            actInstruction = DO_INIT;
        break;
        case DO_INIT:
            alphabet = FA.alphabet.toList();
            alphabet.sort();
            if( ! alphabet.empty())
                actInstruction = FOREACH_A;
            else
                actInstruction = IF_FINAL;
            break;
        case FOREACH_A:
            actInstruction = INIT_DOUBLE_PRIME_Q;
        break;
        case INIT_DOUBLE_PRIME_Q:
            rules = QSet<ComputationalRules>();
            foreach(QString from,act_state)
            {
                rules += FA.findRule_FromSymbol(from,a).toSet();
            }
            if( ! rules.empty())
                actInstruction = FOREACH_RULE_IN_Q;
            else
                actInstruction = IF_Q_NEW;
        break;
        case FOREACH_RULE_IN_Q:
            actInstruction = DOUBLE_PRIME_Q;
        break;
        case DOUBLE_PRIME_Q:
            if( ! rules.empty())
                actInstruction = FOREACH_RULE_IN_Q;
            else
                actInstruction = IF_Q_NEW;
        break;
        case IF_Q_NEW:
            actInstruction = IF_DOUBLE_PRIME_Q;
        break;
        case IF_DOUBLE_PRIME_Q:
            if ( ! alphabet.empty())
                actInstruction = FOREACH_A;
            else
                actInstruction = IF_FINAL;
        break;
        case IF_FINAL:
            actInstruction = WHILE_NEW;
        break;
        case WHILE_NEW:
            if ( ! Q_new.empty())
                actInstruction = DO;
            else
                actInstruction = last_instruction;
        break;
    }