реализовать конечный автомат

223
18 апреля 2018, 07:34

пытаюсь создать вымышленный конечный автомат. последовательность выполнения действий в программе: 1) заполняю элементами списки alphabet, listStates, listLabels. 2) добавляю некоторое количество переходов в список listTransitions, где задаю первое состояние, метку и второе состояние. 3) задаю setInit и finalInit. 4) нажимаю кнопку "начать работу". 5) в сurrentState автоматически заносится начальное состояние. 6) в enterLabel вводится метка. 7) нажимаю кнопку Перейти и срабатывает событие go(), в котором должно проверяться: если в списке переходов есть такая метка с заданным текущим состоянием, то переходим во второе состояние, если такой метки с таким текущим состоянием нет, то вывести сообщение такого перехода нет. 8) если переход выполнился, то в currentState записывается второе состояние из выполненного перехода и т.д. пока есть возможность выполнять переходы. Не понимаю, как сделать 5-8 пункт

class FSM { 
    constructor(alphabet, state, transition, label){ 
        this.alphabet = alphabet; 
        this.state = state; 
        this.transition = transition; 
        this.label = label; 
    } 
    // pushAlphabet(); 
    // pushStates(); 
    // pushTransition(); 
} 
var alphabet = []; 
var initStates = []; 
var finalStates = []; 
var labels = []; 
var firstStates = []; 
var secondStates = []; 
function pushAlphabet() { 
    var alph = document.getElementById("inputAddAlphabet").value; 
    if(alph.length == 1){ 
        alphabet.push(alph); 
        var li = document.createElement("li"); 
        li.textContent = alph + " "; 
        document.getElementById("listAlphabet").appendChild(li); 
        document.getElementById("inputAddAlphabet").value = ""; 
 
        var removeBtn = document.createElement("input"); 
        removeBtn.type="button"; 
        removeBtn.value = "Удалить"; 
        removeBtn.onclick = remove; 
        li.appendChild(removeBtn); 
        document.getElementById("listAlphabet").appendChild(li); 
   } else { alert('Вы можете добавить только один символ!');} 
} 
 
 
 
function pushStates() { 
    var state = document.getElementById("inputAddState").value; 
    initStates.push(state); 
    finalStates.push(state); 
    firstStates.push(state); 
    secondStates.push(state); 
 
    var li = document.createElement("li"); 
    li.textContent = state + " "; 
    document.getElementById("listStates").appendChild(li); 
    document.getElementById("inputAddState").value = ""; 
    var removeBtn = document.createElement("input"); 
    removeBtn.type="button"; 
    removeBtn.value = "Удалить"; 
    removeBtn.onclick = remove; 
    li.appendChild(removeBtn); 
    document.getElementById("listStates").appendChild(li); 
} 
 
function pushLabel() { 
    var label = document.getElementById("inputAddLabel").value; 
    labels.push(label); 
 
    var filteredLabel = label.split("").filter(function (c) { 
        return alphabet.indexOf(c)>=0; 
    }).join(""); 
    console.log("label", label); 
    console.log("filterdLabel", filteredLabel); 
    if(filteredLabel) { 
        var li = document.createElement("li"); 
        li.textContent = filteredLabel + " "; 
        document.getElementById("listLabels").appendChild(li); 
        var removeBtn = document.createElement("input"); 
        removeBtn.type = "button"; 
        removeBtn.value = "Удалить"; 
        removeBtn.onclick = remove; 
        li.appendChild(removeBtn); 
        document.getElementById("listLabels").appendChild(li); 
        document.getElementById("inputAddLabel"); 
    }else {alert('Метка на принадлежит алфавиту');} 
} 
 
 
function pushTransitions() { 
var first = document.getElementById("AddFirst").value; 
var listStates = document.getElementById("listStates"); 
var label1 = document.getElementById("AddLabel").value; 
var filteredLabel1 = label1.split("").filter(function (c) { 
    return labels.indexOf(c)>=0; 
}).join(""); 
var second = document.getElementById("AddSecond").value; 
 
if(initStates.indexOf(first)>=0){ 
    if(filteredLabel1){ 
        if(secondStates.indexOf(second)>=0){ 
            var li = document.createElement("li"); 
            li.textContent = "< "+ first + ", " + label1 + ", " + second + " >"; 
            document.getElementById("listTransitions").appendChild(li); 
            var removeBtn = document.createElement("input"); 
            removeBtn.type = "button"; 
            removeBtn.value = "Удалить"; 
            removeBtn.onclick = remove; 
            li.appendChild(removeBtn); 
            document.getElementById("listTransitions").appendChild(li); 
        }else{ alert('Второе состояние не принадлежит к списку состояний');} 
    }else{ alert("Метка не принадлежит списку меток");} 
}else{ alert('Начальное состояние не принадлежит к списку состояний');} 
} 
 
function remove(e) { 
    var el = e.target; 
    el.parentNode.remove(); 
} 
 
function startWorkFSM() { 
    var setInit = document.getElementById('setInit').value; 
    var setFinal = document.getElementById('setFinal').value; 
    var listStates = document.getElementById("listStates"); 
    if(initStates.indexOf(setInit)>0){ 
        if(finalStates.indexOf(finalStates)>0) { 
            //ToDo записать в `currentState` значение из `setInit` 
 
        }else{ 
        alert('Конечное состояние не принадлежит списку состояний'); 
        } 
    }else{alert('Начальное состояние не принадлежит списку состояний');} 
} 
 
function go() { 
    var label1 = document.getElementById("enterLable").value; 
    var filteredLabel1 = label1.split("").filter(function (c) { 
        return labels.indexOf(c)>=0; 
    }).join(""); 
    if(filteredLabel1){ 
        //ToDo пройтись по списку `listTransitions` в поисках перехода со значениями `currentState` && `enterLabel` 
        //ToDO если переход найден, то значение из найденного перехода `secondState` записать в `currentState` 
        //ToDo если переход не найден, то вывести сообщение `переход не выполнен` 
    } 
}
<div class="select_type"> 
    <p>Выберете тип конечного автомата</p> 
    <input id="nfa" type="button" value="НКА" onclick="selectNFA()"> 
    <input id="dfa" type="button" value="ДКА" onclick="selectDFA()"> 
</div> 
<div class="setting_fa"> 
    <h3>Настроить конечный автомат</h3> 
    <div class="alphabet"> 
        <label>Алфавит</label> 
        <form> 
            <input id="inputAddAlphabet" type="text"> 
            <input type="button" value="Добавить" onclick="pushAlphabet()"> 
        </form> 
        <ul id="listAlphabet"></ul> 
    </div> 
    <div class="states"> 
        <label>Состояния</label> 
        <form> 
            <input type="text" id="inputAddState"> 
            <input type="button" value="Добавить состояние" onclick="pushStates()"> 
        </form> 
        <ul id="listStates"></ul> 
    </div> 
    <div class="labels"> 
        <label>Метки</label> 
        <form> 
            <input type="text" id="inputAddLabel"> 
            <input type="button" value="Добавить метку" onclick="pushLabel()"> 
        </form> 
        <ul id="listLabels"></ul> 
    </div> 
    <div class="setInit"> 
        <label>Начальное состояние: </label><input type="text" id="setInit"> 
    </div> 
    <div class="setFinal"> 
        <label>Финальное состояние: </label><input type="text" id="setFinal"> 
    </div> 
     <input type="button" value="Начать работу с КА" onclick="stratWorkFSM()"> 
</div> 
<div class="transitons"> 
    <h3>Переходы</h3> 
 
    <label>Начальное состояние: </label><input type="text" id="AddInit"> 
    <label>Метка: </label><input type="text" id="AddLabel"> 
    <label>Второе состояние: </label> <input type="text" id="AddSecond"> 
    <input type="button" value="Добавить переход" onclick="pushTransitions()"> 
    <ul id="listTransitions"></ul> 
</div> 
<div> 
    <h3>Работа с КА</h3> 
    <form> 
        <label>Вы в состоянии:</label><input type="text" id="currentState"> 
        <label>Введите метку перехода:</label><input type="text" id="enterLabel"> 
        <input type="button" value="Перейти" onclick="go()"> 
    </form> 
</div>

READ ALSO
InputMask для Android

InputMask для Android

Использую плагин InputMask и столкнулся с такой проблемой: пользователи жалуются, что на некоторых устройствах (телефоны на Android OS) не вводится...

227
Подскажите как сократить код на jQuery (событие при hover)

Подскажите как сократить код на jQuery (событие при hover)

Доброго времени сутокПодскажите, пожалуйста как сократить код?

186
Открыть iframe в новой вкладке в Safari

Открыть iframe в новой вкладке в Safari

На странице есть динамические ссылки a открывающие iframe с панорамой

201