p-lang 0.0.3 → 0.0.4
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.
- data/Rakefile +1 -1
- data/VERSION.yml +1 -1
- data/bin/p-lang +9 -6
- data/bin/teste.p +5 -0
- data/lib/p-lang.rb +1 -0
- data/lib/vm/environment.rb +3 -3
- data/lib/vm/perror.rb +8 -0
- data/lib/vm/proc.rb +9 -5
- data/lib/vm/vm.rb +18 -4
- data/test/test_vm_programs.txt +1 -0
- data/test/test_vm_results.txt +1 -0
- metadata +9 -6
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ begin
|
|
10
10
|
gem.email = "igorbonadio@gmail.com"
|
11
11
|
gem.homepage = "http://github.com/igorbonadio/p-lang"
|
12
12
|
gem.authors = ["Igor Bonadio"]
|
13
|
-
gem.
|
13
|
+
gem.add_dependency "treetop", ">= 0"
|
14
14
|
gem.add_development_dependency "shoulda", ">= 0"
|
15
15
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
16
16
|
end
|
data/VERSION.yml
CHANGED
data/bin/p-lang
CHANGED
@@ -5,9 +5,12 @@ require File.join(File.expand_path(File.dirname(__FILE__)), '/../lib/p-lang')
|
|
5
5
|
if ARGV[0]
|
6
6
|
@parser = PLangParser.new
|
7
7
|
|
8
|
-
ast = @parser.parse(File.readlines(ARGV[0]).join(""))
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
ast = @parser.parse(File.readlines(ARGV[0]).join(""))
|
9
|
+
|
10
|
+
if ast
|
11
|
+
vm = PLang::VM.new(ast.build.collect(&:to_sexp))
|
12
|
+
vm.execute!
|
13
|
+
else
|
14
|
+
puts @parser.failure_reason
|
15
|
+
end
|
16
|
+
end
|
data/lib/p-lang.rb
CHANGED
@@ -12,6 +12,7 @@ require File.join(ROOT_PATH, '/vm/environment')
|
|
12
12
|
require File.join(ROOT_PATH, '/vm/vm')
|
13
13
|
require File.join(ROOT_PATH, '/vm/proc')
|
14
14
|
require File.join(ROOT_PATH, '/vm/pobject')
|
15
|
+
require File.join(ROOT_PATH, '/vm/perror')
|
15
16
|
|
16
17
|
require File.join(ROOT_PATH, '/vm/std/io')
|
17
18
|
|
data/lib/vm/environment.rb
CHANGED
@@ -12,7 +12,7 @@ module PLang
|
|
12
12
|
unless @vars[id]
|
13
13
|
@vars[id] = value
|
14
14
|
else
|
15
|
-
|
15
|
+
PError.raise_error(:BindVariableError, "variable '#{id}'")
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -23,7 +23,7 @@ module PLang
|
|
23
23
|
elsif @parent
|
24
24
|
return @parent.get_var(id)
|
25
25
|
else
|
26
|
-
|
26
|
+
PError.raise_error(:NameError, "undefined variable '#{id}'")
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -44,7 +44,7 @@ module PLang
|
|
44
44
|
end
|
45
45
|
return lamb
|
46
46
|
rescue
|
47
|
-
|
47
|
+
PError.raise_error(:ObjectCallError, "undefined message #{object} -> #{msg}")
|
48
48
|
end
|
49
49
|
end
|
50
50
|
end
|
data/lib/vm/perror.rb
ADDED
data/lib/vm/proc.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
class Proc
|
2
|
-
|
3
|
-
@form = form
|
4
|
-
end
|
2
|
+
attr_accessor :form
|
5
3
|
|
6
4
|
def compare_form(form, obj)
|
7
5
|
if(form)
|
@@ -37,8 +35,14 @@ class Proc
|
|
37
35
|
def call?(params)
|
38
36
|
if @form.length == params.length
|
39
37
|
params.each_with_index do |param, i|
|
40
|
-
unless
|
41
|
-
|
38
|
+
unless param.class == Array
|
39
|
+
unless compare_form(@form[i], param.form)
|
40
|
+
return false
|
41
|
+
end
|
42
|
+
else
|
43
|
+
if @form[i]
|
44
|
+
return false
|
45
|
+
end
|
42
46
|
end
|
43
47
|
end
|
44
48
|
return true
|
data/lib/vm/vm.rb
CHANGED
@@ -85,12 +85,12 @@ module PLang
|
|
85
85
|
add_object_var(param, value.params[i], env)
|
86
86
|
else
|
87
87
|
unless execute(param, env) == value.params[i]
|
88
|
-
|
88
|
+
PError.raise_error(:ObjectPatternError, "in object '#{obj[1]}'")
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
92
92
|
else
|
93
|
-
|
93
|
+
PError.raise_error(:ObjectTypeError, "'#{obj[1]}' expected but was '#{value.type}'")
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
@@ -137,12 +137,26 @@ module PLang
|
|
137
137
|
params.each do |param|
|
138
138
|
values << execute(param, env)
|
139
139
|
end
|
140
|
-
execute(id, env)
|
140
|
+
lamb = execute(id, env)
|
141
|
+
lamb.each do |lambda|
|
141
142
|
if lambda.call?(values)
|
142
143
|
return lambda.call(values)
|
143
144
|
end
|
144
145
|
end
|
145
|
-
|
146
|
+
# CallFunctionError
|
147
|
+
str_value = "("
|
148
|
+
values.each do |v|
|
149
|
+
str_value += "#{v.to_s}" + ","
|
150
|
+
end
|
151
|
+
if str_value[-1] == ","
|
152
|
+
str_value[-1] = ")"
|
153
|
+
else
|
154
|
+
str_value += ")"
|
155
|
+
end
|
156
|
+
if id[0] == :object_call
|
157
|
+
id = id[2]
|
158
|
+
end
|
159
|
+
PError.raise_error(:CallFunctionError, "in function '#{id[1]}': no pattern matches with #{id[1]}#{str_value}")
|
146
160
|
end
|
147
161
|
|
148
162
|
def execute_id(id, env)
|
data/test/test_vm_programs.txt
CHANGED
data/test/test_vm_results.txt
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: p-lang
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Igor Bonadio
|
@@ -15,8 +15,8 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-07-
|
19
|
-
default_executable:
|
18
|
+
date: 2010-07-08 00:00:00 -03:00
|
19
|
+
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: treetop
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
segments:
|
31
31
|
- 0
|
32
32
|
version: "0"
|
33
|
-
type: :
|
33
|
+
type: :runtime
|
34
34
|
version_requirements: *id001
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: shoulda
|
@@ -50,6 +50,7 @@ description: P is a small ('pequena' in portuguese) functional programming langu
|
|
50
50
|
email: igorbonadio@gmail.com
|
51
51
|
executables:
|
52
52
|
- p-lang
|
53
|
+
- teste.p
|
53
54
|
extensions: []
|
54
55
|
|
55
56
|
extra_rdoc_files:
|
@@ -68,6 +69,7 @@ files:
|
|
68
69
|
- lib/parser/nodes.rb
|
69
70
|
- lib/parser/p-lang.treetop
|
70
71
|
- lib/vm/environment.rb
|
72
|
+
- lib/vm/perror.rb
|
71
73
|
- lib/vm/pobject.rb
|
72
74
|
- lib/vm/proc.rb
|
73
75
|
- lib/vm/std/io.rb
|
@@ -79,6 +81,7 @@ files:
|
|
79
81
|
- test/test_vm.rb
|
80
82
|
- test/test_vm_programs.txt
|
81
83
|
- test/test_vm_results.txt
|
84
|
+
- bin/teste.p
|
82
85
|
has_rdoc: true
|
83
86
|
homepage: http://github.com/igorbonadio/p-lang
|
84
87
|
licenses: []
|