2 require 'voodoo/parser'
5 # Voodoo compiler driver.
6 # The compiler driver reads input from a parser (see
7 # Voodoo::Parser), feeds it to a code generator (see
8 # Voodoo::CommonCodeGenerator), and writes the generated code.
10 # An example of its usage can be found on the main page for the
13 class Error < Voodoo::Error
22 @errors.each {|e| msg << e.message << "\n"}
27 # Initializes a compiler.
30 # [parser] the parser to be used (see Voodoo::Parser)
31 # [code_generator] the code generator to be used
32 # (see Voodoo::CommonCodeGenerator)
33 # [output] an IO object. The generated code will be written to it
34 def initialize parser, code_generator, output
36 @generator = code_generator
40 # Performs the compilation.
46 statement = @parser.parse_top_level
48 break if statement == nil
49 next if statement.empty?
53 section = statement[1]
55 @generator.add section, statement
58 rescue CodeGenerator::Error => e
61 rescue Parser::MultipleErrors => e
62 errors.concat e.errors
64 rescue Parser::ParseError => e
68 if errors.length >= 100
69 # Too many errors, give up.
70 raise Error.new(errors)
74 undefined_symbols = @generator.undefined_symbols
75 unless undefined_symbols.empty?
76 msg = "The following symbols are used, but have not been defined" +
77 " or imported:\n" + undefined_symbols.to_a.sort!.join(" ")
78 errors << RuntimeError.new(msg)
82 @generator.write @output
84 raise Error.new(errors)