Class: Rucc::Engine

Inherits:
Object
  • Object
show all
Defined in:
lib/rucc/engine.rb

Instance Method Summary collapse

Constructor Details

#initialize(argv, input = nil) ⇒ Engine

When io is specified, io is used as input source. When io is not specified, ARGV is considered as sourcde file.

Parameters:

  • argv (<String>)
  • input (IO, NilClass) (defaults to: nil)


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/rucc/engine.rb', line 13

def initialize(argv, input = nil)
  @option = Option.new
  @option.parse!(argv)

  if input
    @filename = "-"
  else
    @filename = argv.first
    input = File.open(@filename)
  end

  # Setup lexer
  @lexer = Lexer.new(input, @filename)

  # Setup parser
  label_gen = LabelGen.new
  @parser = Parser.new(@lexer, label_gen)
  @lexer.expr_reader = -> { @parser.read_expr }

  # Setup gen
  @out = StringIO.new
  @gen = Gen.new(@out, label_gen)

  init_environment!
end

Instance Method Details

#genObject



52
53
54
55
56
57
58
# File 'lib/rucc/engine.rb', line 52

def gen
  parse.each do |toplevel_ast|
    @gen.emit_toplevel(toplevel_ast)
  end
  @out.rewind
  @out.read
end

#lexObject

NOTE: Used only for debug



40
41
42
43
44
45
46
# File 'lib/rucc/engine.rb', line 40

def lex
  r = []
  while (tok = @lexer.lex).kind != T::EOF
    r.push(tok)
  end
  r
end

#parseObject



48
49
50
# File 'lib/rucc/engine.rb', line 48

def parse
  @parser.read_toplevels
end

#run!Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/rucc/engine.rb', line 60

def run!
  asm = gen

  if @option.dumpasm
    File.write(outfile('s'), asm)
    return
  end

  File.write(tmpfile('s'), asm)
  assemble!(src: tmpfile('s'), dst: tmpfile('o'))

  if @option.dontlink
    FileUtils.copy(tmpfile('o'), outfile('o'))
    return
  end

  link!(src: tmpfile('o'), dst: (@option.outfile || "a.out"))
end