Class: Ikra::Translator::ASTTranslator::StatementTranslator

Inherits:
Object
  • Object
show all
Defined in:
lib/translator/ast_translator.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(translator) ⇒ StatementTranslator

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

#translatorObject (readonly)

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_translatorObject



379
380
381
# File 'lib/translator/ast_translator.rb', line 379

def expression_translator
    return translator.expression_translator
end

#statement_translatorObject



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

Raises:



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)
    loop_header = "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 loop_header + 
        "\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