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