Updated Makefiles to fit new directory structure.
[voodoo-lang.git] / lib / voodoo / compiler.rb
blobfde1c06428fe6612965da75c5caaad9fc8ecd461
1 module Voodoo
2   # Voodoo compiler driver.
3   # The compiler driver reads input from a parser (see
4   # Voodoo::Parser), feeds it to a code generator (see
5   # Voodoo::CommonCodeGenerator), and writes the generated code.
6   #
7   # An example of its usage can be found on the main page for the
8   # Voodoo module.
9   class Compiler
10     # Initialize a compiler.
11     #
12     # Parameters:
13     # [parser] the parser to be used (see Voodoo::Parser)
14     # [code_generator] the code generator to be used
15     #                  (see Voodoo::CommonCodeGenerator)
16     # [output] an IO object. The generated code will be written to it
17     def initialize parser, code_generator, output
18       @parser = parser
19       @generator = code_generator
20       @output = output
21     end
23     # Perform the compilation.
24     def compile
25       while true
26         statement = @parser.parse_top_level
28         break if statement == nil
29         next if statement.empty?
31         case statement[0]
32         when :align, :export, :import, :label, :section
33           # Specials, passed on to the generator
34           args = statement[1..-1]
35           @generator.send statement[0], *args
36         when :byte, :string, :word
37           # Data definition
38           @generator.add_data statement
39         when :function
40           # Function declaration
41           body = statement[2]
42           @generator.add_function statement[1], *body
43         else
44           # Statement
45           @generator.add_code statement
46         end
47       end
49       @generator.write @output
50     end
51   end
52 end