Advertisement
Anubis_Black

Clojure Parsing

Apr 1st, 2013
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function Solve(args) {
  2.     var length = args.length;
  3.     var functions = {};
  4.     var index;
  5.     var currentElement;
  6.     var operator;
  7.     var operands;
  8.     var sum;
  9.     var result;
  10.     var dividend;
  11.     var tokens;
  12.     var tokensLength;
  13.     var filteredTokens = [];
  14.     var command;
  15.  
  16.     for (var line = 0; line < length - 1; line++) {
  17.         command = args[line].substring(1, args[line].length - 1);
  18.  
  19.         var startIndexNested = command.indexOf("(");
  20.         var endIndexNested = command.indexOf(")");
  21.  
  22.         var definedFunction;
  23.  
  24.         if (startIndexNested != -1 && endIndexNested != -1) {
  25.             var nestedCommand = command.substring(startIndexNested + 1, endIndexNested);
  26.  
  27.             tokens = command.split(/[\s]+/);
  28.  
  29.             tokensLength = tokens.length;
  30.  
  31.             filteredTokens = [];
  32.  
  33.             for (index = 0; index < tokensLength; index++) {
  34.                 if (tokens[index] !== "") {
  35.                     filteredTokens.push(tokens[index]);
  36.                 }
  37.             }
  38.  
  39.             tokens = filteredTokens;
  40.  
  41.             if (tokens[0] !== "def") {
  42.                 continue;
  43.             }
  44.  
  45.             definedFunction = tokens[1];
  46.  
  47.             var nestedTokens = nestedCommand.split(/[\s]+/);
  48.  
  49.             tokensLength = nestedTokens.length;
  50.  
  51.             filteredTokens = [];
  52.  
  53.             for (index = 0; index < tokensLength; index++) {
  54.                 if (nestedTokens[index] !== "") {
  55.                     filteredTokens.push(nestedTokens[index]);
  56.                 }
  57.             }
  58.  
  59.             nestedTokens = filteredTokens;
  60.  
  61.             operator = nestedTokens[0];
  62.             operands = nestedTokens.length - 1;
  63.  
  64.             if (operator === "+") {
  65.                 currentElement = parseInt(nestedTokens[1]);
  66.  
  67.                 if (isNaN(currentElement)) {
  68.                     currentElement = functions[nestedTokens[1]];
  69.                 }
  70.  
  71.                 sum = currentElement;
  72.  
  73.                 for (index = 1; index < operands; index++) {
  74.                     currentElement = parseInt(nestedTokens[index + 1]);
  75.  
  76.                     if (isNaN(currentElement)) {
  77.                         currentElement = functions[nestedTokens[index + 1]];
  78.                     }
  79.  
  80.                     sum += currentElement;
  81.                 }
  82.  
  83.                 functions[definedFunction] = sum;
  84.             }
  85.             else if (operator === "-") {
  86.                 currentElement = parseInt(nestedTokens[1]);
  87.  
  88.                 if (isNaN(currentElement)) {
  89.                     currentElement = functions[nestedTokens[1]];
  90.                 }
  91.  
  92.                 sum = currentElement;
  93.  
  94.                 for (index = 1; index < operands; index++) {
  95.                     currentElement = parseInt(nestedTokens[index + 1]);
  96.  
  97.                     if (isNaN(currentElement)) {
  98.                         currentElement = functions[nestedTokens[index + 1]];
  99.                     }
  100.  
  101.                     sum -= currentElement;
  102.                 }
  103.  
  104.                 functions[definedFunction] = sum;
  105.             }
  106.             else if (operator === "*") {
  107.                 currentElement = parseInt(nestedTokens[1]);
  108.  
  109.                 if (isNaN(currentElement)) {
  110.                     currentElement = functions[nestedTokens[1]];
  111.                 }
  112.  
  113.                 result = currentElement;
  114.  
  115.                 for (index = 1; index < operands; index++) {
  116.                     currentElement = parseInt(nestedTokens[index + 1]);
  117.  
  118.                     if (isNaN(currentElement)) {
  119.                         currentElement = functions[nestedTokens[index + 1]];
  120.                     }
  121.  
  122.                     result *= currentElement;
  123.                 }
  124.  
  125.                 functions[definedFunction] = result;
  126.             }
  127.             else if (operator === "/") {
  128.                 currentElement = parseInt(nestedTokens[1]);
  129.  
  130.                 if (isNaN(currentElement)) {
  131.                     currentElement = functions[nestedTokens[1]];
  132.                 }
  133.  
  134.                 dividend = currentElement;
  135.  
  136.                 for (index = 1; index < operands; index++) {
  137.                     currentElement = parseInt(nestedTokens[index + 1]);
  138.  
  139.                     if (isNaN(currentElement)) {
  140.                         currentElement = functions[nestedTokens[index + 1]];
  141.                     }
  142.  
  143.                     if (currentElement === 0) {
  144.                         line++;
  145.                         return "Division by zero! At Line:" + line;
  146.                     }
  147.  
  148.                     dividend = (dividend / currentElement) | 0;
  149.                 }
  150.  
  151.                 functions[definedFunction] = dividend;
  152.             }
  153.         }
  154.         else {
  155.             tokens = command.split(/[\s]+/);
  156.  
  157.             tokensLength = tokens.length;
  158.  
  159.             filteredTokens = [];
  160.  
  161.             for (index = 0; index < tokensLength; index++) {
  162.                 if (tokens[index] !== "") {
  163.                     filteredTokens.push(tokens[index]);
  164.                 }
  165.             }
  166.  
  167.             tokens = filteredTokens;
  168.  
  169.             if (tokens[0] !== "def") {
  170.                 continue;
  171.             }
  172.  
  173.             definedFunction = tokens[1];
  174.  
  175.             currentElement = parseInt(tokens[2]);
  176.  
  177.             if (isNaN(currentElement)) {
  178.                 currentElement = functions[tokens[2]];
  179.             }
  180.  
  181.             functions[definedFunction] = currentElement;
  182.         }
  183.     }
  184.  
  185.     command = args[line].substring(1, args[line].length - 1);
  186.  
  187.     tokens = command.split(/[\s]+/);
  188.  
  189.     tokensLength = tokens.length;
  190.  
  191.     filteredTokens = [];
  192.  
  193.     for (index = 0; index < tokensLength; index++) {
  194.         if (tokens[index] !== "") {
  195.             filteredTokens.push(tokens[index]);
  196.         }
  197.     }
  198.  
  199.     tokens = filteredTokens;
  200.  
  201.     operator = tokens[0];
  202.     operands = tokens.length - 1;
  203.  
  204.     if (operator === "+") {
  205.         currentElement = parseInt(tokens[1]);
  206.  
  207.         if (isNaN(currentElement)) {
  208.             currentElement = functions[tokens[1]];
  209.         }
  210.  
  211.         sum = currentElement;
  212.  
  213.         for (index = 1; index < operands; index++) {
  214.             currentElement = parseInt(tokens[index + 1]);
  215.  
  216.             if (isNaN(currentElement)) {
  217.                 currentElement = functions[tokens[index + 1]];
  218.             }
  219.  
  220.             sum += currentElement;
  221.         }
  222.  
  223.         return sum;
  224.     }
  225.     else if (operator === "-") {
  226.         currentElement = parseInt(tokens[1]);
  227.  
  228.         if (isNaN(currentElement)) {
  229.             currentElement = functions[tokens[1]];
  230.         }
  231.  
  232.         sum = currentElement;
  233.  
  234.         for (index = 1; index < operands; index++) {
  235.             currentElement = parseInt(tokens[index + 1]);
  236.  
  237.             if (isNaN(currentElement)) {
  238.                 currentElement = functions[tokens[index + 1]];
  239.             }
  240.  
  241.             sum -= currentElement;
  242.         }
  243.  
  244.         return sum;
  245.     }
  246.     else if (operator === "*") {
  247.         currentElement = parseInt(tokens[1]);
  248.  
  249.         if (isNaN(currentElement)) {
  250.             currentElement = functions[tokens[1]];
  251.         }
  252.  
  253.         result = currentElement;
  254.  
  255.         for (index = 1; index < operands; index++) {
  256.             currentElement = parseInt(tokens[index + 1]);
  257.  
  258.             if (isNaN(currentElement)) {
  259.                 currentElement = functions[tokens[index + 1]];
  260.             }
  261.  
  262.             result *= currentElement;
  263.         }
  264.  
  265.         return result;
  266.     }
  267.     else if (operator === "/") {
  268.         currentElement = parseInt(tokens[1]);
  269.  
  270.         if (isNaN(currentElement)) {
  271.             currentElement = functions[tokens[1]];
  272.         }
  273.  
  274.         dividend = currentElement;
  275.  
  276.         for (index = 1; index < operands; index++) {
  277.             currentElement = parseInt(tokens[index + 1]);
  278.  
  279.             if (isNaN(currentElement)) {
  280.                 currentElement = functions[tokens[index + 1]];
  281.             }
  282.  
  283.             if (currentElement === 0) {
  284.                 line++;
  285.                 return "Division by zero! At Line:" + line;
  286.             }
  287.  
  288.             dividend = (dividend / currentElement) | 0;
  289.         }
  290.  
  291.         return dividend;
  292.     }
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement