copied list code from risc instructions

This commit is contained in:
Torsten Ruger 2017-09-08 13:10:22 +03:00
parent 9189e56e77
commit 985dc9904d
4 changed files with 62 additions and 5 deletions

2
lib/common.rb Normal file
View File

@ -0,0 +1,2 @@
require_relative "common/list"
require_relative "common/statements"

55
lib/common/list.rb Normal file
View File

@ -0,0 +1,55 @@
module Common
module List
# set the next instruction (also aliased as <<)
# throw an error if that is set, use insert for that use case
# return the instruction, so chaining works as one wants (not backwards)
def set_next nekst
raise "Next already set #{@next}" if @next
@next = nekst
nekst
end
alias :<< :set_next
# during translation we replace one by one
def replace_next nekst
old = @next
@next = nekst
@next.append old.next if old
end
# get the next instruction (without arg given )
# when given an interger, advance along the line that many time and return.
def next( amount = 1)
(amount == 1) ? @next : @next.next(amount-1)
end
# set the give instruction as the next, while moving any existing
# instruction along to the given ones's next.
# ie insert into the linked list that the instructions form
def insert instruction
instruction.set_next @next
@next = instruction
end
# return last set instruction. ie follow the linked list until it stops
def last
code = self
code = code.next while( code.next )
return code
end
# set next for the last (see last)
# so append the given code to the linked list at the end
def append code
last.set_next code
end
def length labels = []
ret = 1
ret += self.next.length( labels ) if self.next
ret
end
end
end

View File

@ -2,21 +2,21 @@ module Mom
# Base class for MOM instructions # Base class for MOM instructions
class Instruction class Instruction
attr :next_instruction include Common::List
# implement flatten as noop to avoid condition # implement flatten as noop to avoid condition
def flatten def flatten( options = {} )
return self
end end
end end
# A label with a name # A label with a name
class Label class Label < Instruction
attr_reader :name attr_reader :name
def initialize(name) def initialize(name)
@name = name @name = name
end end
end end
end end
require_relative "simple_call" require_relative "simple_call"

View File

@ -14,6 +14,6 @@ require "risc"
require "risc/builtin/space" require "risc/builtin/space"
require "arm/arm_machine" require "arm/arm_machine"
require "arm/translator" require "arm/translator"
require "common/statements" require "common"
require "vool" require "vool"
require "mom" require "mom"