/tools/dspec/ast.d

http://github.com/wilkie/djehuty · D · 133 lines · 106 code · 21 blank · 6 comment · 7 complexity · 772b10e2d600de6300f84a8dee418241 MD5 · raw file

  1. module ast;
  2. import djehuty;
  3. import io.console;
  4. class AST
  5. {
  6. public:
  7. enum ValueType
  8. {
  9. Unsigned,
  10. Signed,
  11. Object,
  12. Pointer,
  13. String,
  14. Hint,
  15. Name
  16. }
  17. protected:
  18. AST children[2];
  19. struct values
  20. {
  21. ulong unsigned;
  22. long signed;
  23. Object object;
  24. void* pointer;
  25. string str;
  26. string hint;
  27. }
  28. union valueHolder
  29. {
  30. ValueType type;
  31. values value;
  32. }
  33. valueHolder data;
  34. public:
  35. this(AST left, AST right)
  36. {
  37. children[0] = left;
  38. children[1] = right;
  39. }
  40. void left(AST left)
  41. {
  42. children[0] = left;
  43. }
  44. void right(AST right)
  45. {
  46. children[1] = right;
  47. }
  48. AST left()
  49. {
  50. return children[0];
  51. }
  52. AST right()
  53. {
  54. return children[1];
  55. }
  56. void value(ulong val)
  57. {
  58. data.type = ValueType.Unsigned;
  59. data.value.unsigned = val;
  60. }
  61. void value(string s)
  62. {
  63. data.type = ValueType.String;
  64. data.value.str = s.dup;
  65. }
  66. void hint(string s)
  67. {
  68. data.type = ValueType.Hint;
  69. data.value.str = s.dup;
  70. }
  71. void name(string s)
  72. {
  73. data.type = ValueType.Name;
  74. data.value.str = s.dup;
  75. }
  76. void walk(uint depth = 0)
  77. {
  78. static char[] spaces = "`---------------------------------------------------------------------------";
  79. if (data.type == ValueType.Hint)
  80. {
  81. // *** Console.putln(...);
  82. Console.putln(spaces[0..depth*2], "HINT: ", data.value.str, " [", left, ", ", right, "]");
  83. //writefln(spaces[0..depth*2], "HINT: ", data.value.str.array, " [", left, ", ", right, "]");
  84. }
  85. else if (data.type == ValueType.Name)
  86. {
  87. // *** Console.putln(...);
  88. Console.putln(spaces[0..depth*2], data.value.str, " [", left, ", ", right, "]");
  89. //writefln(spaces[0..depth*2], data.value.str.array, " [", left, ", ", right, "]");
  90. }
  91. else
  92. {
  93. // *** Console.putln(...);
  94. Console.putln(spaces[0..depth*2], "\"", data.value.str.replace('\n', ' '), "\" [", left, ", ", right, "]");
  95. //writefln(spaces[0..depth*2], "\"", replace(data.value.str.array, "\n", " "), "\" [", left, ", ", right, "]");
  96. }
  97. if (left !is null) { left.walk(depth+1); }
  98. if (right !is null) { right.walk(depth+1); }
  99. }
  100. ValueType valueType()
  101. {
  102. return data.type;
  103. }
  104. void getValue(out string value)
  105. {
  106. value = data.value.str.dup;
  107. }
  108. void getValue(out ulong value)
  109. {
  110. value = data.value.unsigned;
  111. }
  112. }