Class: Rucc::Engine
- Inherits:
-
Object
- Object
- Rucc::Engine
- Defined in:
- lib/rucc/engine.rb
Instance Method Summary collapse
- #gen ⇒ Object
-
#initialize(argv, input = nil) ⇒ Engine
constructor
When io is specified, io is used as input source.
-
#lex ⇒ Object
NOTE: Used only for debug.
- #parse ⇒ Object
- #run! ⇒ Object
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.
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
#gen ⇒ Object
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 |
#lex ⇒ Object
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 |
#parse ⇒ Object
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 |