Advertisement
JoseHdez2

function PEG

May 17th, 2015
340
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.91 KB | None | 0 0
  1. start
  2. = calculation
  3.  
  4. calculation
  5. = p:program {
  6. return p;
  7. return eval(p);
  8. }
  9.  
  10. program
  11. = __? f:functions __? { return f; }
  12.  
  13. functions
  14. = functionMain
  15. / n:functionNormal ___ o:functions { return o; }
  16.  
  17. functionNormal
  18. = i:id _? f:funcNotId { return [i,f]; }
  19.  
  20. functionMain
  21. = i:"main" _? f:funcNotId { return f; }
  22.  
  23. funcNotId
  24. = a:funcArgs __? b:funcBody {
  25. function flatten(arr) {
  26. return arr.reduce(function (flat, toFlatten) {
  27. return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
  28. }, []);
  29. }
  30.  
  31. b = flatten(b);
  32. h = {};
  33. for (i = 0; i < b.length; i+=2){
  34. h[b[i]] = b[i+1];
  35. }
  36.  
  37. output = h["return"];
  38.  
  39. output_tokens = output.match(/[0-9]+|[a-zA-Z]+|[-+*/]/g);
  40.  
  41. function substitute(ary){
  42. for (i = 0; i < ary.length; i++){
  43. toks = ary[i].match(/[0-9]+|[a-zA-Z]+|[-+*/()]/g);
  44. for (j = 0; j < toks.length; j++){
  45. if (h[toks[j]] != null) {
  46. toks[j] = "("+h[toks[j]]+")";
  47. }
  48. }
  49. ary[i] = toks.join("");
  50. }
  51. return ary
  52. }
  53.  
  54. for(l = 0; l < b.length / 2 - 1; l++){
  55. output_tokens = substitute(output_tokens);
  56. }
  57.  
  58. return output_tokens.join("");
  59. }
  60.  
  61. funcArgs
  62. = "(" _? a:args { return a; }
  63. / "(" _? ")" { return []; }
  64.  
  65. args
  66. = i:id _? ")" { return i; }
  67. / i:id _? "," _? o:args { return [i,o]; }
  68.  
  69. funcBody
  70. = "{" __? s:statements __? "}" { return s; }
  71.  
  72. statements
  73. = r:statementReturn { return r; }
  74. / a:statementAssign ___ s:statements { return [a,s];}
  75.  
  76. statementAssign
  77. = _? i:id _? "=" _? e:expression _? { return [i,e]; }
  78.  
  79. statementReturn
  80. = _? r:"return" _ e:expression _? { return [r,e]; }
  81.  
  82. _
  83. = [ \t]+ { return " "; }
  84.  
  85. __
  86. = [ \t\n]+ { return " "; }
  87.  
  88. ___
  89. = "\n"+ { return " "; }
  90.  
  91. expression
  92. = a:atom _? o:[-+*/] _? e:expression { return a+o+e; }
  93. / "(" e:expression ")" { return ["(",e,")"]; }
  94. / atom
  95.  
  96. atom
  97. = id
  98. / num
  99.  
  100. id
  101. = letters:[A-z]+ { return letters.join(""); }
  102.  
  103. num
  104. = digits:[0-9]+ { return digits.join(""); }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement