Module: HackAssembler::Assembler
- Defined in:
- lib/hack_assembler/assembler.rb
Class Method Summary collapse
- .process_symbols(source_code, symbol_table) ⇒ Object
- .scan_and_remove_labels(source_code, symbol_table) ⇒ Object
- .translate(source_code) ⇒ Object
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 |