object-ast.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. var jsp = require("./parse-js"),
  2. pro = require("./process");
  3. var BY_TYPE = {};
  4. function HOP(obj, prop) {
  5. return Object.prototype.hasOwnProperty.call(obj, prop);
  6. };
  7. function AST_Node(parent) {
  8. this.parent = parent;
  9. };
  10. AST_Node.prototype.init = function(){};
  11. function DEFINE_NODE_CLASS(type, props, methods) {
  12. var base = methods && methods.BASE || AST_Node;
  13. if (!base) base = AST_Node;
  14. function D(parent, data) {
  15. base.apply(this, arguments);
  16. if (props) props.forEach(function(name, i){
  17. this["_" + name] = data[i];
  18. });
  19. this.init();
  20. };
  21. var P = D.prototype = new AST_Node;
  22. P.node_type = function(){ return type };
  23. if (props) props.forEach(function(name){
  24. var propname = "_" + name;
  25. P["set_" + name] = function(val) {
  26. this[propname] = val;
  27. return this;
  28. };
  29. P["get_" + name] = function() {
  30. return this[propname];
  31. };
  32. });
  33. if (type != null) BY_TYPE[type] = D;
  34. if (methods) for (var i in methods) if (HOP(methods, i)) {
  35. P[i] = methods[i];
  36. }
  37. return D;
  38. };
  39. var AST_String_Node = DEFINE_NODE_CLASS("string", ["value"]);
  40. var AST_Number_Node = DEFINE_NODE_CLASS("num", ["value"]);
  41. var AST_Name_Node = DEFINE_NODE_CLASS("name", ["value"]);
  42. var AST_Statlist_Node = DEFINE_NODE_CLASS(null, ["body"]);
  43. var AST_Root_Node = DEFINE_NODE_CLASS("toplevel", null, { BASE: AST_Statlist_Node });
  44. var AST_Block_Node = DEFINE_NODE_CLASS("block", null, { BASE: AST_Statlist_Node });
  45. var AST_Splice_Node = DEFINE_NODE_CLASS("splice", null, { BASE: AST_Statlist_Node });
  46. var AST_Var_Node = DEFINE_NODE_CLASS("var", ["definitions"]);
  47. var AST_Const_Node = DEFINE_NODE_CLASS("const", ["definitions"]);
  48. var AST_Try_Node = DEFINE_NODE_CLASS("try", ["body", "catch", "finally"]);
  49. var AST_Throw_Node = DEFINE_NODE_CLASS("throw", ["exception"]);
  50. var AST_New_Node = DEFINE_NODE_CLASS("new", ["constructor", "arguments"]);
  51. var AST_Switch_Node = DEFINE_NODE_CLASS("switch", ["expression", "branches"]);
  52. var AST_Switch_Branch_Node = DEFINE_NODE_CLASS(null, ["expression", "body"]);
  53. var AST_Break_Node = DEFINE_NODE_CLASS("break", ["label"]);
  54. var AST_Continue_Node = DEFINE_NODE_CLASS("continue", ["label"]);
  55. var AST_Assign_Node = DEFINE_NODE_CLASS("assign", ["operator", "lvalue", "rvalue"]);
  56. var AST_Dot_Node = DEFINE_NODE_CLASS("dot", ["expression", "name"]);
  57. var AST_Call_Node = DEFINE_NODE_CLASS("call", ["function", "arguments"]);
  58. var AST_Lambda_Node = DEFINE_NODE_CLASS(null, ["name", "arguments", "body"])
  59. var AST_Function_Node = DEFINE_NODE_CLASS("function", null, AST_Lambda_Node);
  60. var AST_Defun_Node = DEFINE_NODE_CLASS("defun", null, AST_Lambda_Node);
  61. var AST_If_Node = DEFINE_NODE_CLASS("if", ["condition", "then", "else"]);