rips 0.0.6 → 0.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2e4896a53632a2c27fb558be1aff1d7d8091771b
4
- data.tar.gz: 7024219596467dca132f8fb4c2dfe283e32d4a7e
3
+ metadata.gz: 0ba8ac0a5eaa357455a6e03c2a68780872c13e52
4
+ data.tar.gz: dadbb4848036104eccb883594f6ebc55242e2f8e
5
5
  SHA512:
6
- metadata.gz: 82e18c0c6144ee40e2d1cbbfbad0fd6d53c28c46e1714faf8ba896c0a4e1bade33d5c451a614ee9ff65abaca04e8677e70dfcd8c4d27df2bc155747ac5571db6
7
- data.tar.gz: 6d05c42a402851adbffbfb36c94914cf1148399064bf5379f1160f1fc3e767c2944372eee1580d69c63a38c7e0abf554e9d0aa53b425e61565f903ab31f7a8e2
6
+ metadata.gz: bea3e6aa10a9688867818db06eb00cd1ea57259c1346fe3784ebcf1f7c3eb639db7b8e14556b8ee0cf3c05574aab69187fd9a8fb7d1e08c7825c6c3b4f991dbb
7
+ data.tar.gz: 4df51297c08a6e4460327b78aeab6856e619a0f773baf6e5b7e8ad95d1b9d716bcd167fb5389fbab79995fefc16300d54cc4e73e2111ffe9ee330ea6398638ae
@@ -2,9 +2,27 @@
2
2
  # Example #
3
3
  #***************#
4
4
 
5
- # Output in: progfile.dat
5
+ # Output in progfile.dat
6
6
 
7
- li $1, 12 # Load 12 in Register 1
8
- li $2, -5 # Load -5 in Register 2
7
+ main:
9
8
 
10
- add $3, $1, $2 # Reg3 = Reg1 + Reg2
9
+ li $14, 2
10
+ li $15, 1
11
+ li $1, 0
12
+ li $2, 0
13
+
14
+ ajal:
15
+
16
+ jal adder
17
+ j increment
18
+
19
+ adder:
20
+
21
+ add $3, $1, $2 # Reg3 = Reg1 + Reg2
22
+ jr
23
+
24
+ increment:
25
+
26
+ add $1, $1, $14
27
+ sub $2, $2, $15
28
+ j ajal # Repeat process
@@ -8,6 +8,8 @@ module Rips
8
8
  # @output: array with coded instructions
9
9
  # @cmd: line split on tokens (name + arguments)
10
10
  # @instruction: instruction instance
11
+ # @instructions: array with line for each instruction
12
+ # @labels: name and number line of label
11
13
  # @line: number of file's line
12
14
  def initialize (debug)
13
15
  @debug = debug
@@ -15,7 +17,37 @@ module Rips
15
17
  @output = []
16
18
  @cmd = {}
17
19
  @instruction
18
- @line = 1
20
+ @instructions = []
21
+ @labels = {}
22
+ @line = 1
23
+ end
24
+
25
+ # Store labels and number line
26
+ def find_labels
27
+
28
+ @input.each_with_index do |line, i|
29
+ if !line.empty?
30
+ label = line.scan(/\w+:/)
31
+ if (label.size == 1)
32
+
33
+ if !@labels.include?(label[0].to_s.split(":").first)
34
+ @labels[label[0].to_s.split(":").first] = [*@instructions.each_with_index].bsearch{|x, _| x >= i}.last
35
+ else
36
+ Error::message(7, i+1, label[0].to_s.split(":").first)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ # Store number line for each instruction
44
+ def find_instructions
45
+
46
+ @input.each_with_index do |line,i|
47
+ if (!line.empty?) && (line.scan(/\w+:/).empty?) && (line[0] != "#")
48
+ @instructions << i+1
49
+ end
50
+ end
19
51
  end
20
52
 
21
53
  # Stores each new line of file
@@ -26,10 +58,24 @@ module Rips
26
58
  # Analyze and translate each instruction
27
59
  def run
28
60
 
61
+ find_instructions
62
+ find_labels
63
+
64
+ puts "instructions...."
65
+ @instructions.each do |k|
66
+ puts "#{k}"
67
+ end
68
+
69
+ puts "labels...."
70
+ @labels.each do |k,v|
71
+ puts "#{k}:#{v}"
72
+ end
73
+
29
74
  @input.each do |line|
30
75
 
31
76
  # If line is empty -> next line
32
- if !line.empty?
77
+ # Or if not is a label
78
+ if (!line.empty?) && (line.scan(/\w+:/).empty?)
33
79
 
34
80
  parse_input(line)
35
81
  @instruction = nil
@@ -39,6 +85,8 @@ module Rips
39
85
 
40
86
  exists_instruction
41
87
  @instruction = get_instruction
88
+
89
+ parse_label
42
90
 
43
91
  argument_size
44
92
  argument_syntax
@@ -85,14 +133,30 @@ module Rips
85
133
  @cmd[:comments] = line
86
134
  else
87
135
  @cmd[:name] = line.split("#").first.split(" ").first.downcase
88
- @cmd[:arguments] = line.split("#").first.split(@cmd[:name])
136
+ @cmd[:arguments] = line.split("#").first.split("#{@cmd[:name]} ")
89
137
  if !@cmd[:arguments].empty?
90
138
  @cmd[:arguments] = @cmd[:arguments].pop.split("#").first.delete(" ").split(",")
91
139
  end
140
+ if @cmd[:arguments].first == "jr" ||
141
+ @cmd[:arguments].first == "nop"
142
+ @cmd[:arguments] = []
143
+ end
92
144
  @cmd[:comments] = line.split("#").slice(1..-1).join
93
145
  @cmd[:comments].insert(0,"#") if !@cmd[:comments].empty?
94
146
  end
147
+ end
95
148
 
149
+ # Translate label's name to instruction's number
150
+ def parse_label
151
+ if (@instruction.is_a? Rips::Instructions::Bez) ||
152
+ (@instruction.is_a? Rips::Instructions::Bnez) ||
153
+ (@instruction.is_a? Rips::Instructions::J) ||
154
+ (@instruction.is_a? Rips::Instructions::Jal)
155
+
156
+ puts @cmd[:arguments]
157
+ @cmd[:arguments] = [@labels[@cmd[:arguments].first].to_s]
158
+ puts "Salto a: #{@cmd[:arguments]}"
159
+ end
96
160
  end
97
161
 
98
162
  # Obtain instruction's instance object
@@ -8,7 +8,9 @@ module Rips
8
8
  "RIPS ERROR (3). Permission denied to read file.",
9
9
  "RIPS ERROR (4). In line %d: doesn't exist `%s` instruction in Instruction Set.",
10
10
  "RIPS ERROR (5). In line %d: for `%s` instruction wrong number of arguments (%d for %d).",
11
- "RIPS ERROR (6). In line %d: syntax error, %s." ]
11
+ "RIPS ERROR (6). In line %d: syntax error, %s.",
12
+ "RIPS ERROR (7). In line %d: There is already a label called `%s`.",
13
+ "RIPS ERROR (8). In line %d: Unknown syntax for label `%s` (try `labelname:`)." ]
12
14
 
13
15
  def self.message (num, *args)
14
16
  puts MESSAGES[num] % args
@@ -12,24 +12,20 @@ module Rips
12
12
  def initialize(size = 10)
13
13
  super(size)
14
14
  @range = [0, 2**@length-1]
15
- @syntax = "#{@range[0]}..{@range[1]}"
15
+ @syntax = "#{@range[0]}..#{@range[1]} | label"
16
16
  end
17
17
 
18
18
  # Check input variable syntax
19
19
  def syntax? (value)
20
20
 
21
- if !number?(value)
22
- return false
23
- end
24
-
25
- # It should be between syntax range
26
- if !between?(value, @range)
27
- return false
21
+ if (number?(value)) && (between?(value, @range))
22
+ true
23
+ elsif value.is_a?(String)
24
+ true
28
25
  else
29
- return true
30
- end
26
+ false
27
+ end
31
28
  end
32
-
33
29
  end
34
30
  end
35
31
  end
@@ -12,22 +12,18 @@ module Rips
12
12
  def initialize(size = 8)
13
13
  super(size)
14
14
  @range = [-2**(@length-1), 2**(@length-1)-1]
15
- @syntax = "#{@range[0]}..{@range[1]}"
15
+ @syntax = "#{@range[0]}..#{@range[1]}"
16
16
  end
17
17
 
18
18
  # Check input variable syntax
19
19
  def syntax? (value)
20
20
 
21
- if !number?(value)
22
- return false
23
- end
24
-
25
21
  # It should be between syntax range
26
- if !between?(value, @range)
27
- return false
22
+ if number?(value) && between?(value, @range)
23
+ true
28
24
  else
29
- return true
30
- end
25
+ false
26
+ end
31
27
  end
32
28
 
33
29
  end
@@ -13,22 +13,18 @@ module Rips
13
13
  super(size)
14
14
  @syntax = "@0-3"
15
15
  @range = [0, 2**@length-1]
16
- @syntax = "@#{@range[0]}-{@range[1]}"
16
+ @syntax = "@#{@range[0]}-#{@range[1]}"
17
17
  end
18
18
 
19
19
  # Check input variable syntax
20
20
  def syntax? (value)
21
21
 
22
- if !port?(value)
23
- return false
24
- end
25
-
26
22
  # It should be between syntax range
27
- if !between?(value, @range)
28
- return false
23
+ if port?(value) && between?(value, @range)
24
+ true
29
25
  else
30
- return true
31
- end
26
+ false
27
+ end
32
28
  end
33
29
 
34
30
  end
@@ -12,22 +12,18 @@ module Rips
12
12
  def initialize(size = 4)
13
13
  super(size)
14
14
  @range = [0, 2**@length-1]
15
- @syntax = "$#{@range[0]}-{@range[1]}"
15
+ @syntax = "$#{@range[0]}-#{@range[1]}"
16
16
  end
17
17
 
18
18
  # Check input variable syntax
19
19
  def syntax? (value)
20
20
 
21
- if !register?(value)
22
- return false
23
- end
24
-
25
21
  # It should be between syntax range
26
- if !between?(value, @range)
27
- return false
22
+ if register?(value) && between?(value, @range)
23
+ true
28
24
  else
29
- return true
30
- end
25
+ false
26
+ end
31
27
  end
32
28
 
33
29
  end
@@ -1,3 +1,3 @@
1
1
  module Rips
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rips
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 0.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Madh93
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-08 00:00:00.000000000 Z
11
+ date: 2015-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler