iv-phonic 0.1.0 → 0.1.1
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.
- data/Rakefile +1 -1
- data/ext/include/iv/ast.h +27 -39
- data/ext/include/iv/ast_factory.h +148 -51
- data/ext/include/iv/ast_fwd.h +8 -4
- data/ext/include/iv/ast_serializer.h +9 -0
- data/ext/include/iv/ast_visitor.h +3 -0
- data/ext/include/iv/lexer.h +37 -4
- data/ext/include/iv/parser.h +219 -109
- data/ext/iv/phonic/ast_fwd.h +6 -0
- data/ext/iv/phonic/creator.h +83 -24
- data/ext/iv/phonic/factory.h +258 -104
- data/test/test_iv_phonic.rb +8 -1
- metadata +2 -2
data/ext/iv/phonic/ast_fwd.h
CHANGED
@@ -20,6 +20,12 @@ class AstNodeBase<iv::phonic::AstFactory>
|
|
20
20
|
begin_ = begin;
|
21
21
|
end_ = end;
|
22
22
|
}
|
23
|
+
std::size_t begin_position() const {
|
24
|
+
return begin_;
|
25
|
+
}
|
26
|
+
std::size_t end_position() const {
|
27
|
+
return end_;
|
28
|
+
}
|
23
29
|
private:
|
24
30
|
std::size_t begin_;
|
25
31
|
std::size_t end_;
|
data/ext/iv/phonic/creator.h
CHANGED
@@ -36,6 +36,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
36
36
|
rb_ary_push(array, ret_);
|
37
37
|
}
|
38
38
|
rb_hash_aset(hash, SYM("body"), array);
|
39
|
+
SetLocation(hash, stmt);
|
39
40
|
ret_ = hash;
|
40
41
|
}
|
41
42
|
|
@@ -44,6 +45,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
44
45
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("FunctionStatement"));
|
45
46
|
Visit(stmt->function());
|
46
47
|
rb_hash_aset(hash, SYM("body"), ret_);
|
48
|
+
SetLocation(hash, stmt);
|
47
49
|
ret_ = hash;
|
48
50
|
}
|
49
51
|
|
@@ -52,6 +54,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
52
54
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("FunctionDeclaration"));
|
53
55
|
Visit(decl->function());
|
54
56
|
rb_hash_aset(hash, SYM("body"), ret_);
|
57
|
+
SetLocation(hash, decl);
|
55
58
|
ret_ = hash;
|
56
59
|
}
|
57
60
|
|
@@ -62,23 +65,31 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
62
65
|
VALUE array = rb_ary_new();
|
63
66
|
for (Declarations::const_iterator it = stmt->decls().begin(),
|
64
67
|
last = stmt->decls().end(); it != last; ++it) {
|
65
|
-
|
66
|
-
|
67
|
-
Visit((*it)->name());
|
68
|
-
rb_hash_aset(decl, SYM("name"), ret_);
|
69
|
-
if ((*it)->expr()) {
|
70
|
-
(*it)->expr()->Accept(this);
|
71
|
-
rb_hash_aset(decl, SYM("expr"), ret_);
|
72
|
-
}
|
73
|
-
rb_ary_push(array, decl);
|
68
|
+
Visit(*it);
|
69
|
+
rb_ary_push(array, ret_);
|
74
70
|
}
|
75
71
|
rb_hash_aset(hash, SYM("body"), array);
|
72
|
+
SetLocation(hash, stmt);
|
73
|
+
ret_ = hash;
|
74
|
+
}
|
75
|
+
|
76
|
+
void Visit(const Declaration* decl) {
|
77
|
+
VALUE hash = rb_hash_new();
|
78
|
+
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Declaration"));
|
79
|
+
Visit(decl->name());
|
80
|
+
rb_hash_aset(hash, SYM("name"), ret_);
|
81
|
+
if (decl->expr()) {
|
82
|
+
decl->expr()->Accept(this);
|
83
|
+
rb_hash_aset(hash, SYM("expr"), ret_);
|
84
|
+
}
|
85
|
+
SetLocation(hash, decl);
|
76
86
|
ret_ = hash;
|
77
87
|
}
|
78
88
|
|
79
89
|
void Visit(const EmptyStatement* stmt) {
|
80
90
|
VALUE hash = rb_hash_new();
|
81
91
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("EmptyStatement"));
|
92
|
+
SetLocation(hash, stmt);
|
82
93
|
ret_ = hash;
|
83
94
|
}
|
84
95
|
|
@@ -93,6 +104,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
93
104
|
stmt->else_statement()->Accept(this);
|
94
105
|
rb_hash_aset(hash, SYM("else"), ret_);
|
95
106
|
}
|
107
|
+
SetLocation(hash, stmt);
|
96
108
|
ret_ = hash;
|
97
109
|
}
|
98
110
|
|
@@ -103,6 +115,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
103
115
|
rb_hash_aset(hash, SYM("cond"), ret_);
|
104
116
|
stmt->body()->Accept(this);
|
105
117
|
rb_hash_aset(hash, SYM("body"), ret_);
|
118
|
+
SetLocation(hash, stmt);
|
106
119
|
ret_ = hash;
|
107
120
|
}
|
108
121
|
|
@@ -113,6 +126,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
113
126
|
rb_hash_aset(hash, SYM("cond"), ret_);
|
114
127
|
stmt->body()->Accept(this);
|
115
128
|
rb_hash_aset(hash, SYM("body"), ret_);
|
129
|
+
SetLocation(hash, stmt);
|
116
130
|
ret_ = hash;
|
117
131
|
}
|
118
132
|
|
@@ -133,6 +147,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
133
147
|
}
|
134
148
|
stmt->body()->Accept(this);
|
135
149
|
rb_hash_aset(hash, SYM("body"), ret_);
|
150
|
+
SetLocation(hash, stmt);
|
136
151
|
ret_ = hash;
|
137
152
|
}
|
138
153
|
|
@@ -145,6 +160,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
145
160
|
rb_hash_aset(hash, SYM("enum"), ret_);
|
146
161
|
stmt->body()->Accept(this);
|
147
162
|
rb_hash_aset(hash, SYM("body"), ret_);
|
163
|
+
SetLocation(hash, stmt);
|
148
164
|
ret_ = hash;
|
149
165
|
}
|
150
166
|
|
@@ -155,6 +171,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
155
171
|
stmt->label()->Accept(this);
|
156
172
|
rb_hash_aset(hash, SYM("label"), ret_);
|
157
173
|
}
|
174
|
+
SetLocation(hash, stmt);
|
158
175
|
ret_ = hash;
|
159
176
|
}
|
160
177
|
|
@@ -165,6 +182,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
165
182
|
stmt->label()->Accept(this);
|
166
183
|
rb_hash_aset(hash, SYM("label"), ret_);
|
167
184
|
}
|
185
|
+
SetLocation(hash, stmt);
|
168
186
|
ret_ = hash;
|
169
187
|
}
|
170
188
|
|
@@ -173,6 +191,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
173
191
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ReturnStatement"));
|
174
192
|
stmt->expr()->Accept(this);
|
175
193
|
rb_hash_aset(hash, SYM("expr"), ret_);
|
194
|
+
SetLocation(hash, stmt);
|
176
195
|
ret_ = hash;
|
177
196
|
}
|
178
197
|
|
@@ -183,6 +202,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
183
202
|
rb_hash_aset(hash, SYM("context"), ret_);
|
184
203
|
stmt->body()->Accept(this);
|
185
204
|
rb_hash_aset(hash, SYM("body"), ret_);
|
205
|
+
SetLocation(hash, stmt);
|
186
206
|
ret_ = hash;
|
187
207
|
}
|
188
208
|
|
@@ -193,6 +213,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
193
213
|
rb_hash_aset(hash, SYM("label"), ret_);
|
194
214
|
stmt->body()->Accept(this);
|
195
215
|
rb_hash_aset(hash, SYM("body"), ret_);
|
216
|
+
SetLocation(hash, stmt);
|
196
217
|
ret_ = hash;
|
197
218
|
}
|
198
219
|
|
@@ -204,42 +225,52 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
204
225
|
VALUE array = rb_ary_new();
|
205
226
|
for (CaseClauses::const_iterator it = stmt->clauses().begin(),
|
206
227
|
last = stmt->clauses().end(); it != last; ++it) {
|
207
|
-
|
208
|
-
if ((*it)->IsDefault()) {
|
209
|
-
rb_hash_aset(clause, SYM("type"), rb_str_new_cstr("Default"));
|
210
|
-
} else {
|
211
|
-
rb_hash_aset(clause, SYM("type"), rb_str_new_cstr("Case"));
|
212
|
-
(*it)->expr()->Accept(this);
|
213
|
-
rb_hash_aset(clause, SYM("expr"), ret_);
|
214
|
-
}
|
215
|
-
VALUE stmts = rb_ary_new();
|
216
|
-
for (Statements::const_iterator st = (*it)->body().begin(),
|
217
|
-
stlast = (*it)->body().end(); st != stlast; ++st) {
|
218
|
-
(*st)->Accept(this);
|
219
|
-
rb_ary_push(stmts, ret_);
|
220
|
-
}
|
221
|
-
rb_hash_aset(clause, SYM("body"), stmts);
|
228
|
+
Visit(*it);
|
222
229
|
rb_ary_push(array, ret_);
|
223
230
|
}
|
224
231
|
rb_hash_aset(hash, SYM("clauses"), array);
|
232
|
+
SetLocation(hash, stmt);
|
233
|
+
ret_ = hash;
|
234
|
+
}
|
235
|
+
|
236
|
+
void Visit(const CaseClause* cl) {
|
237
|
+
VALUE hash = rb_hash_new();
|
238
|
+
if (cl->IsDefault()) {
|
239
|
+
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Default"));
|
240
|
+
} else {
|
241
|
+
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Case"));
|
242
|
+
cl->expr()->Accept(this);
|
243
|
+
rb_hash_aset(hash, SYM("expr"), ret_);
|
244
|
+
}
|
245
|
+
VALUE stmts = rb_ary_new();
|
246
|
+
for (Statements::const_iterator st = cl->body().begin(),
|
247
|
+
stlast = cl->body().end(); st != stlast; ++st) {
|
248
|
+
(*st)->Accept(this);
|
249
|
+
rb_ary_push(stmts, ret_);
|
250
|
+
}
|
251
|
+
rb_hash_aset(hash, SYM("body"), stmts);
|
252
|
+
SetLocation(hash, cl);
|
225
253
|
ret_ = hash;
|
226
254
|
}
|
227
255
|
|
228
256
|
void Visit(const ThrowStatement* stmt) {
|
229
257
|
VALUE hash = rb_hash_new();
|
230
258
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ThrowStatement"));
|
259
|
+
SetLocation(hash, stmt);
|
231
260
|
ret_ = hash;
|
232
261
|
}
|
233
262
|
|
234
263
|
void Visit(const TryStatement* stmt) {
|
235
264
|
VALUE hash = rb_hash_new();
|
236
265
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("TryStatement"));
|
266
|
+
SetLocation(hash, stmt);
|
237
267
|
ret_ = hash;
|
238
268
|
}
|
239
269
|
|
240
270
|
void Visit(const DebuggerStatement* stmt) {
|
241
271
|
VALUE hash = rb_hash_new();
|
242
272
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("DebuggerStatement"));
|
273
|
+
SetLocation(hash, stmt);
|
243
274
|
ret_ = hash;
|
244
275
|
}
|
245
276
|
|
@@ -248,6 +279,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
248
279
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ExpressionStatement"));
|
249
280
|
stmt->expr()->Accept(this);
|
250
281
|
rb_hash_aset(hash, SYM("body"), ret_);
|
282
|
+
SetLocation(hash, stmt);
|
251
283
|
ret_ = hash;
|
252
284
|
}
|
253
285
|
|
@@ -260,6 +292,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
260
292
|
rb_hash_aset(hash, SYM("left"), ret_);
|
261
293
|
expr->right()->Accept(this);
|
262
294
|
rb_hash_aset(hash, SYM("right"), ret_);
|
295
|
+
SetLocation(hash, expr);
|
263
296
|
ret_ = hash;
|
264
297
|
}
|
265
298
|
|
@@ -272,6 +305,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
272
305
|
rb_hash_aset(hash, SYM("left"), ret_);
|
273
306
|
expr->right()->Accept(this);
|
274
307
|
rb_hash_aset(hash, SYM("right"), ret_);
|
308
|
+
SetLocation(hash, expr);
|
275
309
|
ret_ = hash;
|
276
310
|
}
|
277
311
|
|
@@ -284,6 +318,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
284
318
|
rb_hash_aset(hash, SYM("left"), ret_);
|
285
319
|
expr->right()->Accept(this);
|
286
320
|
rb_hash_aset(hash, SYM("right"), ret_);
|
321
|
+
SetLocation(hash, expr);
|
287
322
|
ret_ = hash;
|
288
323
|
}
|
289
324
|
|
@@ -294,6 +329,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
294
329
|
rb_str_new_cstr(core::Token::ToString(expr->op())));
|
295
330
|
expr->expr()->Accept(this);
|
296
331
|
rb_hash_aset(hash, SYM("expr"), ret_);
|
332
|
+
SetLocation(hash, expr);
|
297
333
|
ret_ = hash;
|
298
334
|
}
|
299
335
|
|
@@ -304,6 +340,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
304
340
|
rb_str_new_cstr(core::Token::ToString(expr->op())));
|
305
341
|
expr->expr()->Accept(this);
|
306
342
|
rb_hash_aset(hash, SYM("expr"), ret_);
|
343
|
+
SetLocation(hash, expr);
|
307
344
|
ret_ = hash;
|
308
345
|
}
|
309
346
|
|
@@ -317,6 +354,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
317
354
|
reinterpret_cast<const char*>(str.data()),
|
318
355
|
str.size()*2,
|
319
356
|
rb_to_encoding(Encoding::UTF16Encoding()))));
|
357
|
+
SetLocation(hash, literal);
|
320
358
|
ret_ = hash;
|
321
359
|
}
|
322
360
|
|
@@ -324,6 +362,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
324
362
|
VALUE hash = rb_hash_new();
|
325
363
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("NumberLiteral"));
|
326
364
|
rb_hash_aset(hash, SYM("value"), rb_float_new(literal->value()));
|
365
|
+
SetLocation(hash, literal);
|
327
366
|
ret_ = hash;
|
328
367
|
}
|
329
368
|
|
@@ -337,34 +376,40 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
337
376
|
reinterpret_cast<const char*>(str.data()),
|
338
377
|
str.size()*2,
|
339
378
|
rb_to_encoding(Encoding::UTF16Encoding()))));
|
379
|
+
SetLocation(hash, literal);
|
340
380
|
ret_ = hash;
|
341
381
|
}
|
342
382
|
|
343
383
|
void Visit(const ThisLiteral* literal) {
|
344
384
|
VALUE hash = rb_hash_new();
|
345
385
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("ThisLiteral"));
|
386
|
+
SetLocation(hash, literal);
|
346
387
|
ret_ = hash;
|
347
388
|
}
|
348
389
|
|
349
390
|
void Visit(const NullLiteral* literal) {
|
350
391
|
VALUE hash = rb_hash_new();
|
351
392
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("NullLiteral"));
|
393
|
+
SetLocation(hash, literal);
|
352
394
|
ret_ = hash;
|
353
395
|
}
|
354
396
|
|
355
397
|
void Visit(const TrueLiteral* literal) {
|
356
398
|
VALUE hash = rb_hash_new();
|
357
399
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("TrueLiteral"));
|
400
|
+
SetLocation(hash, literal);
|
358
401
|
ret_ = hash;
|
359
402
|
}
|
360
403
|
|
361
404
|
void Visit(const FalseLiteral* literal) {
|
362
405
|
VALUE hash = rb_hash_new();
|
363
406
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("FalseLiteral"));
|
407
|
+
SetLocation(hash, literal);
|
364
408
|
ret_ = hash;
|
365
409
|
}
|
366
410
|
|
367
411
|
void Visit(const Undefined* literal) {
|
412
|
+
// Undefined has no location
|
368
413
|
VALUE hash = rb_hash_new();
|
369
414
|
rb_hash_aset(hash, SYM("type"), rb_str_new_cstr("Undefined"));
|
370
415
|
ret_ = hash;
|
@@ -387,6 +432,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
387
432
|
reinterpret_cast<const char*>(flags.data()),
|
388
433
|
flags.size()*2,
|
389
434
|
rb_to_encoding(Encoding::UTF16Encoding()))));
|
435
|
+
SetLocation(hash, literal);
|
390
436
|
ret_ = hash;
|
391
437
|
}
|
392
438
|
|
@@ -400,6 +446,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
400
446
|
rb_ary_push(array, ret_);
|
401
447
|
}
|
402
448
|
rb_hash_aset(hash, SYM("value"), array);
|
449
|
+
SetLocation(hash, literal);
|
403
450
|
ret_ = hash;
|
404
451
|
}
|
405
452
|
|
@@ -441,6 +488,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
441
488
|
rb_ary_push(array, item);
|
442
489
|
}
|
443
490
|
rb_hash_aset(hash, SYM("value"), array);
|
491
|
+
SetLocation(hash, literal);
|
444
492
|
ret_ = hash;
|
445
493
|
}
|
446
494
|
|
@@ -469,6 +517,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
469
517
|
}
|
470
518
|
rb_hash_aset(hash, SYM("body"), array);
|
471
519
|
}
|
520
|
+
SetLocation(hash, literal);
|
472
521
|
ret_ = hash;
|
473
522
|
}
|
474
523
|
|
@@ -479,6 +528,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
479
528
|
rb_hash_aset(hash, SYM("target"), ret_);
|
480
529
|
expr->key()->Accept(this);
|
481
530
|
rb_hash_aset(hash, SYM("key"), ret_);
|
531
|
+
SetLocation(hash, expr);
|
482
532
|
ret_ = hash;
|
483
533
|
}
|
484
534
|
|
@@ -489,6 +539,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
489
539
|
rb_hash_aset(hash, SYM("target"), ret_);
|
490
540
|
Visit(expr->key());
|
491
541
|
rb_hash_aset(hash, SYM("key"), ret_);
|
542
|
+
SetLocation(hash, expr);
|
492
543
|
ret_ = hash;
|
493
544
|
}
|
494
545
|
|
@@ -504,6 +555,7 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
504
555
|
rb_ary_push(args, ret_);
|
505
556
|
}
|
506
557
|
rb_hash_aset(hash, SYM("args"), args);
|
558
|
+
SetLocation(hash, call);
|
507
559
|
ret_ = hash;
|
508
560
|
}
|
509
561
|
|
@@ -519,10 +571,17 @@ class Creator : public iv::core::ast::AstVisitor<AstFactory>::const_type {
|
|
519
571
|
rb_ary_push(args, ret_);
|
520
572
|
}
|
521
573
|
rb_hash_aset(hash, SYM("args"), args);
|
574
|
+
SetLocation(hash, call);
|
522
575
|
ret_ = hash;
|
523
576
|
}
|
524
577
|
|
525
578
|
private:
|
579
|
+
|
580
|
+
static void SetLocation(VALUE hash, const AstNode* node) {
|
581
|
+
rb_hash_aset(hash, SYM("begin"), INT2NUM(node->begin_position()));
|
582
|
+
rb_hash_aset(hash, SYM("end"), INT2NUM(node->end_position()));
|
583
|
+
}
|
584
|
+
|
526
585
|
VALUE ret_;
|
527
586
|
};
|
528
587
|
|