Module: HackAssembler::Assembler

Defined in:
lib/hack_assembler/assembler.rb

Class Method Summary collapse

Class Method Details

.process_symbols(source_code, symbol_table) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/hack_assembler/assembler.rb', line 29

def self.process_symbols(source_code, symbol_table)
  processed_code = ''
  source_code.each_line do |line|
    clean_line = line.strip

    match = /@([^0-9].*)/.match(clean_line)
    if match
      symbol = match[1]

      address = symbol_table.get_address(symbol)
      line = "@#{address}\n"
    end

    processed_code << line
  end

  processed_code
end

.scan_and_remove_labels(source_code, symbol_table) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/hack_assembler/assembler.rb', line 3

def self.scan_and_remove_labels(source_code, symbol_table)
  machine_code_line_number = 0
  label_less_code = ''
  source_code.each_line do |line|
    if is_empty_line?(line) || is_comment_line?(line)
      label_less_code << line
      next
    end

    clean_line = line.strip

    match = /\((.*)\)/.match(clean_line)
    if match
      label = match[1]

      symbol_table.add_label_address(label, machine_code_line_number)
      label_less_code << "\n"
    else
      machine_code_line_number += 1
      label_less_code << line
    end
  end

  label_less_code
end

.translate(source_code) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/hack_assembler/assembler.rb', line 48

def self.translate(source_code)
  machine_code = ''

  source_code.each_line do |line|
    next if is_empty_line?(line) || is_comment_line?(line)

    clean_line = line.strip

    instruction = clean_line.start_with?('@') ? AInstruction : CInstruction

    machine_code << instruction.translate(clean_line) << "\n"
  end

  machine_code
end