Advertisement
Aikiro42

Code Generator

Nov 23rd, 2019
881
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 6.79 KB | None | 0 0
  1.  
  2.         /* terminals used */
  3.         var num, id_var, id_func, id_idx, binaryOP, quote, assignOP;
  4.  
  5.         /* non-terminals used */
  6.         var Program, Assertion, Expr, TableExpr, Constant, FunctionDef, ColumnDef, Stmt, Assign, Condition, Call, Loop;
  7.  
  8.  
  9.         // non terminal class
  10.         function NonTerminal(name) {
  11.             this.name = name;
  12.             this.rules = [];
  13.             this.addRule = function (rule) {
  14.                 this.rules.push(rule);
  15.             };
  16.             this.getRandomRule = function () {
  17.                 if (this.rules.length == 0) {
  18.                     return "";
  19.                 }
  20.                 return getRandomArrayElement(this.rules);
  21.             };
  22.             this.derive = function () {
  23.                 console.log("derive: " + this.name);
  24.                 return (this.getRandomRule())();
  25.             };
  26.         }
  27.  
  28.         // terminal class
  29.         function Terminal(name, deriveFunc) {
  30.             this.name = name;
  31.             this.derive = deriveFunc;
  32.         };
  33.  
  34.     /* --------- TERMINALS --------- */
  35.         /* Number */
  36.         num = new Terminal("Num", function () {
  37.             return Math.round(Math.random() * 10);
  38.         });
  39.  
  40.         /* ID */
  41.         id_var = new Terminal("ID", function () {
  42.             return getRandomArrayElement(varIds);
  43.         });
  44.  
  45.         id_func = new Terminal("ID", function () {
  46.             return getRandomArrayElement(funcIds);
  47.         });
  48.  
  49.         id_idx = new Terminal("ID", function () {
  50.             return getRandomArrayElement(idxIds);
  51.         });
  52.  
  53.         /* OP */
  54.         binaryOP = new Terminal("OP", function () {
  55.             if($scope.nonAssoc){
  56.                 return getRandomArrayElement(binaryOpsWithNonAssoc);
  57.             }
  58.             else{
  59.                 return getRandomArrayElement(binaryOps);
  60.             }
  61.         });
  62.  
  63.         /* QUOTE */
  64.         quote = new Terminal("QUOTE", function () {
  65.             return getRandomArrayElement(quotes);
  66.         });
  67.  
  68.         /* ASSIGN OP */
  69.         assignOP = new Terminal("assignOP", function () {
  70.             return getRandomArrayElement(assignOps);
  71.         });
  72.  
  73.         /* --------- NON-TERMINALS --------- */
  74.  
  75.         /* Program */
  76.         Program = new NonTerminal("Program");
  77.         Program.addRule(function () {
  78.             return Assertion.derive();
  79.         });
  80.         Program.addRule(function () {
  81.             return Constant.derive();
  82.         });
  83.         Program.addRule(function () {
  84.             return FunctionDef.derive();
  85.         });
  86.         Program.addRule(function () {
  87.             return ColumnDef.derive();
  88.         });
  89.  
  90.         /* Assertion */
  91.         Assertion = new NonTerminal("Assertion");
  92.         Assertion.addRule(function () {
  93.             return "assert " + Expr.derive() + " : " + quote.derive();
  94.         });
  95.  
  96.  
  97.         /* TableExpr */
  98.         TableExpr = new NonTerminal("TableExpr");
  99.         TableExpr.addRule(function () {
  100.             return "COLS";
  101.         });
  102.         TableExpr.addRule(function () {
  103.             return "ROWS";
  104.         });
  105.         TableExpr.addRule(function () {
  106.             return "TABLE[" + Expr.derive() + "][" + Expr.derive() + "]";
  107.         });
  108.  
  109.         /* Expr */
  110.         Expr = new NonTerminal("Expr");
  111.         Expr.addRule(function () {
  112.             return num.derive();
  113.         });
  114.         Expr.addRule(function () {
  115.             return id_var.derive();
  116.         });
  117.         Expr.addRule(function () {
  118.             return Expr.derive() + " " + binaryOP.derive() + " " + Expr.derive();
  119.         });
  120.         Expr.addRule(function () {
  121.             return "-" + Expr.derive();
  122.         });
  123.         Expr.addRule(function () {
  124.             return "( " + Expr.derive() + " )";
  125.         });
  126.         Expr.addRule(function () {
  127.             return TableExpr.derive();
  128.         });
  129.         Expr.addRule(function () {
  130.             return Call.derive();
  131.         });
  132.  
  133.         /* Stmt */
  134.         Stmt = new NonTerminal("Stmt");
  135.         Stmt.addRule(function () {
  136.             return Expr.derive()
  137.         });
  138.         Stmt.addRule(function () {
  139.             return Assign.derive()
  140.         });
  141.         Stmt.addRule(function () {
  142.             return Condition.derive()
  143.         });
  144.         //Stmt.addRule(function () { return Loop.derive() });
  145.  
  146.         /* Constant */
  147.         Constant = new NonTerminal("Constant");
  148.         Constant.addRule(function () {
  149.             return "var " + id_var.derive() + " = " + Expr.derive();
  150.         });
  151.  
  152.         /* FunctionDef */
  153.         FunctionDef = new NonTerminal("FunctionDef");
  154.         FunctionDef.addRule(function () {
  155.             return "def " + id_func.derive() + "(" + makeList(id_var, ",", false) + "){\n" + makeList(Stmt, ";", true) + "\n}"
  156.         });
  157.  
  158.         /* ColumnDef */
  159.         ColumnDef = new NonTerminal("ColumnDef");
  160.         ColumnDef.addRule(function () {
  161.             return "def TABLE[" + Expr.derive() + "][" + id_idx.derive() + "] {\n" + makeList(Stmt, ";", true) + "\n}"
  162.         });
  163.  
  164.         /* Assign */
  165.         Assign = new NonTerminal("Assign");
  166.         Assign.addRule(function () {
  167.             return id_var.derive() + " " + assignOP.derive() + " " + Expr.derive();
  168.         });
  169.  
  170.         /* Condition */
  171.         Condition = new NonTerminal("Condition");
  172.         Condition.addRule(function () {
  173.             return "if(" + Expr.derive() + "){\n" + makeList(Stmt, ";", true) + "\n}";
  174.         });
  175.         Condition.addRule(function () {
  176.             return "if(" + Expr.derive() + "){\n" + makeList(Stmt, ";", true) + "\n} else {\n" + makeList(Stmt, ";", true) + "\n}";
  177.         });
  178.  
  179.         /* Call */
  180.         Call = new NonTerminal("Call");
  181.         Call.addRule(function () {
  182.             return id_func.derive() + "(" + makeList(Expr, ",", false) + ")";
  183.         });
  184.  
  185.         /* Loop */
  186.         Loop = new NonTerminal("Loop");
  187.         Loop.addRule(function () {
  188.             return "for ( " + id_idx.derive() + " = " + Expr.derive() + ".." + Expr.derive() + " ) {\n" + makeList(Stmt, ";", true) + "\n}";
  189.         });
  190.  
  191.         /* Utils */
  192.  
  193.         // get a random element from an array
  194.         function getRandomArrayElement(arr) {
  195.             return arr[Math.floor(Math.random() * arr.length)];
  196.         }
  197.  
  198.         // create a list of 0+ elements
  199.         function makeList(item, seperator, isBody) {
  200.             var listSize = Math.round(Math.random() * MAX_LIST_SIZE);
  201.             var res = "";
  202.  
  203.             for (var i = 0; i < listSize; i++) {
  204.                 if (isBody) {
  205.                     res += "\t";
  206.                 }
  207.                 res += item.derive();
  208.                 if (i != listSize - 1) {
  209.                     res += seperator;
  210.                     if (isBody) {
  211.                         res += "\n";
  212.                     }
  213.                 }
  214.             }
  215.  
  216.             return res;
  217.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement