robolson-simplesem 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,117 +1,118 @@
1
- grammar SimpleSem
2
- include Arithmetic
3
-
4
- rule statement
5
- set_stmt / jump_stmt / jumpt_stmt / halt
6
- end
7
-
8
- rule halt
9
- 'halt' {
10
- def execute(env={})
11
- raise ProgramHalt
12
- end
13
- }
14
- end
15
-
16
- rule set_stmt
17
- set_stmt_assign / set_stmt_write / set_stmt_read
18
- end
1
+ module SimpleSem
2
+ grammar SimpleSem
3
+ include Arithmetic
4
+
5
+ rule statement
6
+ set_stmt / jump_stmt / jumpt_stmt / halt
7
+ end
19
8
 
20
- rule set_stmt_assign
21
- 'set' space loc:additive comma value:additive {
22
- def execute(env)
23
- evaled_loc = loc.eval(env)
24
- evaled_value = value.eval(env)
25
- if env.data[evaled_loc].nil?
26
- env.data[evaled_loc] = Array[evaled_value]
27
- else
28
- env.data[evaled_loc] << evaled_value
9
+ rule halt
10
+ 'halt' {
11
+ def execute(env={})
12
+ raise ProgramHalt
29
13
  end
30
- end
31
- }
32
- end
33
-
34
- rule set_stmt_write
35
- 'set' space 'write' comma expression {
36
- def execute(env)
37
- puts expression.eval(env)
38
- end
39
- }
40
- /
41
- 'set' space 'write' comma '"' string:(!'"' . )* '"' {
42
- def execute(env)
43
- puts string.text_value
44
- end
45
- }
46
- end
47
-
48
- rule set_stmt_read
49
- 'set' space loc:additive comma 'read' {
50
- def execute(env)
51
- print "input: "
52
-
53
- evaled_loc = loc.eval(env)
54
- input_value = $stdin.gets.strip.to_i
55
-
56
- if env.data[evaled_loc].nil?
57
- env.data[evaled_loc] = Array[input_value]
58
- else
59
- env.data[evaled_loc] << input_value
14
+ }
15
+ end
16
+
17
+ rule set_stmt
18
+ set_stmt_assign / set_stmt_write / set_stmt_read
19
+ end
20
+
21
+ rule set_stmt_assign
22
+ 'set' space loc:additive comma value:additive {
23
+ def execute(env)
24
+ evaled_loc = loc.eval(env)
25
+ evaled_value = value.eval(env)
26
+ if env.data[evaled_loc].nil?
27
+ env.data[evaled_loc] = Array[evaled_value]
28
+ else
29
+ env.data[evaled_loc] << evaled_value
30
+ end
60
31
  end
61
- end
62
- }
63
- end
64
-
65
- rule jump_stmt
66
- 'jump' space loc:additive {
67
- def execute(env)
68
- env.pc = loc.eval(env)
69
- end
70
- }
71
- end
72
-
73
- rule jumpt_stmt
74
- 'jumpt' space loc:additive comma expression {
75
- def execute(env)
76
- if expression.eval(env)
32
+ }
33
+ end
34
+
35
+ rule set_stmt_write
36
+ 'set' space 'write' comma expression {
37
+ def execute(env)
38
+ puts expression.eval(env)
39
+ end
40
+ }
41
+ /
42
+ 'set' space 'write' comma '"' string:(!'"' . )* '"' {
43
+ def execute(env)
44
+ puts string.text_value
45
+ end
46
+ }
47
+ end
48
+
49
+ rule set_stmt_read
50
+ 'set' space loc:additive comma 'read' {
51
+ def execute(env)
52
+ print "input: "
53
+
54
+ evaled_loc = loc.eval(env)
55
+ input_value = $stdin.gets.strip.to_i
56
+
57
+ if env.data[evaled_loc].nil?
58
+ env.data[evaled_loc] = Array[input_value]
59
+ else
60
+ env.data[evaled_loc] << input_value
61
+ end
62
+ end
63
+ }
64
+ end
65
+
66
+ rule jump_stmt
67
+ 'jump' space loc:additive {
68
+ def execute(env)
77
69
  env.pc = loc.eval(env)
78
70
  end
79
- end
80
- }
81
- end
82
-
83
- rule primary
84
- ip
85
- /
86
- data_lookup
87
- /
88
- number
89
- /
90
- '(' space expression space ')' {
91
- def eval(env={})
92
- expression.eval(env)
93
- end
94
- }
95
- end
96
-
97
- rule data_lookup
98
- 'D[' expr:additive ']' {
99
- def eval(env)
100
- env.data[expr.eval(env)].last
101
- end
102
- }
103
- end
104
-
105
- rule ip
106
- 'ip' {
107
- def eval(env)
108
- env.pc
109
- end
110
- }
111
- end
112
-
113
- rule comma
114
- space ',' space
71
+ }
72
+ end
73
+
74
+ rule jumpt_stmt
75
+ 'jumpt' space loc:additive comma expression {
76
+ def execute(env)
77
+ if expression.eval(env)
78
+ env.pc = loc.eval(env)
79
+ end
80
+ end
81
+ }
82
+ end
83
+
84
+ rule primary
85
+ ip
86
+ /
87
+ data_lookup
88
+ /
89
+ number
90
+ /
91
+ '(' space expression space ')' {
92
+ def eval(env={})
93
+ expression.eval(env)
94
+ end
95
+ }
96
+ end
97
+
98
+ rule data_lookup
99
+ 'D[' expr:additive ']' {
100
+ def eval(env)
101
+ env.data[expr.eval(env)].last
102
+ end
103
+ }
104
+ end
105
+
106
+ rule ip
107
+ 'ip' {
108
+ def eval(env)
109
+ env.pc
110
+ end
111
+ }
112
+ end
113
+
114
+ rule comma
115
+ space ',' space
116
+ end
115
117
  end
116
-
117
- end
118
+ end
@@ -1,57 +1,59 @@
1
- require 'rubygems'
2
1
  require 'treetop'
2
+ require 'simplesem/arithmetic_node_classes'
3
3
  dir = File.dirname(__FILE__)
4
- require File.expand_path("#{dir}/arithmetic_node_classes")
5
- Treetop.load File.expand_path("#{dir}/arithmetic")
6
- Treetop.load File.expand_path("#{dir}/simple_sem")
4
+ Treetop.load File.expand_path(File.join(dir, 'arithmetic'))
5
+ Treetop.load File.expand_path(File.join(dir, 'simple_sem'))
7
6
 
8
- class ProgramHalt < Exception
9
- end
7
+ module SimpleSem
8
+
9
+ class ProgramHalt < Exception
10
+ end
11
+
12
+ class Program
13
+ attr_reader :code
14
+ attr_accessor :data, :pc
10
15
 
11
- class SimpleSemProgram
12
- attr_reader :code
13
- attr_accessor :data, :pc
14
-
15
- # Create a SimpleSemProgram instance
16
- # Params:
17
- # (String)filepath: path to SimpleSem source file.
18
- # Optional because it's useful to use in tests without needing to load a file
19
- def initialize filepath=nil
20
- @code = Array.new
21
- if filepath
22
- IO.foreach(filepath) do |line|
23
- @code << line.split("//", 2)[0].strip # seperate the comment from the code
16
+ # Create a SimpleSemProgram instance
17
+ # Params:
18
+ # (String)filepath: path to SimpleSem source file.
19
+ # Optional because it's useful to use in tests without needing to load a file
20
+ def initialize filepath=nil
21
+ @code = Array.new
22
+ if filepath
23
+ IO.foreach(filepath) do |line|
24
+ @code << line.split("//", 2)[0].strip # seperate the comment from the code
25
+ end
24
26
  end
27
+
28
+ @data = Array.new
29
+ @pc = 0
25
30
  end
26
-
27
- @data = Array.new
28
- @pc = 0
29
- end
30
-
31
- def run
32
- @parser = SimpleSemParser.new
33
-
34
- @pc = 0
35
- loop do
36
- instruction = @code[@pc] # fetch
37
- @pc += 1 # increment
38
- begin
39
- @parser.parse(instruction).execute(self) # decode and execute
40
- rescue ProgramHalt
41
- break
31
+
32
+ def run
33
+ @parser = SimpleSemParser.new
34
+
35
+ @pc = 0
36
+ loop do
37
+ instruction = @code[@pc] # fetch
38
+ @pc += 1 # increment
39
+ begin
40
+ @parser.parse(instruction).execute(self) # decode and execute
41
+ rescue ProgramHalt
42
+ break
43
+ end
42
44
  end
43
45
  end
46
+
47
+ def inspect_data
48
+ res = String.new
49
+ @data.each_with_index {|loc, i| res += "#{i}: #{loc.last}\n" }
50
+ res
51
+ end
52
+
53
+ def inspect_data_with_history
54
+ res = String.new
55
+ @data.each_with_index {|loc, i| res += "#{i}: #{loc.inspect}\n" }
56
+ res
57
+ end
44
58
  end
45
-
46
- def inspect_data
47
- res = String.new
48
- @data.each_with_index {|loc, i| res += "#{i}: #{loc.last}\n" }
49
- res
50
- end
51
-
52
- def inspect_data_with_history
53
- res = String.new
54
- @data.each_with_index {|loc, i| res += "#{i}: #{loc.inspect}\n" }
55
- res
56
- end
57
- end
59
+ end
@@ -0,0 +1,5 @@
1
+ module SimpleSem
2
+ unless defined? SimpleSem::VERSION
3
+ VERSION = '0.1.4'
4
+ end
5
+ end
data/lib/simplesem.rb CHANGED
@@ -1,2 +1,2 @@
1
- dir = File.dirname(__FILE__)
2
- require "#{dir}/simplesem/simplesem_program"
1
+ require 'simplesem/version'
2
+ require 'simplesem/simplesem_program'