пытаюсь создать вымышленный конечный автомат. последовательность выполнения действий в программе: 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>
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Использую плагин InputMask и столкнулся с такой проблемой: пользователи жалуются, что на некоторых устройствах (телефоны на Android OS) не вводится...
Доброго времени сутокПодскажите, пожалуйста как сократить код?
На странице есть динамические ссылки a открывающие iframe с панорамой