Class: Ikra::Translator::ASTTranslator::StatementTranslator
- Inherits:
-
Object
- Object
- Ikra::Translator::ASTTranslator::StatementTranslator
show all
- Defined in:
- lib/translator/ast_translator.rb
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
Returns a new instance of StatementTranslator.
375
376
377
|
# File 'lib/translator/ast_translator.rb', line 375
def initialize(translator)
@translator = translator
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(symbol, *args) ⇒ Object
387
388
389
390
391
392
393
394
395
396
397
|
# File 'lib/translator/ast_translator.rb', line 387
def method_missing(symbol, *args)
if symbol.to_s.start_with?("visit_")
if expression_translator.respond_to?(symbol)
return expression_translator.send(symbol, *args) + ";\n"
else
super
end
else
return translator.send(symbol, *args)
end
end
|
Instance Attribute Details
#translator ⇒ Object
This class should not inherit from [AST::Visitor]. Otherwise, the dispatch mechanisum to [ExpressionTranslator] will not work properly anymore.
373
374
375
|
# File 'lib/translator/ast_translator.rb', line 373
def translator
@translator
end
|
Instance Method Details
#expression_translator ⇒ Object
379
380
381
|
# File 'lib/translator/ast_translator.rb', line 379
def expression_translator
return translator.expression_translator
end
|
#statement_translator ⇒ Object
383
384
385
|
# File 'lib/translator/ast_translator.rb', line 383
def statement_translator
return self
end
|
#visit_begin_node(node) ⇒ Object
443
444
445
446
447
448
449
450
451
452
453
|
# File 'lib/translator/ast_translator.rb', line 443
def visit_begin_node(node)
if node.body_stmts.size == 0
return wrap_in_c_block("")
end
body_translated = node.body_stmts.map do |stmt|
stmt.accept(self)
end.join("")
return wrap_in_c_block(body_translated)
end
|
#visit_behavior_node(node) ⇒ Object
399
400
401
|
# File 'lib/translator/ast_translator.rb', line 399
def visit_behavior_node(node)
raise AssertionError.new("Methods/blocks cannot be translated as a statement")
end
|
#visit_break_node(node) ⇒ Object
432
433
434
|
# File 'lib/translator/ast_translator.rb', line 432
def visit_break_node(node)
return "break;\n"
end
|
#visit_for_node(node) ⇒ Object
407
408
409
410
411
412
413
414
|
# File 'lib/translator/ast_translator.rb', line 407
def visit_for_node(node)
= "for (#{node.iterator_identifier.to_s} = #{node.range_from.accept(expression_translator)}; #{node.iterator_identifier.to_s} <= #{node.range_to.accept(expression_translator)}; #{node.iterator_identifier.to_s}++)"
return +
"\n" +
node.body_stmts.accept(self) +
"#{node.iterator_identifier.to_s}--;\n"
end
|
#visit_if_node(node) ⇒ Object
436
437
438
439
440
441
|
# File 'lib/translator/ast_translator.rb', line 436
def visit_if_node(node)
return "if (#{node.condition.accept(expression_translator)})\n" +
node.true_body_stmts.accept(self) +
"else\n" +
node.false_body_stmts.accept(self)
end
|
#visit_return_node(node) ⇒ Object
455
456
457
|
# File 'lib/translator/ast_translator.rb', line 455
def visit_return_node(node)
return "return #{node.value.accept(expression_translator)};\n"
end
|
#visit_root_node(node) ⇒ Object
403
404
405
|
# File 'lib/translator/ast_translator.rb', line 403
def visit_root_node(node)
return node.single_child.accept(self)
end
|
#visit_until_node(node) ⇒ Object
424
425
426
|
# File 'lib/translator/ast_translator.rb', line 424
def visit_until_node(node)
return "while (#{node.condition.accept(expression_translator)})\n#{node.body_stmts.accept(self)}"
end
|
#visit_until_post_node(node) ⇒ Object
428
429
430
|
# File 'lib/translator/ast_translator.rb', line 428
def visit_until_post_node(node)
return "do #{node.body_stmts.accept(self)}while (#{node.condition.accept(expression_translator)});\n"
end
|
#visit_while_node(node) ⇒ Object
416
417
418
|
# File 'lib/translator/ast_translator.rb', line 416
def visit_while_node(node)
return "while (#{node.condition.accept(expression_translator)})\n#{node.body_stmts.accept(self)}"
end
|
#visit_while_post_node(node) ⇒ Object
420
421
422
|
# File 'lib/translator/ast_translator.rb', line 420
def visit_while_post_node(node)
return "do #{node.body_stmts.accept(self)}while (#{node.condition.accept(expression_translator)});\n"
end
|