Class: Duby::Compiler::C

Inherits:
Object show all
Defined in:
lib/duby/c/compiler.rb

Defined Under Namespace

Classes: MathCompiler

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filename) ⇒ C

Returns a new instance of C.



19
20
21
22
23
24
25
26
# File 'lib/duby/c/compiler.rb', line 19

def initialize(filename)
  @filename = filename
  @src = ""
  
  self.type_mapper[AST::TypeReference.new(:fixnum)] = "int"
  
  self.call_compilers[AST::TypeReference.new(:fixnum)] = MathCompiler.new
end

Instance Attribute Details

#filenameObject

Returns the value of attribute filename.



17
18
19
# File 'lib/duby/c/compiler.rb', line 17

def filename
  @filename
end

#srcObject

Returns the value of attribute src.



17
18
19
# File 'lib/duby/c/compiler.rb', line 17

def src
  @src
end

Instance Method Details

#branch(iff) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/duby/c/compiler.rb', line 60

def branch(iff)
  @src << "if ("
  
  iff.condition.compile(self)
  
  @src << ") {"
  
  iff.body.compile(self)
  
  if iff.else
    @src << "} else {"
    
    iff.else.compile(self)
  end
  
  @src << "}"
end

#call(call) ⇒ Object



78
79
80
# File 'lib/duby/c/compiler.rb', line 78

def call(call)
  call_compilers[call.target.inferred_type].call(self, call)
end

#call_compilersObject



82
83
84
# File 'lib/duby/c/compiler.rb', line 82

def call_compilers
  @call_compilers ||= {}
end

#compile(ast) ⇒ Object



28
29
30
# File 'lib/duby/c/compiler.rb', line 28

def compile(ast)
  ast.compile(self)
end

#declare_argument(name, type) ⇒ Object



56
57
58
# File 'lib/duby/c/compiler.rb', line 56

def declare_argument(name, type)
  @src << "#{type_mapper[type]} #{name}"
end

#define_main(body) ⇒ Object



32
33
34
35
36
37
38
39
40
# File 'lib/duby/c/compiler.rb', line 32

def define_main(body)
  old_src, @src = @src, "int main(int argc, char **argv)\n{\n"

  body.compile(self)

  @src << "}\n\n"

  @src = old_src + @src
end

#define_method(name, signature, args, body) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/duby/c/compiler.rb', line 42

def define_method(name, signature, args, body)
  old_src, @src =  @src, "#{type_mapper[signature[:return]]} #{name}("
  
  args.compile(self)
  
  @src << ")\n{\n"
  
  body.compile(self)
  
  @src << "\n}\n\n"

  @src = old_src + @src
end

#fixnum(value) ⇒ Object



98
99
100
# File 'lib/duby/c/compiler.rb', line 98

def fixnum(value)
  @src << value.to_s
end

#generateObject



112
113
114
# File 'lib/duby/c/compiler.rb', line 112

def generate
  @src
end

#local(name, type) ⇒ Object



94
95
96
# File 'lib/duby/c/compiler.rb', line 94

def local(name, type)
  @src << name
end

#newlineObject



102
103
104
# File 'lib/duby/c/compiler.rb', line 102

def newline
  @src << ";\n"
end

#retObject



106
107
108
109
110
# File 'lib/duby/c/compiler.rb', line 106

def ret
  @src << "return "
  
  yield
end

#self_call(fcall) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/duby/c/compiler.rb', line 86

def self_call(fcall)
  @src << "#{fcall.name}("
  
  fcall.parameters.each {|param| param.compile(self)}
  
  @src << ")"
end

#type_mapperObject



116
117
118
# File 'lib/duby/c/compiler.rb', line 116

def type_mapper
  @type_mapper ||= {}
end