Class: MixCompiler

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby/compiler.rb

Overview

Copyright © 2011-2012 Jesse Sielaff

Instance Method Summary collapse

Constructor Details

#initializeMixCompiler

Returns a new instance of MixCompiler.



7
8
9
10
11
12
# File 'lib/ruby/compiler.rb', line 7

def initialize
  @precompiler = MixPrecompiler.new
  @tokenizer = MixTokenizer.new
  @parser = MixParser.new
  @translator = MixTranslator.new
end

Instance Method Details

#basename(filename) ⇒ Object



14
15
16
# File 'lib/ruby/compiler.rb', line 14

def basename (filename)
  filename.match(/(.*?)(\.mix$|$)/)[1]
end

#combine_strings(js_string, ast_string, symbol_string) ⇒ Object



18
19
20
21
22
# File 'lib/ruby/compiler.rb', line 18

def combine_strings (js_string, ast_string, symbol_string)
  js_string
    .sub(%%'...Replace with AST nodes...'%, ast_string)
    .sub(%%'...Replace with symbol table...'%, symbol_string)
end

#compile(filename) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
# File 'lib/ruby/compiler.rb', line 24

def compile (filename)
  mix_files, js_string = precompile_js(filename)
  mix_tokens = tokenize_mix_files(mix_files)
  mix_node = parse_token_stream(mix_tokens)
  ast_string, symbol_string = translate_to_js(mix_node)
  js_output_string = combine_strings(js_string, ast_string, symbol_string)
  write_js_file(filename, js_output_string)
  
rescue SyntaxError => e
  write_js_file("window.onload = function () { if (console && console.log) console.log(\"SyntaxError: #{e.message}\"); };")
end

#parse_token_stream(mix_tokens) ⇒ Object



36
37
38
# File 'lib/ruby/compiler.rb', line 36

def parse_token_stream (mix_tokens)
  @parser.parse(mix_tokens)
end

#precompile_js(filename) ⇒ Object



40
41
42
43
# File 'lib/ruby/compiler.rb', line 40

def precompile_js (filename)
  mix_filename = basename(filename) + '.mix'
  @precompiler.precompile(mix_filename)
end

#tokenize_mix_files(mix_files) ⇒ Object



45
46
47
48
49
# File 'lib/ruby/compiler.rb', line 45

def tokenize_mix_files (mix_files)
  mix_files.each_with_object([]) do |(filename, script), tokens|
    @tokenizer.tokenize(filename, script, tokens)
  end
end

#translate_to_js(node) ⇒ Object



51
52
53
# File 'lib/ruby/compiler.rb', line 51

def translate_to_js (node)
  @translator.translate(node)
end

#write_js_file(filename, js_output_string) ⇒ Object



55
56
57
58
59
# File 'lib/ruby/compiler.rb', line 55

def write_js_file (filename, js_output_string)
  js_filename = basename(filename) + '.js'
  File.open(js_filename,'w') {|f| f.write(js_output_string) }
  puts "Writing to #{js_filename}"
end