rips 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
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