Class: MixCompiler
- Inherits:
-
Object
- Object
- MixCompiler
- Defined in:
- lib/ruby/compiler.rb
Overview
Copyright © 2011-2012 Jesse Sielaff
Instance Method Summary collapse
- #basename(filename) ⇒ Object
- #combine_strings(js_string, ast_string, symbol_string) ⇒ Object
- #compile(filename) ⇒ Object
-
#initialize ⇒ MixCompiler
constructor
A new instance of MixCompiler.
- #parse_token_stream(mix_tokens) ⇒ Object
- #precompile_js(filename) ⇒ Object
- #tokenize_mix_files(mix_files) ⇒ Object
- #translate_to_js(node) ⇒ Object
- #write_js_file(filename, js_output_string) ⇒ Object
Constructor Details
#initialize ⇒ MixCompiler
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.}\"); };") 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 |