(The answer given below is incorrect, since other conditions were checked in it) There are two arrays - termianl and neterminal. when adding rules, it must be determined to which type of Chomsky grammar the rule being added. Type 3 grammar: inputw1 must contain a single character from neterminal, and inputw2 has a chain of characters from termianl and a character from neterminal, which can be either the first, or the last, or be absent (for example, D -> azdA, A -> Ddz). Context-free grammar: Inputw1 should contain only one character from neterminal, and inputw2 can contain any string of characters from terminal and neterminal, including an empty one (for example, A -> zdA, D -> dzb). Context-sensitive grammar: a line from inputw1 must contain a character from neterminal, which is frustrated with context (for example, S -> abc is context-free, and aS -> abc is context-dependent). I do not understand how to do it correctly so that type 3 is determined.

var terminal = ['a', 'b', 'c']; var term=document.getElementById('terminal').innerHTML = terminal; var neterminal = ['D', 'A', 'Z', 'L']; var neterm = document.getElementById('neterminal').innerHTML = neterminal; function pushTerminal(){ var x = document.getElementById('newTerminal'); var str = term.indexOf(document.getElementById("inputAdd").value); var str2 = neterm.indexOf(document.getElementById("inputAdd").value); if(str == -1 && str2== -1) { term.push(document.getElementById("inputAdd").value); x.innerHTML = term.join(); }else{ alert("Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ ΡƒΠΆΠ΅ сущСствуСт"); } } //функция опрСдСлния Ρ‚ΠΈΠΏΠ° ΠΏΡ€Π°Π²ΠΈΠ»Π° function determineType(str, dict, caseSensitive) { if(!str.length){ return false; } else if (typeof dict === 'string'){ var dict = dict.split(''); } else if (!(dict instanceof Array || !dict.length)){ return false; } var flags = caseSensitive ? 'g' : 'gi'; var idx = -1; var count, result; result = !dict.some(function(v, i){ count = (str.match(new RegExp(v + '',flags))||[]).length; return ((count === 1) && (idx<0)) ? (idx = i, false) : (!count ? false : true); }); return (result && (idx>-1))? idx : false; } var changeStringFromRules = []; var changeStringToRules = []; function pushRules(thisBtn){ var frm = thisBtn.parentElement; var w1 = frm.inputw1.value; var w2 = frm.inputw2.value; var i1 = determineType(w1, neterminal, true); var i2 = determineType(w2, neterminal, true); var rt = (i2 !==false) ? 'ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎ-зависимая Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°' : ((i1!==false)? 'ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎ-свободная Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°' : ''); changeStringFromRules.push(w1); changeStringToRules.push(w2); var li = document.createElement("li"); li.textContent = w1+'-->'+w2 +' '+ rt; document.getElementById('list').appendChild(li); var removeBtn = document.createElement("input"); removeBtn.type = "button"; removeBtn.value = "Π£Π΄Π°Π»ΠΈΡ‚ΡŒ"; removeBtn.onclick = remove; li.appendChild(removeBtn); document.getElementById("list").appendChild(li); } function remove(e) { var el = e.target; el.parentNode.remove(); } 

 <div class="alphabet"> <div class="terminal"> <h2>Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π»Ρ„Π°Π²ΠΈΡ‚: </h2> <div id="terminal"></div> <h2>Новый Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π»Ρ„Π°Π²ΠΈΡ‚: </h2> <div id="newTerminal"></div> <div class="addTerminal"> <h3>Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°</h3> <form> <input id ="inputAdd" type="text"> <input type="button" value="Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ" onclick="pushTerminal()"> </form> </div> </div> <div class="neterminal"> <h2>ΠΠ΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π»Ρ„Π°Π²ΠΈΡ‚: </h2> <div id="neterminal"></div> </div> </div> <div class="addRules"> <h3>Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ</h3> <form> <label>w1:</label><input name="inputw1" type="text"><label> --> w2:</label><input name="inputw2" type="text"> <input type="button" value="Add" onclick="pushRules(this)"> </form> <h3>ΠŸΡ€Π°Π²ΠΈΠ»Π°:</h3> <div class="container_rules"> <ui id="list"></ui> </div> </div> 

  • and what's the problem? - Grundy

1 answer 1

 // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° СдинствСнноС Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² строку str любого элСмСнта массива|строки dict. // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСкс элСмСнта, ΠΈΠ»ΠΈ false (Ссли Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π½Π΅Ρ‚, Π»ΠΈΠ±ΠΎ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ). function singleOcrIdx(str, dict, caseSensitive = false) { if (!str.length) return false; if (typeof dict === 'string') dict = dict.split(''); if (!(dict instanceof Array) || !dict.length) return false; let flags = caseSensitive ? 'g' : 'gi', idx = -1, count, result; result = !dict.some(function(v, i) { count = (str.match(new RegExp(v + '', flags)) || []).length; return ((count === 1) && (idx < 0)) ? (idx = i, false) : (!count ? false : true); }); return (result && (idx > -1)) ? idx : false; } // ----------------------------------------------- var terminal = ['a', 'b', 'c'], neterminal = ['D', 'A', 'Z', 'L'], changeStringFromRules = [], changeStringToRules = []; document.getElementById('terminal').textContent = terminal; document.getElementById('neterminal').textContent = neterminal; function pushRules(thisBtn) { let frm = thisBtn.parentElement, w1 = frm.inputw1.value, w2 = frm.inputw2.value, i1 = singleOcrIdx(w1, neterminal, true), i2 = singleOcrIdx(w2, neterminal, true) rt = (i2 !== false) ? 'type2' : ((i1 !== false) ? 'type1' : ''); changeStringFromRules.push(w1); changeStringToRules.push(w2); let li = document.createElement('li'); li.textContent = `${w1} --> ${w2} ${rt}`; document.getElementById('list').appendChild(li); } 
 body, input { font: 16px monospace; } input { width: 100px; } #terminal, #neterminal { display: inline-block; padding: 4px 8px; margin: 16px 8px; margin-top: 0; border: 1px dashed #ccc; } 
 <span id="terminal"></span> <span id="neterminal"></span> <form> <label>w1:</label><input name="inputw1" type="text"><label> --> w2:</label><input name="inputw2" type="text"> <input type="button" value="Add" onclick="pushRules(this)"> </form> <hr> <h3>Rules:</h3> <div class="container_rules"> <ui id="list"></ui> </div>