Advertisement
Garey

Interpreter

Dec 3rd, 2018
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var script = "";
  2. var hasErrored = false;
  3.  
  4. function addLineToScript(newLine) {
  5.     script += newLine + "\n";
  6. }
  7.  
  8. function replaceAll(str, find, replace) {
  9.     return str.replace(new RegExp(find, "g"), replace);
  10. }
  11.  
  12. function parseConditionalExpression(expression) {
  13.     expression = replaceAll(expression, " е идентично с", " === ");
  14.     expression = replaceAll(expression, " е равно на", " == ");
  15.     expression = replaceAll(expression, " не е равно на ", " != ");
  16.     expression = replaceAll(expression, " и ", " && ");
  17.     expression = replaceAll(expression, " или ", " || ");
  18.     expression = expression.replace(/([a-zA-Z0-9]+) е вътре в ([a-zA-Z0-9]+)/g, "$2.indexOf($1) > -1");
  19.     return expression;
  20. }
  21.  
  22. function showError(error, parseError) {
  23.     document.getElementById("error").className = "alert alert-danger";
  24.     document.getElementById("error-text").innerHTML += error + "<br>";
  25.  
  26.     if(parseError) {
  27.         document.getElementById("error-title").innerHTML = "О не! Има грешки в кода ти:<br>";
  28.     } else {
  29.         document.getElementById("error-title").innerHTML = "О не! Получи се грешка, когато се опитахме да пуснем кода ти:<br>";
  30.     }
  31.  
  32.     hasErrored = true;
  33. }
  34.  
  35. function hideError() {
  36.     document.getElementById("error").className = "hidden";
  37.     document.getElementById("error-text").innerHTML = "";
  38.  
  39.     hasErrored = false;
  40. }
  41.  
  42. function parseFunctionCalls(expression) {
  43.     return expression.replace(/<([^<>]+?) с параметри ([^<>]+?)>/, function(x,y,z) {
  44.         return intoFunctionName(y) + "(" + z + ")";
  45.     });
  46. }
  47.  
  48. function removeIndent(expression) {
  49.     return expression.replace(/^ +/, "");
  50. }
  51.  
  52. function intoFunctionName(expression) {
  53.     return replaceAll(expression, " ", "_");
  54. }
  55.  
  56. function checkForError(matches, lineNumber) {
  57.     if (matches == null) {
  58.         showError("Не разбрах ред номер " + (lineNumber + 1), true);
  59.         return false;
  60.     }
  61.     return true;
  62. }
  63.  
  64. function execute() {
  65.     var x = document.getElementById("text").value.split("\n");
  66.     script = "";
  67.     hideError();
  68.     for (var i = 0; i < x.length; i++) {
  69.        
  70.         x[i] = parseFunctionCalls(x[i]);
  71.         x[i] = removeIndent(x[i]);
  72.  
  73.         var line = x[i].split(" ");
  74.         var matches = "";
  75.         if (line[0] === "") {
  76.  
  77.             // Do nothing
  78.  
  79.         } else if (line[0] === "Задай" && line[1] === "стойност" && line[2] === "на") {
  80.  
  81.             matches = /Задай стойност на (.+) да е (.+)/g.exec(x[i]);
  82.  
  83.             if(checkForError(matches, i)) {
  84.                 addLineToScript(matches[1] + " = " + matches[2]);
  85.             }
  86.  
  87.         } else if (line[0] === "Покажи") {
  88.  
  89.             matches = /Покажи (.+)/g.exec(x[i]);
  90.  
  91.             if(checkForError(matches, i)) {
  92.                 addLineToScript("alert(" + matches[1] + ")");
  93.             }
  94.  
  95.         } else if (line[0] === "Попитай") {
  96.  
  97.             matches = /Попитай (".+") за (.+)/g.exec(x[i]);
  98.  
  99.             if(checkForError(matches, i)) {
  100.                 addLineToScript("var " + matches[2] + " = prompt(" + matches[1] + ")");
  101.             }
  102.  
  103.         } else if (line[0] === "Ако") {
  104.  
  105.             matches = /Ако (.+), тогава направи:/g.exec(x[i]);
  106.  
  107.             if(checkForError(matches, i)) {
  108.                 addLineToScript("if(" + parseConditionalExpression(matches[1]) + ") {");
  109.             }
  110.  
  111.         } else if (line[0] === "Край") {
  112.  
  113.             addLineToScript("}");
  114.  
  115.         } else if (line[0] === "Или") {
  116.  
  117.             if(line[1] == "в" && line[2] == "противен" && line[3] == "случай:") {
  118.                 addLineToScript("} else {");
  119.             } else {
  120.                 matches = /Или ако (.+), тогава направи:/g.exec(x[i]);
  121.  
  122.                 if(checkForError(matches, i)) {
  123.                     addLineToScript("} else if(" + parseConditionalExpression(matches[1]) + ") {");
  124.                 }
  125.             }
  126.  
  127.         } else if (line[0] === "Докато") {
  128.  
  129.             matches = /Докато (.+) прави:/g.exec(x[i]);
  130.  
  131.             if(checkForError(matches, i)) {
  132.                 addLineToScript("while(" + parseConditionalExpression(matches[1]) + ") {");
  133.             }
  134.  
  135.  
  136.         } else if (line[0] === "Брой") {
  137.  
  138.             matches = /Брой докато (.+) стигне (-?\d+):/g.exec(x[i]);
  139.  
  140.             if(checkForError(matches, i)) {
  141.                 var incrementor = "--";
  142.                 if (parseInt(matches[2]) > 0) {
  143.                     incrementor = "++";
  144.                 }
  145.                 addLineToScript("for(" + matches[1] + " = 0; " + matches[1] + " != " + matches[2] + "; " + matches[1] + incrementor + ") {");
  146.             }
  147.  
  148.         } else if (x[i].charAt(0) === "(" && x[i].charAt(x[i].length - 1) === ")") {
  149.  
  150.             matches = /\((.+)\)/g.exec(x[i]);
  151.             if(checkForError(matches, i)) {
  152.                 addLineToScript("// " + matches[1]);
  153.             }
  154.  
  155.         } else if (line[0] === "Въведи") {
  156.  
  157.             matches = /Въведи (.+) в (.+)/g.exec(x[i]);
  158.             if(checkForError(matches, i)) {
  159.                 addLineToScript(matches[2] + ".push(" + matches[1] + ");");
  160.             }
  161.  
  162.         } else if (line[0] === "Изтрий") {
  163.  
  164.             matches = /Изтрий (.+) от (.+)/g.exec(x[i]);
  165.             if(checkForError(matches, i)) {
  166.                 addLineToScript(matches[2] + ".splice((" + matches[2] + ".indexOf(" + matches[1] + ")), 1)");
  167.             }
  168.  
  169.         } else if (line[0] === "За") {
  170.  
  171.             matches = /За всеки (.+) в (.+) прави:/g.exec(x[i]);
  172.             if(checkForError(matches, i)) {
  173.                 addLineToScript("for (var ___ = 0; ___ < " + matches[2] + ".length; ___++) {");
  174.                 addLineToScript("var " + matches[1] + " = " + matches[2] + "[___];");
  175.             }
  176.  
  177.         } else if (line[0] === "Създай") {
  178.            
  179.             if(line[1] === "променливата") {
  180.  
  181.                 matches = /Създай променливата (.+)/g.exec(x[i]);
  182.                
  183.                 if(checkForError(matches, i)) {
  184.                     addLineToScript("var " + matches[1] + ";");
  185.                 }
  186.             } else {
  187.  
  188.                 matches = /Създай функция (.+) с параметри (.+):/g.exec(x[i]);
  189.  
  190.                 if(checkForError(matches, i)) {
  191.                     matches[1] = intoFunctionName(matches[1]);
  192.                     addLineToScript("function " + matches[1] + "(" + matches[2] + ") {");
  193.                 }
  194.             }
  195.  
  196.         } else if (x[i].slice(-2) === ").") {
  197.             matches = /^([^ ]+?\(.+?\))/g.exec(x[i]);
  198.             if(checkForError(matches, i)) {
  199.                 addLineToScript(matches[1]);
  200.             }
  201.  
  202.         } else if (line[0] === "Върни резултат") {
  203.  
  204.             matches = /Върни резултат (.+)/g.exec(x[i]);
  205.             console.log(matches)
  206.             if(checkForError(matches, i)) {
  207.                 addLineToScript("return " + matches[1]);
  208.             }
  209.  
  210.         } else {
  211.  
  212.             showError("Не разбрах ред номер " + (i + 1), true);
  213.             return
  214.  
  215.         }
  216.  
  217.     }
  218.  
  219.     if(!hasErrored) {
  220.         hideError();
  221.         console.log(script);
  222.  
  223.         try {
  224.             new Function(script)();
  225.         } catch(err) {
  226.             showError(err, false);
  227.         }
  228.     }
  229.  
  230. }
  231.  
  232. ----
  233.  
  234. <!DOCTYPE html>
  235. <html lang="en">
  236.  
  237. <head>
  238.     <meta charset="UTF-8">
  239.     <title>Kolev Lang</title>
  240.     <script src="interpreter.js"></script>
  241.     <link rel="stylesheet" type="text/css" href="https://bootswatch.com/3/lumen/bootstrap.min.css">
  242.     <link rel="stylesheet" type="text/css" href="style.css">
  243. </head>
  244.  
  245. <body>
  246.     <div class="container">
  247.         <div class="row">
  248.             <div class="col-md-6 col-md-offset-3 col-header">
  249.                 <h1>Elusive</h1>
  250.                 <h3>Programming for everybody.</h3>
  251.             </div>
  252.             <div class="col-md-6 col-md-offset-3">
  253.                 <textarea class="block" rows="4" id="text" placeholder="Започи да пишеш кода си и ще се случи чудо!"></textarea>
  254.                 <div class="btn btn-success" id="run" onclick="execute();">Компилирай</div>
  255.                 <div class="alert alert-danger hidden" role="alert" id="error">
  256.                     <strong id="error-title">О не! Има грешки в кода ти:
  257.                         <br>
  258.                     </strong>
  259.                     <span id="error-text"></span>
  260.                 </div>
  261.             </div>
  262.         </div>
  263.     </div>
  264. </body>
  265.  
  266. </html>
  267.  
  268. ----
  269.  
  270. @import url('https://fonts.googleapis.com/css?family=Merriweather:400,400i');
  271. * {
  272.     font-family: "Merriweather", Georgia, 'Times New Roman', Times, serif
  273. }
  274.  
  275. .block {
  276.     min-width: 100%;
  277.     border: none;
  278.     background-color: #eee;
  279.     padding: 10px;
  280. }
  281.  
  282. .highlight {
  283.     background-color: red;
  284. }
  285.  
  286. .alert-danger {
  287.     margin-top: 30px;
  288. }
  289.  
  290. .col-header {
  291.     padding: 50px;
  292.     text-align: center;
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement