kanayago 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +12 -0
  3. data/.ruby-version +1 -0
  4. data/README.md +20 -29
  5. data/Rakefile +24 -120
  6. data/ext/kanayago/extconf.rb +14 -0
  7. data/ext/kanayago/kanayago.c +554 -235
  8. data/ext/kanayago/kanayago.h +5 -0
  9. data/ext/kanayago/literal_node.c +343 -0
  10. data/ext/kanayago/literal_node.h +30 -0
  11. data/ext/kanayago/pattern_node.c +78 -0
  12. data/ext/kanayago/pattern_node.h +13 -0
  13. data/ext/kanayago/scope_node.c +34 -0
  14. data/ext/kanayago/scope_node.h +8 -0
  15. data/ext/kanayago/statement_node.c +795 -0
  16. data/ext/kanayago/statement_node.h +66 -0
  17. data/ext/kanayago/string_node.c +192 -0
  18. data/ext/kanayago/string_node.h +19 -0
  19. data/ext/kanayago/variable_node.c +72 -0
  20. data/ext/kanayago/variable_node.h +12 -0
  21. data/lib/kanayago/literal_node.rb +87 -0
  22. data/lib/kanayago/pattern_node.rb +19 -0
  23. data/lib/kanayago/statement_node.rb +222 -0
  24. data/lib/kanayago/string_node.rb +43 -0
  25. data/lib/kanayago/variable_node.rb +23 -0
  26. data/lib/kanayago/version.rb +1 -1
  27. data/lib/kanayago.rb +22 -0
  28. data/patch/3.4/copy_target.rb +78 -0
  29. data/patch/3.4/kanayago.patch +162 -0
  30. data/patch/head/copy_target.rb +84 -0
  31. data/patch/head/kanayago.patch +162 -0
  32. data/sample/minitest_generator.rb +266 -0
  33. data/sample/test_generator.rb +272 -0
  34. data/script/setup_parser.rb +136 -0
  35. data/typeprof.conf.json +9 -0
  36. metadata +30 -64
  37. data/ext/kanayago/ccan/check_type/check_type.h +0 -63
  38. data/ext/kanayago/ccan/container_of/container_of.h +0 -142
  39. data/ext/kanayago/ccan/list/list.h +0 -791
  40. data/ext/kanayago/ccan/str/str.h +0 -17
  41. data/ext/kanayago/constant.h +0 -53
  42. data/ext/kanayago/id.h +0 -347
  43. data/ext/kanayago/id_table.h +0 -39
  44. data/ext/kanayago/internal/array.h +0 -151
  45. data/ext/kanayago/internal/basic_operators.h +0 -64
  46. data/ext/kanayago/internal/bignum.h +0 -244
  47. data/ext/kanayago/internal/bits.h +0 -568
  48. data/ext/kanayago/internal/compile.h +0 -34
  49. data/ext/kanayago/internal/compilers.h +0 -107
  50. data/ext/kanayago/internal/complex.h +0 -29
  51. data/ext/kanayago/internal/encoding.h +0 -36
  52. data/ext/kanayago/internal/error.h +0 -218
  53. data/ext/kanayago/internal/fixnum.h +0 -184
  54. data/ext/kanayago/internal/gc.h +0 -322
  55. data/ext/kanayago/internal/hash.h +0 -191
  56. data/ext/kanayago/internal/imemo.h +0 -261
  57. data/ext/kanayago/internal/io.h +0 -140
  58. data/ext/kanayago/internal/numeric.h +0 -274
  59. data/ext/kanayago/internal/parse.h +0 -117
  60. data/ext/kanayago/internal/rational.h +0 -71
  61. data/ext/kanayago/internal/re.h +0 -28
  62. data/ext/kanayago/internal/ruby_parser.h +0 -125
  63. data/ext/kanayago/internal/sanitizers.h +0 -297
  64. data/ext/kanayago/internal/serial.h +0 -23
  65. data/ext/kanayago/internal/static_assert.h +0 -16
  66. data/ext/kanayago/internal/string.h +0 -186
  67. data/ext/kanayago/internal/symbol.h +0 -45
  68. data/ext/kanayago/internal/thread.h +0 -79
  69. data/ext/kanayago/internal/variable.h +0 -72
  70. data/ext/kanayago/internal/vm.h +0 -137
  71. data/ext/kanayago/internal/warnings.h +0 -16
  72. data/ext/kanayago/internal.h +0 -108
  73. data/ext/kanayago/lex.c +0 -302
  74. data/ext/kanayago/method.h +0 -255
  75. data/ext/kanayago/node.c +0 -440
  76. data/ext/kanayago/node.h +0 -111
  77. data/ext/kanayago/node_name.inc +0 -224
  78. data/ext/kanayago/parse.c +0 -26931
  79. data/ext/kanayago/parse.h +0 -244
  80. data/ext/kanayago/parse.tmp.y +0 -16145
  81. data/ext/kanayago/parser_bits.h +0 -564
  82. data/ext/kanayago/parser_node.h +0 -32
  83. data/ext/kanayago/parser_st.c +0 -164
  84. data/ext/kanayago/parser_st.h +0 -162
  85. data/ext/kanayago/parser_value.h +0 -106
  86. data/ext/kanayago/probes.h +0 -4
  87. data/ext/kanayago/ruby_assert.h +0 -14
  88. data/ext/kanayago/ruby_atomic.h +0 -23
  89. data/ext/kanayago/ruby_parser.c +0 -1165
  90. data/ext/kanayago/rubyparser.h +0 -1391
  91. data/ext/kanayago/shape.h +0 -234
  92. data/ext/kanayago/st.c +0 -2339
  93. data/ext/kanayago/symbol.h +0 -123
  94. data/ext/kanayago/thread_pthread.h +0 -168
  95. data/ext/kanayago/universal_parser.c +0 -230
  96. data/ext/kanayago/vm_core.h +0 -2215
  97. data/ext/kanayago/vm_opts.h +0 -67
@@ -1,154 +1,232 @@
1
1
  #include "kanayago.h"
2
+ #include "scope_node.h"
3
+ #include "literal_node.h"
4
+ #include "string_node.h"
5
+ #include "statement_node.h"
6
+ #include "variable_node.h"
7
+ #include "pattern_node.h"
8
+ #include "internal/encoding.h"
2
9
  #include "internal/ruby_parser.h"
3
- #include "ruby/ruby.h"
4
10
  #include "rubyparser.h"
5
- #include <stdio.h>
6
-
7
- #define symbol(arg) \
8
- ID2SYM(rb_intern((arg)))
9
11
 
10
12
  VALUE rb_mKanayago;
11
13
 
12
- static VALUE ast_to_hash(const NODE *);
14
+ VALUE rb_cConstantNode;
15
+ VALUE rb_cConstantDeclarationNode;
16
+ VALUE rb_cDefinitionNode;
17
+ VALUE rb_cOperatorCallNode;
18
+ VALUE rb_cCallNode;
19
+ VALUE rb_cFunctionCallNode;
20
+ VALUE rb_cVariableCallNode;
21
+ VALUE rb_cArgumentsNode;
22
+ VALUE rb_cListNode;
23
+ VALUE rb_cBlockNode;
24
+ VALUE rb_cBeginNode;
25
+ VALUE rb_cClassNode;
26
+ VALUE rb_cModuleNode;
27
+ VALUE rb_cColon2Node;
28
+ VALUE rb_cColon3Node;
29
+ VALUE rb_cSelfNode;
13
30
 
14
31
  static VALUE
15
- node_opcall_to_hash(const NODE *node)
32
+ operator_call_node_new(const NODE *node)
16
33
  {
17
- VALUE result = rb_hash_new();
18
- rb_hash_aset(result, symbol("recv"), ast_to_hash(RNODE_OPCALL(node)->nd_recv));
19
- rb_hash_aset(result, symbol("mid"), ID2SYM(RNODE_OPCALL(node)->nd_mid));
20
- rb_hash_aset(result, symbol("args"), ast_to_hash(RNODE_OPCALL(node)->nd_args));
21
- return result;
34
+ VALUE obj = rb_class_new_instance(0, 0, rb_cOperatorCallNode);
35
+
36
+ rb_ivar_set(obj, symbol("recv"), ast_to_node_instance(RNODE_OPCALL(node)->nd_recv));
37
+ rb_ivar_set(obj, symbol("mid"), ID2SYM(RNODE_OPCALL(node)->nd_mid));
38
+ rb_ivar_set(obj, symbol("args"), ast_to_node_instance(RNODE_OPCALL(node)->nd_args));
39
+
40
+ return obj;
22
41
  }
23
42
 
24
43
  static VALUE
25
- node_call_to_hash(const NODE *node)
44
+ operator_call_node_recv_get(VALUE self)
26
45
  {
27
- VALUE result = rb_hash_new();
46
+ return rb_ivar_get(self, symbol("recv"));
47
+ }
28
48
 
29
- rb_hash_aset(result, symbol("recv"), ast_to_hash(RNODE_OPCALL(node)->nd_recv));
30
- rb_hash_aset(result, symbol("mid"), ID2SYM(RNODE_CALL(node)->nd_mid));
31
- rb_hash_aset(result, symbol("args"), ast_to_hash(RNODE_CALL(node)->nd_args));
49
+ static VALUE
50
+ operator_call_node_mid_get(VALUE self)
51
+ {
52
+ return rb_ivar_get(self, symbol("mid"));
53
+ }
32
54
 
33
- return result;
55
+ static VALUE
56
+ operator_call_node_args_get(VALUE self)
57
+ {
58
+ return rb_ivar_get(self, symbol("args"));
34
59
  }
35
60
 
36
61
  static VALUE
37
- node_fcall_to_hash(const NODE *node)
62
+ call_node_new(const NODE *node)
38
63
  {
39
- VALUE result = rb_hash_new();
64
+ VALUE result = rb_class_new_instance(0, 0, rb_cCallNode);
40
65
 
41
- rb_hash_aset(result, symbol("mid"), ID2SYM(RNODE_FCALL(node)->nd_mid));
42
- rb_hash_aset(result, symbol("args"), ast_to_hash(RNODE_FCALL(node)->nd_args));
66
+ rb_ivar_set(result, symbol("recv"), ast_to_node_instance(RNODE_OPCALL(node)->nd_recv));
67
+ rb_ivar_set(result, symbol("mid"), ID2SYM(RNODE_CALL(node)->nd_mid));
68
+ rb_ivar_set(result, symbol("args"), ast_to_node_instance(RNODE_CALL(node)->nd_args));
43
69
 
44
70
  return result;
45
71
  }
46
72
 
47
73
  static VALUE
48
- node_list_to_hash(const NODE *node)
74
+ call_node_recv_get(VALUE self)
49
75
  {
50
- VALUE result = rb_ary_new();
51
- NODE *nd_head = RNODE_LIST(node)->nd_head;
52
- int list_len = RNODE_LIST(node)->as.nd_alen;
76
+ return rb_ivar_get(self, symbol("recv"));
77
+ }
53
78
 
54
- for (int i = 0; i < list_len; i++ ) {
55
- rb_ary_push(result, ast_to_hash(nd_head));
56
- nd_head = RNODE_LIST(node)->nd_next;
57
- }
79
+ static VALUE
80
+ call_node_mid_get(VALUE self)
81
+ {
82
+ return rb_ivar_get(self, symbol("mid"));
83
+ }
58
84
 
59
- return result;
85
+ static VALUE
86
+ call_node_args_get(VALUE self)
87
+ {
88
+ return rb_ivar_get(self, symbol("args"));
60
89
  }
61
90
 
62
91
  static VALUE
63
- node_defn_to_hash(const NODE *node)
92
+ function_call_node_new(const NODE *node)
64
93
  {
65
- VALUE result = rb_hash_new();
94
+ VALUE obj = rb_class_new_instance(0, 0, rb_cFunctionCallNode);
66
95
 
67
- rb_hash_aset(result, symbol("mid"), ID2SYM(RNODE_DEFN(node)->nd_mid));
68
- rb_hash_aset(result, symbol("defn"), ast_to_hash(RNODE_DEFN(node)->nd_defn));
96
+ rb_ivar_set(obj, symbol("mid"), ID2SYM(RNODE_FCALL(node)->nd_mid));
97
+ rb_ivar_set(obj, symbol("args"), ast_to_node_instance(RNODE_FCALL(node)->nd_args));
69
98
 
70
- return result;
99
+ return obj;
71
100
  }
72
101
 
73
102
  static VALUE
74
- node_block_to_hash(const NODE *node)
103
+ function_call_node_mid_get(VALUE self)
75
104
  {
76
- VALUE result = rb_ary_new();
77
- const NODE *current_node = node;
105
+ return rb_ivar_get(self, symbol("mid"));
106
+ }
78
107
 
79
- while (current_node) {
80
- rb_ary_push(result, ast_to_hash(RNODE_BLOCK(current_node)->nd_head));
81
- current_node = RNODE_BLOCK(current_node)->nd_next;
82
- }
108
+ static VALUE
109
+ function_call_node_args_get(VALUE self)
110
+ {
111
+ return rb_ivar_get(self, symbol("args"));
112
+ }
83
113
 
84
- return result;
114
+ static VALUE
115
+ variable_call_node_new(const NODE *node)
116
+ {
117
+ VALUE obj = rb_class_new_instance(0, 0, rb_cVariableCallNode);
118
+
119
+ rb_ivar_set(obj, rb_intern("@mid"), ID2SYM(RNODE_VCALL(node)->nd_mid));
120
+
121
+ return obj;
85
122
  }
86
123
 
87
124
  static VALUE
88
- node_lasgn_to_hash(const NODE *node)
125
+ variable_call_node_mid_get(VALUE self)
89
126
  {
90
- VALUE result = rb_hash_new();
127
+ return rb_ivar_get(self, rb_intern("@mid"));
128
+ }
91
129
 
92
- rb_hash_aset(result, symbol("id"), ID2SYM(RNODE_LASGN(node)->nd_vid));
93
- rb_hash_aset(result, symbol("value"), ast_to_hash(RNODE_LASGN(node)->nd_value));
130
+ static VALUE
131
+ list_node_new(const NODE *node)
132
+ {
133
+ VALUE obj = rb_class_new_instance(0, 0, rb_cListNode);
134
+ VALUE val = rb_ary_new();
135
+ const NODE *nd_current = node;
136
+ int list_len = RNODE_LIST(node)->as.nd_alen;
94
137
 
95
- return result;
138
+ while (nd_current) {
139
+ rb_ary_push(val, ast_to_node_instance(RNODE_LIST(nd_current)->nd_head));
140
+ nd_current = RNODE_LIST(nd_current)->nd_next;
141
+ }
142
+
143
+ rb_ivar_set(obj, rb_intern("@val"), val);
144
+ rb_ivar_set(obj, rb_intern("@len"), INT2FIX(list_len));
145
+
146
+ return obj;
96
147
  }
97
148
 
98
149
  static VALUE
99
- node_lvar_to_hash(const NODE *node)
150
+ definition_node_new(const NODE *node)
100
151
  {
101
- VALUE result = rb_hash_new();
152
+ VALUE obj = rb_class_new_instance(0, 0, rb_cDefinitionNode);
102
153
 
103
- rb_hash_aset(result, symbol("vid"), ID2SYM(RNODE_LVAR(node)->nd_vid));
154
+ rb_ivar_set(obj, symbol("mid"), ID2SYM(RNODE_DEFN(node)->nd_mid));
155
+ rb_ivar_set(obj, symbol("defn"), ast_to_node_instance(RNODE_DEFN(node)->nd_defn));
104
156
 
105
- return result;
157
+ return obj;
106
158
  }
107
159
 
108
160
  static VALUE
109
- node_if_to_hash(const NODE *node)
161
+ definition_node_mid_get(VALUE self)
110
162
  {
111
- VALUE result = rb_hash_new();
163
+ return rb_ivar_get(self, symbol("mid"));
164
+ }
112
165
 
113
- rb_hash_aset(result, symbol("cond"), ast_to_hash(RNODE_IF(node)->nd_cond));
114
- rb_hash_aset(result, symbol("body"), ast_to_hash(RNODE_IF(node)->nd_body));
115
- rb_hash_aset(result, symbol("else"), ast_to_hash(RNODE_IF(node)->nd_else));
166
+ static VALUE
167
+ definition_node_defn_get(VALUE self)
168
+ {
169
+ return rb_ivar_get(self, symbol("defn"));
170
+ }
116
171
 
117
- return result;
172
+ static VALUE
173
+ block_node_new(const NODE *node)
174
+ {
175
+ VALUE obj = rb_class_new_instance(0, 0, rb_cBlockNode);
176
+ const NODE *current_node = node;
177
+
178
+ while (current_node) {
179
+ rb_ary_push(obj, ast_to_node_instance(RNODE_BLOCK(current_node)->nd_head));
180
+ current_node = RNODE_BLOCK(current_node)->nd_next;
181
+ }
182
+
183
+ return obj;
118
184
  }
119
185
 
120
186
  static VALUE
121
- node_unless_to_hash(const NODE *node)
187
+ constant_node_new(const NODE *node)
122
188
  {
123
- VALUE result = rb_hash_new();
189
+ VALUE obj = rb_class_new_instance(0, 0, rb_cConstantNode);
124
190
 
125
- rb_hash_aset(result, symbol("cond"), ast_to_hash(RNODE_UNLESS(node)->nd_cond));
126
- rb_hash_aset(result, symbol("body"), ast_to_hash(RNODE_UNLESS(node)->nd_body));
127
- rb_hash_aset(result, symbol("else"), ast_to_hash(RNODE_UNLESS(node)->nd_else));
191
+ rb_ivar_set(obj, symbol("vid"), ID2SYM(RNODE_CONST(node)->nd_vid));
128
192
 
129
- return result;
193
+ return obj;
130
194
  }
131
195
 
132
196
  static VALUE
133
- node_const_to_hash(const NODE *node)
197
+ constant_node_vid_get(VALUE self)
134
198
  {
135
- VALUE result = rb_hash_new();
199
+ return rb_ivar_get(self, symbol("vid"));
200
+ }
136
201
 
137
- rb_hash_aset(result, symbol("vid"), ID2SYM(RNODE_CONST(node)->nd_vid));
202
+ static VALUE
203
+ constant_declaration_node_new(const NODE *node)
204
+ {
205
+ VALUE obj = rb_class_new_instance(0, 0, rb_cConstantDeclarationNode);
138
206
 
139
- return result;
207
+ rb_ivar_set(obj, symbol("vid"), ID2SYM(RNODE_CDECL(node)->nd_vid));
208
+ rb_ivar_set(obj, symbol("else"), ast_to_node_instance(RNODE_CDECL(node)->nd_else));
209
+ rb_ivar_set(obj, symbol("value"), ast_to_node_instance(RNODE_CDECL(node)->nd_value));
210
+
211
+ return obj;
140
212
  }
141
213
 
142
214
  static VALUE
143
- node_cdecl_to_hash(const NODE *node)
215
+ constant_declaration_node_vid_get(VALUE self)
144
216
  {
145
- VALUE result = rb_hash_new();
217
+ return rb_ivar_get(self, symbol("vid"));
218
+ }
146
219
 
147
- rb_hash_aset(result, symbol("vid"), ID2SYM(RNODE_CDECL(node)->nd_vid));
148
- rb_hash_aset(result, symbol("else"), ast_to_hash(RNODE_CDECL(node)->nd_else));
149
- rb_hash_aset(result, symbol("value"), ast_to_hash(RNODE_CDECL(node)->nd_value));
220
+ static VALUE
221
+ constant_declaration_node_else_get(VALUE self)
222
+ {
223
+ return rb_ivar_get(self, symbol("else"));
224
+ }
150
225
 
151
- return result;
226
+ static VALUE
227
+ constant_declaration_node_value_get(VALUE self)
228
+ {
229
+ return rb_ivar_get(self, symbol("value"));
152
230
  }
153
231
 
154
232
  static VALUE
@@ -157,83 +235,132 @@ node_literal_to_hash(const NODE *node)
157
235
  enum node_type type = nd_type(node);
158
236
 
159
237
  switch (type) {
160
- case NODE_INTEGER: {
161
- VALUE result = rb_hash_new();
162
- rb_hash_aset(result, symbol("NODE_INTEGER"), rb_node_integer_literal_val(node));
163
- return result;
164
- }
165
- case NODE_FLOAT: {
166
- VALUE result = rb_hash_new();
167
- rb_hash_aset(result, symbol("NODE_FLOAT"), rb_node_float_literal_val(node));
168
- return result;
169
- }
170
- case NODE_RATIONAL: {
171
- VALUE result = rb_hash_new();
172
- rb_hash_aset(result, symbol("NODE_RATIONAL"), rb_node_rational_literal_val(node));
173
- return result;
174
- }
175
- case NODE_IMAGINARY: {
176
- VALUE result = rb_hash_new();
177
- rb_hash_aset(result, symbol("NODE_IMAGINARY"), rb_node_imaginary_literal_val(node));
178
- return result;
179
- }
180
- case NODE_STR: {
181
- VALUE result = rb_hash_new();
182
- rb_hash_aset(result, symbol("NODE_STR"), rb_node_str_string_val(node));
183
- return result;
184
- }
185
- case NODE_SYM: {
186
- VALUE result = rb_hash_new();
187
- rb_hash_aset(result, symbol("NODE_SYM"), rb_node_sym_string_val(node));
188
- return result;
189
- }
238
+ case NODE_INTEGER:
239
+ return integer_node_new(node);
240
+ case NODE_FLOAT:
241
+ return float_node_new(node);
242
+ case NODE_RATIONAL:
243
+ return rational_node_new(node);
244
+ case NODE_IMAGINARY:
245
+ return imaginary_node_new(node);
246
+ case NODE_STR:
247
+ return string_node_new(node);
248
+ case NODE_SYM:
249
+ return symbol_node_new(node);
250
+ case NODE_ZLIST:
251
+ return zero_list_node_new(node);
252
+ case NODE_FILE:
253
+ return file_node_new(node);
254
+ case NODE_LINE:
255
+ return line_node_new(node);
256
+ case NODE_ENCODING:
257
+ return encoding_node_new(node);
258
+ case NODE_NIL:
259
+ return nil_node_new(node);
260
+ case NODE_TRUE:
261
+ return true_node_new(node);
262
+ case NODE_FALSE:
263
+ return false_node_new(node);
190
264
  default:
191
265
  return Qnil;
192
266
  }
193
267
  }
194
268
 
195
269
  static VALUE
196
- node_class_to_hash(const NODE *node)
270
+ class_node_new(const NODE *node)
197
271
  {
198
- VALUE result = rb_hash_new();
272
+ VALUE obj = rb_class_new_instance(0, 0, rb_cClassNode);
199
273
 
200
- rb_hash_aset(result, symbol("cpath"), ast_to_hash(RNODE_CLASS(node)->nd_cpath));
201
- rb_hash_aset(result, symbol("super"), ast_to_hash(RNODE_CLASS(node)->nd_super));
202
- rb_hash_aset(result, symbol("body"), ast_to_hash(RNODE_CLASS(node)->nd_body));
274
+ rb_ivar_set(obj, symbol("cpath"), ast_to_node_instance(RNODE_CLASS(node)->nd_cpath));
275
+ rb_ivar_set(obj, symbol("super"), ast_to_node_instance(RNODE_CLASS(node)->nd_super));
276
+ rb_ivar_set(obj, symbol("body"), ast_to_node_instance(RNODE_CLASS(node)->nd_body));
203
277
 
204
- return result;
278
+ return obj;
205
279
  }
206
280
 
207
281
  static VALUE
208
- node_colon2_to_hash(const NODE *node)
282
+ class_node_cpath_get(VALUE self)
209
283
  {
210
- VALUE result = rb_hash_new();
284
+ return rb_ivar_get(self, symbol("cpath"));
285
+ }
211
286
 
212
- rb_hash_aset(result, symbol("mid"), ID2SYM(RNODE_COLON2(node)->nd_mid));
213
- rb_hash_aset(result, symbol("head"), ast_to_hash(RNODE_COLON2(node)->nd_head));
287
+ static VALUE
288
+ class_node_super_get(VALUE self)
289
+ {
290
+ return rb_ivar_get(self, symbol("super"));
291
+ }
214
292
 
215
- return result;
293
+ static VALUE
294
+ class_node_body_get(VALUE self)
295
+ {
296
+ return rb_ivar_get(self, symbol("body"));
216
297
  }
217
298
 
218
299
  static VALUE
219
- node_begin_to_hash(const NODE *node)
300
+ module_node_new(const NODE *node)
220
301
  {
221
- VALUE result = rb_hash_new();
302
+ VALUE obj = rb_class_new_instance(0, 0, rb_cModuleNode);
222
303
 
223
- rb_hash_aset(result, symbol("body"), ast_to_hash(RNODE_BEGIN(node)->nd_body));
304
+ rb_ivar_set(obj, rb_intern("@cpath"), ast_to_node_instance(RNODE_CLASS(node)->nd_cpath));
305
+ rb_ivar_set(obj, rb_intern("@super"), ast_to_node_instance(RNODE_CLASS(node)->nd_super));
306
+ rb_ivar_set(obj, rb_intern("@body"), ast_to_node_instance(RNODE_CLASS(node)->nd_body));
224
307
 
225
- return result;
308
+ return obj;
226
309
  }
227
310
 
228
311
  static VALUE
229
- node_scope_to_hash(const NODE *node)
312
+ colon2_node_new(const NODE *node)
230
313
  {
231
- VALUE result = rb_hash_new();
314
+ VALUE obj = rb_class_new_instance(0, 0, rb_cColon2Node);
232
315
 
233
- rb_hash_aset(result, symbol("args"), ast_to_hash((const NODE *)(RNODE_SCOPE(node)->nd_args)));
234
- rb_hash_aset(result, symbol("body"), ast_to_hash(RNODE_SCOPE(node)->nd_body));
316
+ rb_ivar_set(obj, symbol("mid"), ID2SYM(RNODE_COLON2(node)->nd_mid));
317
+ rb_ivar_set(obj, symbol("head"), ast_to_node_instance(RNODE_COLON2(node)->nd_head));
235
318
 
236
- return result;
319
+ return obj;
320
+ }
321
+
322
+ static VALUE
323
+ colon2_node_mid_get(VALUE self)
324
+ {
325
+ return rb_ivar_get(self, symbol("mid"));
326
+ }
327
+
328
+ static VALUE
329
+ colon2_node_head_get(VALUE self)
330
+ {
331
+ return rb_ivar_get(self, symbol("head"));
332
+ }
333
+
334
+ static VALUE
335
+ colon3_node_new(const NODE *node)
336
+ {
337
+ VALUE obj = rb_class_new_instance(0, 0, rb_cColon3Node);
338
+
339
+ rb_ivar_set(obj, rb_intern("@mid"), ID2SYM(RNODE_COLON3(node)->nd_mid));
340
+
341
+ return obj;
342
+ }
343
+
344
+ static VALUE
345
+ colon3_node_mid_get(VALUE self)
346
+ {
347
+ return rb_ivar_get(self, rb_intern("@mid"));
348
+ }
349
+
350
+ static VALUE
351
+ begin_node_new(const NODE *node)
352
+ {
353
+ VALUE obj = rb_class_new_instance(0, 0, rb_cBeginNode);
354
+
355
+ rb_ivar_set(obj, symbol("body"), ast_to_node_instance(RNODE_BEGIN(node)->nd_body));
356
+
357
+ return obj;
358
+ }
359
+
360
+ static VALUE
361
+ begin_node_body_get(VALUE self)
362
+ {
363
+ return rb_ivar_get(self, symbol("body"));
237
364
  }
238
365
 
239
366
  static VALUE
@@ -243,42 +370,48 @@ args_ainfo_to_hash(const struct rb_args_info ainfo)
243
370
 
244
371
  rb_hash_aset(result, symbol("forwarding"), INT2NUM(ainfo.forwarding));
245
372
  rb_hash_aset(result, symbol("pre_args_num"), INT2NUM(ainfo.pre_args_num));
246
- rb_hash_aset(result, symbol("pre_init"), ast_to_hash(ainfo.pre_init));
373
+ rb_hash_aset(result, symbol("pre_init"), ast_to_node_instance(ainfo.pre_init));
247
374
  rb_hash_aset(result, symbol("post_args_num"), INT2NUM(ainfo.post_args_num));
248
- rb_hash_aset(result, symbol("post_init"), ast_to_hash(ainfo.post_init));
375
+ rb_hash_aset(result, symbol("post_init"), ast_to_node_instance(ainfo.post_init));
249
376
  rb_hash_aset(result, symbol("first_post_arg"), Qnil);
250
377
  rb_hash_aset(result, symbol("rest_arg"), Qnil);
251
378
  rb_hash_aset(result, symbol("block_arg"), Qnil);
252
- rb_hash_aset(result, symbol("opt_args"), ast_to_hash((const NODE *)(ainfo.opt_args)));
253
- rb_hash_aset(result, symbol("kw_args"), ast_to_hash((const NODE *)(ainfo.kw_args)));
254
- rb_hash_aset(result, symbol("kw_rest_arg"), ast_to_hash(ainfo.kw_rest_arg));
379
+ rb_hash_aset(result, symbol("opt_args"), ast_to_node_instance((const NODE *)(ainfo.opt_args)));
380
+ rb_hash_aset(result, symbol("kw_args"), ast_to_node_instance((const NODE *)(ainfo.kw_args)));
381
+ rb_hash_aset(result, symbol("kw_rest_arg"), ast_to_node_instance(ainfo.kw_rest_arg));
255
382
 
256
383
  return result;
257
384
  }
258
385
 
259
386
  static VALUE
260
- node_args_to_hash(const NODE *node)
387
+ arguments_node_new(const NODE *node)
261
388
  {
262
- VALUE result = rb_hash_new();
389
+ VALUE obj = rb_class_new_instance(0, 0, rb_cArgumentsNode);
263
390
  VALUE ainfo_hash = args_ainfo_to_hash(RNODE_ARGS(node)->nd_ainfo);
264
391
 
265
- rb_hash_aset(result, symbol("ainfo"), ainfo_hash);
392
+ rb_ivar_set(obj, symbol("ainfo"), ainfo_hash);
266
393
 
267
- return result;
394
+ return obj;
268
395
  }
269
396
 
270
397
  static VALUE
271
- node_ivar_to_hash(const NODE *node)
398
+ arguments_node_ainfo_get(VALUE self)
272
399
  {
273
- VALUE result = rb_hash_new();
400
+ return rb_ivar_get(self, symbol("ainfo"));
401
+ }
274
402
 
275
- rb_hash_aset(result, symbol("vid"), ID2SYM(RNODE_IVAR(node)->nd_vid));
403
+ static VALUE
404
+ self_node_new(const NODE *node)
405
+ {
406
+ VALUE obj = rb_class_new_instance(0, 0, rb_cSelfNode);
276
407
 
277
- return result;
408
+ rb_ivar_set(obj, rb_intern("@state"), LONG2FIX(RNODE_SELF(node)->nd_state));
409
+
410
+ return obj;
278
411
  }
279
412
 
280
- static VALUE
281
- ast_to_hash(const NODE *node)
413
+ VALUE
414
+ ast_to_node_instance(const NODE *node)
282
415
  {
283
416
  enum node_type type;
284
417
 
@@ -289,102 +422,217 @@ ast_to_hash(const NODE *node)
289
422
  type = nd_type(node);
290
423
 
291
424
  switch (type) {
292
- case NODE_SCOPE: {
293
- VALUE result = rb_hash_new();
294
- rb_hash_aset(result, symbol("NODE_SCOPE"), node_scope_to_hash(node));
295
- return result;
296
- }
297
- case NODE_CLASS: {
298
- VALUE result = rb_hash_new();
299
- rb_hash_aset(result, symbol("NODE_CLASS"), node_class_to_hash(node));
300
- return result;
301
- }
302
- case NODE_DEFN: {
303
- VALUE result = rb_hash_new();
304
- rb_hash_aset(result, symbol("NODE_DEFN"), node_defn_to_hash(node));
305
- return result;
306
- }
307
- case NODE_OPCALL: {
308
- VALUE result = rb_hash_new();
309
- rb_hash_aset(result, symbol("NODE_OPCALL"), node_opcall_to_hash(node));
310
- return result;
311
- }
312
- case NODE_FCALL: {
313
- VALUE result = rb_hash_new();
314
- rb_hash_aset(result, symbol("NODE_FCALL"), node_fcall_to_hash(node));
315
- return result;
316
- }
317
- case NODE_CALL: {
318
- VALUE result = rb_hash_new();
319
- rb_hash_aset(result, symbol("NODE_CALL"), node_call_to_hash(node));
320
- return result;
321
- }
322
- case NODE_ARGS: {
323
- VALUE result = rb_hash_new();
324
- rb_hash_aset(result, symbol("NODE_ARGS"), node_args_to_hash(node));
325
- return result;
326
- }
327
- case NODE_BLOCK: {
328
- VALUE result = rb_hash_new();
329
- rb_hash_aset(result, symbol("NODE_BLOCK"), node_block_to_hash(node));
330
- return result;
331
- }
332
- case NODE_LASGN: {
333
- VALUE result = rb_hash_new();
334
- rb_hash_aset(result, symbol("NODE_LASGN"), node_lasgn_to_hash(node));
335
- return result;
336
- }
337
- case NODE_LVAR: {
338
- VALUE result = rb_hash_new();
339
- rb_hash_aset(result, symbol("NODE_LVAR"), node_lvar_to_hash(node));
340
- return result;
341
- }
342
- case NODE_IF: {
343
- VALUE result = rb_hash_new();
344
- rb_hash_aset(result, symbol("NODE_IF"), node_if_to_hash(node));
345
- return result;
346
- }
347
- case NODE_UNLESS: {
348
- VALUE result = rb_hash_new();
349
- rb_hash_aset(result, symbol("NODE_UNLESS"), node_unless_to_hash(node));
350
- return result;
351
- }
352
- case NODE_LIST: {
353
- VALUE result = rb_hash_new();
354
- rb_hash_aset(result, symbol("NODE_LIST"), node_list_to_hash(node));
355
- return result;
356
- }
357
- case NODE_CONST: {
358
- VALUE result = rb_hash_new();
359
- rb_hash_aset(result, symbol("NODE_CONST"), node_const_to_hash(node));
360
- return result;
361
- }
362
- case NODE_CDECL: {
363
- VALUE result = rb_hash_new();
364
- rb_hash_aset(result, symbol("NODE_CDECL"), node_cdecl_to_hash(node));
365
- return result;
366
- }
367
- case NODE_COLON2: {
368
- VALUE result = rb_hash_new();
369
- rb_hash_aset(result, symbol("NODE_COLON2"), node_colon2_to_hash(node));
370
- return result;
371
- }
372
- case NODE_BEGIN: {
373
- VALUE result = rb_hash_new();
374
- rb_hash_aset(result, symbol("NODE_BEGIN"), node_begin_to_hash(node));
375
- return result;
376
- }
377
- case NODE_IVAR: {
378
- VALUE result = rb_hash_new();
379
- rb_hash_aset(result, symbol("NODE_IVAR"), node_ivar_to_hash(node));
380
- return result;
381
- }
425
+ case NODE_SCOPE:
426
+ return scope_node_new(node);
427
+ case NODE_CLASS:
428
+ return class_node_new(node);
429
+ case NODE_MODULE:
430
+ return module_node_new(node);
431
+ case NODE_DEFN:
432
+ return definition_node_new(node);
433
+ case NODE_DEFS:
434
+ return singleton_definition_node_new(node);
435
+ case NODE_SCLASS:
436
+ return singleton_class_node_new(node);
437
+ case NODE_ATTRASGN:
438
+ return attribute_assignment_node_new(node);
439
+ case NODE_QCALL:
440
+ return safe_call_node_new(node);
441
+ case NODE_SUPER:
442
+ return super_node_new(node);
443
+ case NODE_ZSUPER:
444
+ return zero_super_node_new(node);
445
+ case NODE_OPCALL:
446
+ return operator_call_node_new(node);
447
+ case NODE_FCALL:
448
+ return function_call_node_new(node);
449
+ case NODE_VCALL:
450
+ return variable_call_node_new(node);
451
+ case NODE_CALL:
452
+ return call_node_new(node);
453
+ case NODE_ARGS:
454
+ return arguments_node_new(node);
455
+ case NODE_BLOCK:
456
+ return block_node_new(node);
457
+ case NODE_LASGN:
458
+ return local_assignment_node_new(node);
459
+ case NODE_IASGN:
460
+ return instance_assignment_node_new(node);
461
+ case NODE_CVASGN:
462
+ return class_variable_assignment_node_new(node);
463
+ case NODE_GASGN:
464
+ return global_assignment_node_new(node);
465
+ case NODE_LVAR:
466
+ return local_variable_node_new(node);
467
+ case NODE_DVAR:
468
+ return dynamic_variable_node_new(node);
469
+ case NODE_IF:
470
+ return if_statement_node_new(node);
471
+ case NODE_UNLESS:
472
+ return unless_statement_node_new(node);
473
+ case NODE_WHILE:
474
+ return while_node_new(node);
475
+ case NODE_UNTIL:
476
+ return until_node_new(node);
477
+ case NODE_CASE:
478
+ return case_node_new(node);
479
+ case NODE_CASE2:
480
+ return case2_node_new(node);
481
+ case NODE_CASE3:
482
+ return case3_node_new(node);
483
+ case NODE_WHEN:
484
+ return when_node_new(node);
485
+ case NODE_ITER:
486
+ return iter_node_new(node);
487
+ case NODE_FOR:
488
+ return for_node_new(node);
489
+ case NODE_ALIAS:
490
+ return alias_node_new(node);
491
+ case NODE_VALIAS:
492
+ return valias_node_new(node);
493
+ case NODE_UNDEF:
494
+ return undef_node_new(node);
495
+ case NODE_RETURN:
496
+ return return_node_new(node);
497
+ case NODE_RETRY:
498
+ return retry_node_new(node);
499
+ case NODE_REDO:
500
+ return redo_node_new(node);
501
+ case NODE_BREAK:
502
+ return break_node_new(node);
503
+ case NODE_NEXT:
504
+ return next_node_new(node);
505
+ case NODE_DEFINED:
506
+ return defined_node_new(node);
507
+ case NODE_OR:
508
+ return or_node_new(node);
509
+ case NODE_AND:
510
+ return and_node_new(node);
511
+ case NODE_LIST:
512
+ return list_node_new(node);
513
+ case NODE_HASH:
514
+ return hash_node_new(node);
515
+ case NODE_CONST:
516
+ return constant_node_new(node);
517
+ case NODE_CDECL:
518
+ return constant_declaration_node_new(node);
519
+ case NODE_COLON2:
520
+ return colon2_node_new(node);
521
+ case NODE_COLON3:
522
+ return colon3_node_new(node);
523
+ case NODE_BEGIN:
524
+ return begin_node_new(node);
525
+ case NODE_RESCUE:
526
+ return rescue_node_new(node);
527
+ case NODE_RESBODY:
528
+ return resbody_node_new(node);
529
+ case NODE_ENSURE:
530
+ return ensure_node_new(node);
531
+ case NODE_IVAR:
532
+ return instance_variable_node_new(node);
533
+ case NODE_CVAR:
534
+ return class_variable_node_new(node);
535
+ case NODE_GVAR:
536
+ return global_variable_node_new(node);
537
+ case NODE_NTH_REF:
538
+ return nth_ref_node_new(node);
539
+ case NODE_BACK_REF:
540
+ return back_ref_node_new(node);
541
+ case NODE_OP_ASGN1:
542
+ return operator_assignment1_node_new(node);
543
+ case NODE_OP_ASGN2:
544
+ return operator_assignment2_node_new(node);
545
+ case NODE_OP_ASGN_AND:
546
+ return operator_assignment_and_node_new(node);
547
+ case NODE_OP_ASGN_OR:
548
+ return operator_assignment_or_node_new(node);
549
+ case NODE_OP_CDECL:
550
+ return operator_constant_declaration_node_new(node);
551
+ case NODE_YIELD:
552
+ return yield_node_new(node);
553
+ case NODE_LAMBDA:
554
+ return lambda_node_new(node);
555
+ case NODE_SPLAT:
556
+ return splat_node_new(node);
557
+ case NODE_BLOCK_PASS:
558
+ return block_pass_node_new(node);
559
+ case NODE_ARGS_AUX:
560
+ return args_aux_node_new(node);
561
+ case NODE_OPT_ARG:
562
+ return opt_arg_node_new(node);
563
+ case NODE_KW_ARG:
564
+ return kw_arg_node_new(node);
565
+ case NODE_POSTARG:
566
+ return post_arg_node_new(node);
567
+ case NODE_ARGSCAT:
568
+ return args_cat_node_new(node);
569
+ case NODE_ARGSPUSH:
570
+ return args_push_node_new(node);
571
+ case NODE_FOR_MASGN:
572
+ return for_masgn_node_new(node);
573
+ case NODE_MASGN:
574
+ return masgn_node_new(node);
575
+ case NODE_DASGN:
576
+ return dasgn_node_new(node);
577
+ case NODE_ONCE:
578
+ return once_node_new(node);
579
+ case NODE_ERRINFO:
580
+ return errinfo_node_new(node);
581
+ case NODE_POSTEXE:
582
+ return postexe_node_new(node);
583
+ case NODE_ERROR:
584
+ return error_node_new(node);
585
+ case NODE_SELF:
586
+ return self_node_new(node);
587
+ case NODE_DOT2:
588
+ return range_node_new(node);
589
+ case NODE_DOT3:
590
+ return exclusive_range_node_new(node);
591
+ case NODE_FLIP2:
592
+ return flip_flop_node_new(node);
593
+ case NODE_FLIP3:
594
+ return exclusive_flip_flop_node_new(node);
595
+ case NODE_DSTR:
596
+ return dynamic_string_node_new(node);
597
+ case NODE_DSYM:
598
+ return dynamic_symbol_node_new(node);
599
+ case NODE_XSTR:
600
+ return execute_string_node_new(node);
601
+ case NODE_DXSTR:
602
+ return dynamic_execute_string_node_new(node);
603
+ case NODE_REGX:
604
+ return regexp_node_new(node);
605
+ case NODE_DREGX:
606
+ return dynamic_regexp_node_new(node);
607
+ case NODE_MATCH:
608
+ return match_node_new(node);
609
+ case NODE_MATCH2:
610
+ return match2_node_new(node);
611
+ case NODE_MATCH3:
612
+ return match3_node_new(node);
613
+ case NODE_IN:
614
+ return in_node_new(node);
615
+ case NODE_ARYPTN:
616
+ return array_pattern_node_new(node);
617
+ case NODE_HSHPTN:
618
+ return hash_pattern_node_new(node);
619
+ case NODE_FNDPTN:
620
+ return find_pattern_node_new(node);
621
+ case NODE_EVSTR:
622
+ return embedded_expression_string_node_new(node);
382
623
  case NODE_INTEGER:
383
624
  case NODE_FLOAT:
384
625
  case NODE_RATIONAL:
385
626
  case NODE_IMAGINARY:
386
627
  case NODE_STR:
387
628
  case NODE_SYM:
629
+ case NODE_ZLIST:
630
+ case NODE_FILE:
631
+ case NODE_LINE:
632
+ case NODE_ENCODING:
633
+ case NODE_NIL:
634
+ case NODE_TRUE:
635
+ case NODE_FALSE:
388
636
  return node_literal_to_hash(node);
389
637
  default:
390
638
  return Qfalse;
@@ -393,7 +641,7 @@ ast_to_hash(const NODE *node)
393
641
 
394
642
  static VALUE
395
643
  kanayago_parse(VALUE self, VALUE source)
396
- {
644
+ {
397
645
  struct ruby_parser *parser;
398
646
  rb_parser_t *parser_params;
399
647
 
@@ -405,11 +653,9 @@ kanayago_parse(VALUE self, VALUE source)
405
653
 
406
654
  VALUE vast = rb_parser_compile_string(vparser, "main", source, 0);
407
655
 
408
- rb_ast_t *ast;
409
-
410
- TypedData_Get_Struct(vast, rb_ast_t, &ast_data_type, ast);
656
+ rb_ast_t *ast = rb_ruby_ast_data_get(vast);
411
657
 
412
- return ast_to_hash(ast->body.root);
658
+ return ast_to_node_instance(ast->body.root);
413
659
  }
414
660
 
415
661
  RUBY_FUNC_EXPORTED void
@@ -417,4 +663,77 @@ Init_kanayago(void)
417
663
  {
418
664
  rb_mKanayago = rb_define_module("Kanayago");
419
665
  rb_define_module_function(rb_mKanayago, "kanayago_parse", kanayago_parse, 1);
666
+
667
+ // For Kanayago::ScopeNode
668
+ Init_ScopeNode(rb_mKanayago);
669
+
670
+ // For Literal Node(e.g. Kanayago::IntegerNode)
671
+ Init_LiteralNode(rb_mKanayago);
672
+
673
+ // For String Node(e.g. Kanayago::DynamicStringNode)
674
+ Init_StringNode(rb_mKanayago);
675
+
676
+ rb_cConstantNode = rb_define_class_under(rb_mKanayago, "ConstantNode", rb_cObject);
677
+ rb_define_method(rb_cConstantNode, "vid", constant_node_vid_get, 0);
678
+
679
+ rb_cConstantDeclarationNode = rb_define_class_under(rb_mKanayago, "ConstantDeclarationNode", rb_cObject);
680
+ rb_define_method(rb_cConstantDeclarationNode, "vid", constant_declaration_node_vid_get, 0);
681
+ rb_define_method(rb_cConstantDeclarationNode, "else", constant_declaration_node_else_get, 0);
682
+ rb_define_method(rb_cConstantDeclarationNode, "value", constant_declaration_node_value_get, 0);
683
+
684
+ rb_cDefinitionNode = rb_define_class_under(rb_mKanayago, "DefinitionNode", rb_cObject);
685
+ rb_define_method(rb_cDefinitionNode, "mid", definition_node_mid_get, 0);
686
+ rb_define_method(rb_cDefinitionNode, "defn", definition_node_defn_get, 0);
687
+
688
+ rb_cOperatorCallNode = rb_define_class_under(rb_mKanayago, "OperatorCallNode", rb_cObject);
689
+ rb_define_method(rb_cOperatorCallNode, "recv", operator_call_node_recv_get, 0);
690
+ rb_define_method(rb_cOperatorCallNode, "mid", operator_call_node_mid_get, 0);
691
+ rb_define_method(rb_cOperatorCallNode, "args", operator_call_node_args_get, 0);
692
+
693
+ rb_cListNode = rb_define_class_under(rb_mKanayago, "ListNode", rb_cObject);
694
+
695
+ rb_cArgumentsNode = rb_define_class_under(rb_mKanayago, "ArgumentsNode", rb_cObject);
696
+ rb_define_method(rb_cArgumentsNode, "ainfo", arguments_node_ainfo_get, 0);
697
+
698
+ rb_cCallNode = rb_define_class_under(rb_mKanayago, "CallNode", rb_cObject);
699
+ rb_define_method(rb_cCallNode, "recv", call_node_recv_get, 0);
700
+ rb_define_method(rb_cCallNode, "mid", call_node_mid_get, 0);
701
+ rb_define_method(rb_cCallNode, "args", call_node_args_get, 0);
702
+
703
+ rb_cFunctionCallNode = rb_define_class_under(rb_mKanayago, "FunctionCallNode", rb_cObject);
704
+ rb_define_method(rb_cFunctionCallNode, "mid", function_call_node_mid_get, 0);
705
+ rb_define_method(rb_cFunctionCallNode, "args", function_call_node_args_get, 0);
706
+
707
+ rb_cVariableCallNode = rb_define_class_under(rb_mKanayago, "VariableCallNode", rb_cObject);
708
+ rb_define_method(rb_cVariableCallNode, "mid", variable_call_node_mid_get, 0);
709
+
710
+ // For Statement Node(e.g. Kanayago::IfStatementNode)
711
+ Init_StatementNode(rb_mKanayago);
712
+
713
+ rb_cBlockNode = rb_define_class_under(rb_mKanayago, "BlockNode", rb_cArray);
714
+
715
+ rb_cBeginNode = rb_define_class_under(rb_mKanayago, "BeginNode", rb_cObject);
716
+ rb_define_method(rb_cBeginNode, "body", begin_node_body_get, 0);
717
+
718
+ rb_cClassNode = rb_define_class_under(rb_mKanayago, "ClassNode", rb_cObject);
719
+ rb_define_method(rb_cClassNode, "cpath", class_node_cpath_get, 0);
720
+ rb_define_method(rb_cClassNode, "super", class_node_super_get, 0);
721
+ rb_define_method(rb_cClassNode, "body", class_node_body_get, 0);
722
+
723
+ rb_cModuleNode = rb_define_class_under(rb_mKanayago, "ModuleNode", rb_cObject);
724
+
725
+ rb_cColon2Node = rb_define_class_under(rb_mKanayago, "Colon2Node", rb_cObject);
726
+ rb_define_method(rb_cColon2Node, "mid", colon2_node_mid_get, 0);
727
+ rb_define_method(rb_cColon2Node, "head", colon2_node_head_get, 0);
728
+
729
+ rb_cColon3Node = rb_define_class_under(rb_mKanayago, "Colon3Node", rb_cObject);
730
+ rb_define_method(rb_cColon3Node, "mid", colon3_node_mid_get, 0);
731
+
732
+ // For Variable Node(e.g. Kanayago::LocalVariableNode)
733
+ Init_VariableNode(rb_mKanayago);
734
+
735
+ // For Pattern Node(e.g. Kanayago::InNode)
736
+ Init_PatternNode(rb_mKanayago);
737
+
738
+ rb_cSelfNode = rb_define_class_under(rb_mKanayago, "SelfNode", rb_cObject);
420
739
  }