module Generator
Constants
- BinaryOps
- UnaryOps
- Vars
Public Class Methods
generate(token)
click to toggle source
# File lib/special-giggle/generator.rb, line 110 def self.generate(token) array = Array.new token.child.each do |statement| array << generate_statement(statement) end output = %{ .section .data __print_fmt: .string "%ld\\n" .section .text .globl main main: pushq %rbp movq %rsp, %rbp subq <VARIABLE>, %rsp <CODE> movq %rbp, %rsp popq %rbp movq $0, %rax retq } text = "" array.flatten.each { |ops| ops.to_code.each { |line| text += " " * 2 + line + "\n" } } Vars.length.times do |i| regex = "(?<![\\w])#{Vars[i]}(?![\\w])" text.gsub!(/#{regex}/, i > 0 ? "#{8*i}(%rsp)" : "(%rsp)") end output.gsub('<VARIABLE>', "$#{Vars.length * 8}").gsub('<CODE>', text) end
generate_expression(token)
click to toggle source
# File lib/special-giggle/generator.rb, line 73 def self.generate_expression(token) if token.type == :Number t = var_temp [t, [Token.new(:Move, token.child[0], t)]] elsif token.type == :Variable [token.child[0], []] elsif token.type == :Bracket var, array = generate_expression(token.child[0]) t = var_temp [t, [array, Token.new(:Move, var, t)]] elsif UnaryOps.include?(token.type) var, array = generate_expression(token.child[0]) t = var_temp [t, [array, Token.new(token.type, var, t)]] else var1, array1 = generate_expression(token.child[0]) var2, array2 = generate_expression(token.child[1]) t = var_temp [t, [array1, array2, Token.new(token.type, [var1, var2], t)]] end end
generate_statement(token)
click to toggle source
# File lib/special-giggle/generator.rb, line 95 def self.generate_statement(token) array = Array.new if token.type == :Print var, garray = generate_expression(token.child[0]) array << garray unless garray.empty? array << Token.new(:Print, var) elsif token.type == :Move Vars << token.child[0].child[0] unless Vars.include?(token.child[0].child[0]) var, garray = generate_expression(token.child[1]) array << garray unless garray.empty? array << Token.new(:Move, var, token.child[0].child[0]) end array end
var_temp()
click to toggle source
# File lib/special-giggle/generator.rb, line 66 def self.var_temp #var = "#{8 * Vars.length}(%rsp)" var = "tmp_#{Vars.length}" Vars << var unless Vars.include?(var) var end